移动充值卡密加密技术毕业论文
移动充值卡密加密技术
作者姓名:栾学文 专业班级:2008050103 指导老师:李勇
摘 要
随着信息社会的到来,人们在享受信息资源所带来的巨大的利益的同时,也面临着信息安
全的严峻考验。信息安全已经成为世界性的现实问题,信息安全问题已威胁到国家的政治、
经济、军事、文化、意识形态等领域,同时,信息安全问题也是人们能否护自己的个人隐私
的关键。信息安全是社会稳定安全的必要前提条件。
关键词:解密 加密 DES 移动充值卡密 信息安全
I
Mobile phone card dense encryption
technology
Abstract: With the advent of the information society, people in the enjoyment of information resources brought about tremendous benefits, but also faced with a letter Income security, a severe test. Information security has become a worldwide reality, information security has been a threat to the country?s political .Governance, economic, military, cultural, ideological and other areas at the same time, the issue of information security is also a possibility of retaining their own personal Privacy key. Information security and social stability is a necessary precondition for security.
Based on various software and algorithm research, Useing VC++ implement DES encryption
algorithm to encrypt mobile recharge card. Mobile recharge card in the form of a document is encrypted, the information will not be easily stolen, ensures the security of information
Keywords: Decode, Encode, DES,Mobile recharge information,Information Security
II
目 录
第1章 前 言................................................................................................................ 1
第2章 需求分析.......................................................................................................... 2
2.1 系统概述 ............................................................................................................ 2
2.1.1概述.............................................................................................................. 2
2.2密码学的发展 ..................................................................................................... 2
2.3 文件加密解密中密码体制研究 ........................................................................ 6
2.3.1密码原理...................................................................................................... 6
2.3.2密码体制...................................................................................................... 7
第3章 分组加密解密算法-DES算法....................................................................... 10
3.1 DES算法简介 .................................................................................................. 10
3.2 DES加密过程详解 .......................................................................................... 10
第4章 DES算法的C++实现...................................................................................... 19
4.1 DES加密中所使用的函数............................................................................. 19
4.2 DES实现文件加密函数及其代码................................................................. 19
第5章 DES加密算法实例......................................................................................... 21
5.1 实例程序 文件加密程序 .............................................................................. 21
结 论............................................................................................................................ 23
致 谢............................................................................................................................ 24
参考文献...................................................................................................................... 25
附 录............................................................................................................................ 26
III
成都理工大学2012届本科毕业设计(论文)
第1章 前 言
信息安全是一个综合性的交叉学科领域,广泛涉及数学、密码学、计算机、通信、控制、人工智能、安全工程、人文科学等诸多学科,是近几年迅速发展的一个热点学科领域。信息对抗和网络安全是信息安全的核心热点,它的研究和发展又将刺激、推动和促进相关学科的研究与发展。至今,密码技术是取得信息安全性最有效的一种方法, 密码技术是信息安全的核心技术[1]。
通过数据加密,人们可以有效地保证通信线路上的内容不被泄露,而且还可以检验传送信息的完整性。进一步,密码技术可以应用于数字签名、身份认证和信息鉴定,这些应用对于资源存取控制以及其它安全措施是必须而且有效的。信息安全产品从应用类型上可以分为防火墙类产品、防病毒类产品、防攻击类产品、密码类产品、认证类产品和访问控制类产品。相对于防病毒软件和防火墙软件来说,基于密码技术密码类产品、认证类产品份额相对较小,但随着金融、电信、政府等行业信息化建设对于网络安全整体解决
需求的增加,将会有较大的增长。
在本次毕业设计中,使用典型的加密算法-DES对移动充值卡密进行加密,从而达到防止别人盗用此卡密的目的。
1
成都理工大学2012届本科毕业设计(论文)
2.1 系统概述 第2章 需求分析
移动通信充值卡加密系统是针对移动通信后付费业务而提出的一种便利而又安全的解决方案。然而这种加密系统又由几部分决定其安全性:一是加密算法的安全性,即加密技术。二是密钥的管理。
2.1.1概述
在现代社会中,信息处理和通信技术日益发展,保护信息的安全,特别是保护重要信息的安全,越来越成受到国内外有关研究人员的极大重视。当前由于信息的保护不利和失误,世界各国遭受的损失是巨大的。现在,国际互联网上的各站点,几乎都有各种各样的安全措施,例如防火墙(FireWall)、网络加密、加密狗等。但是,这些都是系统或网站层次的安全设施。对于广大用户来说,更为直接、也更为有效的办法,就是使用信息加密技术。加密技术是一门实用的技术,有着悠久的历史。过去,加密技术仅被军事和谋报人员以及某些大型商业企业所采用,应用范围十分有限。加密学也是一门与数学有关的深奥的科学,有能力研究加密学的人为数不多。恐怕这也是它鲜为人知、较少应用的原因。信息安全的内容主要包括五个部分:信息的保密性、信息的完整性、信息的可用性、信息的可控性、信息的不可否认性。
密码技术是保证信息安全的核心。
2.2密码学的发展
密码学的发展历程大致经历了四个阶段:古代加密方法、古典密码、近代密码以及当代加密。
1.古代加密方法(手工阶段)
源于应用的无穷需求总是推动技术发明和进步的直接动力。存于石刻或史书中的记载
明,许多古代文明,包括埃及人、希伯来人、亚述人都在实践中逐步发明了密码系统。从某种意义上说,战争是科学技术进步的催化剂。人类自从有了战争,就面临着通信安全的需求,密码技术源远流长。
2
成都理工大学2012届本科毕业设计(论文)
古代加密方法大约起源于公元前440年出现在古希腊战争中的隐写术。当时为了安全传送军事情报,奴隶主剃光奴隶的头发,将情报写在奴隶的光头上,待头发长长后将奴隶送到另一个部落,再次剃光头发,原有的信息复现出来,从而实现这两个部落之间的秘密通信。
公元前400年,斯巴达人就发明了“塞塔式密码”,即把长条纸螺旋形地斜绕在一个多棱棒上,将文字沿棒的水平方向从左到右书写,写一个字旋转一下,写完一行再另起一行从左到右写,直到写完。解下来后,纸条上的文字消息杂乱无章、无法理解,这就是密文,但将它绕在另一个同等尺寸的棒子上后,就能看到原始的消息。这是最早的密码技术。
我国古代也早有以藏头诗、藏尾诗、漏格诗及绘画等形式,将要表达的真正意思或“密语”隐藏在诗文或画卷中特定位置的记载,一般人只注意诗或画的表面意境,而不会去注意或很难发现隐藏其中的“话外之音”。
比如:我画蓝江水悠悠,爱晚亭枫叶愁。秋月溶溶照佛寺,香烟袅袅绕轻楼. 传输密文的发明地是古希腊,一个叫Aeneas Tacticus的希腊人在《论要塞的防护》一书中对此做了最早的论述。公元前2世纪,一个叫Polybius的希腊人设计了一种将字母编码成符号对的方法,他使用了一个称为Polybius的校验表,这个表中包含许多后来在加密系统中非常常见的成分,如代替与换位。Polybius校验表由一个5′5的网格组成(如表1-1所示),网格中包含26个英文字母,其中I和J在同一格中。每一个字母被转换成两个数字,第一个是字母所在的行数,第二个是字母所在的列数。如字母A就对应着11,字母B就对应着12,以此类推。使用这种密码可以将明文“message”置换为密文“32 15 43 43 11 22 15”。在古代,这种棋盘密码被广泛使用。
2.古典密码(机械阶段)
古典密码的加密方法一般是文字置换,使用手工或机械变换的方式实现。古典密码系统已经初步体现出近代密码系统的雏形,它比古代加密方法复杂,其变化较小。古典密码的代表密码体制主要有:单表代替密码、多表代替密码及转轮密码。
Caesar密码及其改进方法
公元前60年(大约两千年前),古罗马统帅“朱利叶斯?凯撒”(Caesar),第一个用当
3
成都理工大学2012届本科毕业设计(论文)
时发明的“凯撒密码”书写军事文书,用于战时通信。后来他成了古罗马帝王,就是“凯撒”(Caesar)大帝。
A.替换加密法
凯撒加密法是替换方法中的一个特例,消息中每一个字母换成向后三个字母的字母的。学
习并演示此算法的加密与解密过程的。
1:A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
3个字母:
2:D E F G H I J K L M N O P
Q R S T U V W X Y Z A B C
4个字母:
3:E F G H I J K L M N O P Q
R S T U V W X Y Z A B C D
明文:SHE IS A STUDENT
密文:VKH LV D VWXGHQW
算法:Caesar凯撒加密法
密钥:Key 3(25个密钥)
B.单码加密法
凯撒加密法的改进就是采用单码加密法,消息中每一个字母换成26个字母中的任何一个字
母(除了本身不算之外)。比如:A==>B-Z B==>A,C-Z C==>A,B,D-Z。不过,还得满
足这个单码是一个一一对应关系才行的。经过了这种单码加密之后,26个字母的任何转换与
组合,就可以得到(26x25x24x23...x2)==>4x(10的26次方)种的可能性的。此算法的加密
与解密的讲解的。
C.栅栏加密技术一
明文:Come home tomorrow
算法:C m h m t m r o
o e o e o o r w
密文:Cmhmtmrooeoeoorw
解密: C m h m t m r o
o e o e o o r w
4
成都理工大学2012届本科毕业设计(论文)
明文: Come home tomorrow
D.栅栏加密技术二
将明文信息一行一行地写入预定长度的矩形中的。假设矩形为6列. 明文:Come home
tomorrow
算法:第一列 第二列 第三列 第四列 第五列 第六列
C o m e h o
m e t o m o
r r o w
密文:cmr oer mto eowhmoo
解密: 16/6==>2-3
c o m e h o
m e t o m o
r r o w
明文: come home tomorrow
E.栅栏加密技术的变形之简单分栏式变换加密技术,将栅栏加密技术二中的顺序读取方法
变成随机读取。
将明文信息一行一行地写入预定长度的矩形中的。假设矩形为6列. 明文:Come home tomorrow
算法:第一列 第二列 第三列 第四列 第五列 第六列
C o m e h o
m e t o m o
r r o w
密钥:123456(顺序读取方式)
密文:cmr oer mto eow hm oo
密钥:461253(随机顺序读取方式)
密文:eow oo cmr oer hm mto
F:解密这种单码加密法(Caesar)变换及简单分栏式变换
一般采用语言中的语句的使用频度来破解的.
3.近代密码(计算机阶段)
5
成都理工大学2012届本科毕业设计(论文)
密码形成一门新的学科是在20世纪70年代,这是受计算机科学蓬勃发展刺激和推动的结果。快速电子计算机和现代数学方法一方面为加密技术提供了新的概念和工具,另一方面也给破译者提供了有力武器。计算机和电子学时代的到来给密码设计者带来了前所未有的自由,他们可以轻易地摆脱原先用铅笔和纸进行手工设计时易犯的错误,也不用再面对用电子机械方式实现的密码机的高额费用。总之,利用电子计算机可以设计出更为复杂的密码系统。
1.常见的对称加密算法:
DES、IDEA、RC系列(RC2,RC4,RC5)、CAST和Blowfish.
2.常见的非对称加密算法:
RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。 而非对称密码与对称密码比较,非对称加密运算速度比对称加密要慢数千倍。并且其算法也较复杂,所以
4.当代密码
由于技术发展,当代加密技术更加先进,更加难以破解。当代加密系统除了加强以前的经典加密算法外,已经研究出图像加密以及生物加密。已经广泛使用的就是一维码和二维码。生物加密是指根据指纹以及瞳孔等人体生物特征对重要文件或者其他重要东西进行加密。
2.3 文件加密解密中密码体制研究
就整体而言,计算机中的加密问题应包括文件存储加密、口令存储加密、数据库数据加密、电子邮件加密等信息加密和数据传输加密(信道加密)以及密码体制、密钥管理中心等三个方面的 变成“明文”。密码机可看做是一个用电子元件实现一种复杂数学运算的机器。复杂数学运算可记为,这里C=密文,p=明文,
6
成都理工大学2012届本科毕业设计(论文)
k=密钥,f是密码算法。K是自变量,C是因变量。不同的K有不同的C,对于某个密码算法f,K的选择范围越大,C的变化就越多,这个密码算法被人破译的难度就越大,保密强度就越高。如何评价K的选择范围大小呢,一般是看K的位数,位数长的(如128位以上)选择范围大,位数短的(如56位)选择范围小。一个国家的密码政策,通常是用位数长的高强度密码(位数可达)保护国家秘密,其它用于保护商业秘密。
在数据传输加密过程中,收发双方线路密码机使用的是相同的密码算法,注入了相同的密钥,发方向收方发出明文,经密码机变成密文后送上公网通信线路,到达收方后先经密码机解密再送到收方电脑上。密文在公用通信网上传输时,如果被截收,窃密方收到的是不可懂的乱码,无法窃取信息内容。
在文件存储加密中,加密解密卡加解密采用同一种算法和同一个密钥,工作人员用电脑处理文件后先将文件加密再存入磁盘,以防窃密者盗用磁盘窃取文件。工作人员调用该文件时,文件先经解密再从显示器上显示出来以供使用。
2.3.2密码体制
密码体制:密码体制也叫密码系统,是指能完整地解决信息安全中的机密性、数据完整性、认证、身份识别、可控性及不可抵赖性等问题中的一个或几个的一个系统。对一个密码体制的正确描述,需要用数学方法清楚地描述其中的各种对象、参数、解决问题所使用的算法等。
密码体制又分为私用密钥加密技术(对称加密)和公开密钥加密技术(非对称加密)。
1、对称密码体制
对称密码体制是一种传统密码体制,也称为私钥密码体制。在对称加密系统中,加密和解密采用相同的密钥。因为加解密密钥相同,需要通信的双方必须选择和保存他们共同的密钥,各方必须信任对方不会将密钥泄密出去,这样就可以实现数据的机密性和完整性。对于具有n个用户的网络,需要n(n-1)/2个密钥,在用户群不是很大的情况下,对称加密系统是有效的。但是对于大型网络,当用户群很大,分布很广时,密钥的分配和保存就成了问题。对机密信息进行加密和验证随报文一起发送报文摘要(或散列值)来实现。比较典型的算法有
7
成都理工大学2012届本科毕业设计(论文)
数据加密
)算法及其变形Triple DES(三重DES),GDES(广义DES);欧洲的IDEA;日本的FEAL N、RC5等。DES标准由美国国家标准局提出,主要应用于银行业的电子资金转帐(EFT)领域。DES的密钥长度为56bit。Triple DES使用两个独立的56bit密钥对交换的信息进行3次加密,从而使其有效长度达到112bit。RC2和RC4方法是RSA数据安全公司的对称加密专利算法,它们采用可变密钥长度的算法。通过规定不同的密钥长度,,C2和RC4能够提高或降低安全的程度。对称密码算法的优点是计算开销小,加密速度快,是目前用于信息加密的主要算法。它的局限性在于它存在着通信的贸易双方之间确保密钥安全交换的问题。此外,某一贸易方有几个贸易关系,他就要维护几个专用密钥。它也没法鉴别贸易发起方或贸易最终方,因为贸易的双方的密钥相同。另外,由于对称加密系统仅能用于对数据进行加解密处理,提供数据的机密性,不能用于数字签名。因而人们迫切需要寻找新的密码体制。
2、非对称密码体制
非对称密码体制也叫公钥加密技术,该技术就是针对私钥密码体制的缺陷被
提出来的。在公钥加密系统中,加密和解密是相对独立的,加密和解密会使用两把不同的密钥,加密密钥(公开密钥)向公众公开,谁都可以使用,解密密钥(秘密密钥)只有解密人自己知道,非法使用者根据公开的加密密钥无法推算出解密密钥,顾其可称为公钥密码体制。如果一个人选择并公布了他的公钥,另外任何人都可以用这一公钥来加密传送给那个人的消息。私钥是秘密保存的,只有私钥的所有者才能利用私钥对密文进行解密。公钥密码体制的算法中最著名的代表是RSA系统,此外还有:背包密码、McEliece密码、Diffe_Hellman、Rabin、零知识证明、椭圆曲线、EIGamal算法等。公钥密钥的密钥管理比较简单,并且可以方便的实现数字签名和验证。但算法复杂,加密数据的速率较低。公钥加密系统不存在对称加密系统中密钥的分配和保存问题,对于具有n个用户的网络,仅需要2n个密钥。公钥加密系统
除了用于数据加密外,还可用于数字签名。公钥加密系统可提供以下功能:A、机密性(Confidentiality):保证非授权人员不能非法获取信息,通过数据加密来实现;B、确认(Authentication):保证对方
属于所声称的实体,通过数字签名来实现;C、数据完整性():保证信息内容不被篡改,入侵者不可能用假消息代替合法消息,
8
成都理工大学2012届本科毕业设计(论文)
通过数字签名来实现;D、不可抵赖性(Nonrepudiation):发送者不可能事后否认他发送过消息,消息的接受者可以向中立的第三方证实所指的发送者确实发出了消息,通过数字签名来实现。可见公钥加密系统满足信息安全的所有主要目标。
9
成都理工大学2012届本科毕业设计(论文)
第3章 分组加密解密算法-DES算法
3.1 DES算法简介
DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。其密钥长度为56位,明文按64位进行分组,将分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
DES加密算法特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。
DES工作的基本原理是,其入口参数有三个:key、data、mode。 key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。
DES( Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。虽然56位密钥的DES算法已经风光不在,而且常有用Des加密的明文被破译的报道,但是了解一下昔日美国的标准加密算法总是有益的,而且目前DES算法得到了广泛的应用,在某些场合,仍然发挥着余热。
3.2 DES加密过程详解
3.2.1 DES加密
DES是对二元数字分组加密的分组密码算法,分组长度为64比特。每64位明文加密成64位密文,没有数据压缩和扩展,密钥长度为56比特,若输入64比特,则第8,16,24,32,40,48,56,64为奇偶校验位,所以,实际密钥只有56位。DES算法完全公开,其保密性完全依赖密钥。
它的缺点就在于密钥太短。
10
成都理工大学2012届本科毕业设计(论文)
设明文串m=m1m2,m64;密钥串k=k1k2,k64。
在后面的介绍中可以看到k8,k16,k24,k32,k40,k48,k56,k64实际上是不起作用的。
DES的加密过程可表示为:
DES(m)= IP-1T16?T15,T2?T1?IP(m).
下面是完全16轮DES算法框图:
图3-1 完全16轮DES算法
3.2.2 初始置换IP
初始置换是将输入的64位明文分为8个数组,每一组包括8位,按1至64编号。
IP的置换规则如下表:
11
成都理工大学2012届本科毕业设计(论文)
表3-1 IP置换规则
即将输入的第58位换到第1位,第50位换到第2位,,,依次类推,最后一位是原来的第7位。 3.2.3 IP-1是IP的逆置换表
逆置换规则如下表所示:由于第1位经过初始置换后,已处于第40位。逆置换就是再将第40位换回到第1位。
表3-2 IP-1置换
12
成都理工大学2012届本科毕业设计(论文)
初始置换IP及其逆置换IP-1并没有密码学意义,因为置换前后的一一对应关系是已知的。它们的作用在于打乱原来输入明文的ASC?码字划分的关系,并将原来明文的第位m8,m16,m24,m32,m40,m48,m56,m64位(校验位)变成IP的输出的一个字节。
3.2.4 DES算法的迭代过程
图3-2 DES算法的迭代过程图
图中Li-1和Ri-1分别是第i-1次迭代结果的左右两部分,各32比特。即Li=Ri-1, Ri=Li-1
f(Ri-1,ki)。其中轮密钥Ki为48比特,函数F(R,K)的计算过程如图1.5所示。轮输入的右半部分R为32比特,R首先被扩展成48比特,扩展过程由表3定义,其中将R的16个比特各重复一次。扩展后的48比特再与子密钥Ki异或,然后再通过一个S盒,产生32比特的输出。该输出再经过一个由表4定义的置换,产生的结果即为函数F(R,K)的输出。
13
成都理工大学2012届本科毕业设计(论文)
表3-3 扩展E
ki是由64比特的初始密钥(亦称种子密钥)导出的第i轮子密钥,ki是48比特
DES算法的关键是f(Ri-1,ki)的功能,其中的重点又在S-盒(Substitution Boxes)上。F函数的输出是32比特。
图3-3 F函数计算过程图
14
成都理工大学2012届本科毕业设计(论文)
将R经过一个扩展运算E变为48位,记为E(R)。计算E(R),对B施行代换S,此代换由8个代换盒组成,即S-盒。每个S-盒有6个输入,4个输出,将B依次分为8组,每组6位,记B= B1B2B3B4B5B6B7B8其中Bj作为第j个S-盒的输入,其输出为Cj,C= C1C2C3C4C5C6C7C8就是代换S的输出,所以代换S是一个48位输入,32位输出的选择压缩运算,将结果C再实行一个置换P(表4),即得F(R,K)。
其中,扩展运算E与置换P主要作用是增加算法的扩散效果。S-盒是DES算法中唯一的非线性部件,当然也就是整个算法的安全性所在。它的设计原则与过程一直因为种种不为人知的因素所限,而未被公布出来。
S-盒如下表:
表3-4 S-盒函数
15
成都理工大学2012届本科毕业设计(论文)
S-盒的置换规则为:
取{0,1,,,15}上的4个置换,即它的4个排列排成4行,得一4*16矩阵。若给定该S
盒的6个输入为b0 b1 b2 b3 b4 b5,在Si表中找出b0 b5行,b1b2 b3b4列的元素,以4位二进制表示该元素,此为S-盒Si的输出。
例2.1 S2的输入为101011,
b1 =1,b6=1,b1 b6=(11)2=3 (b2 b3 b4 b5)2=(0101)2=5
查S2表可知第3行第5列的输出是15,15的二进制表示为1111。 则S2的输出为1111。8个S-盒的代换方式都是一样的。
S盒输出的32比特经P置换,P置换的功能是将32位的输入,按以下顺序置换,然后输入仍为32比特。P置换的顺序如表3.5:
表3-5 置换P_PERMUTE[32] 16
成都理工大学2012届本科毕业设计(论文)
3.2.5 子密钥生成
图3-4 DES子密钥生成流程图
图3.4给出了子密钥产生的流程图。首先对初始密钥经过置换PC-1(表3.6[7]),将初始密钥的8个奇偶校验位剔除掉,而留下真正的56比特初始密钥。
表3-6 密钥置换PC_PERMUTE1[56]
然后将此56位分为C0,D0两部分,各28比特,C0,D0如下:
17
成都理工大学2012届本科毕业设计(论文)
C0=k57k49,,k44k36 D0=k63k55,,k12k4
然后分别进行一个循环左移函数LS1,得到C1,D1,将C1(28位),D1(28位)连成56比特数据,再经过密钥置换PC-2(表2.7)做重排动作,从而便得到了密钥K1(48位)。依次类推,便可得到K2,K3,,K16。
表3-7 密钥置换PC_PERMUTE2[48]
其中LS1(1?i?16)表示一个或两个位置的循环左移,当i=1,2,9,16时,移一个位置,当i=3,4,5,6,7,8,10,11,12,13,14,15时,移两个位置。 3.2.6 DES解密过程
DES算法的解密过程跟加密过程是一样的,区别仅仅在于第一次迭代时用密钥k16,第二次k15、,,,最后一次用k1,算法本身没有任何变化。
18
成都理工大学2012届本科毕业设计(论文)
第4章 DES算法的C++实现
4.1
DES加密中所使用的函数
void IP_PM(unsigned int x[2]) ip置换函数
void IP_PM1(unsigned int x[2]) ip 逆置换
void PC1(unsigned int x[2]) 密钥置换 64位到56位 void PC2(unsigned x[2]) 密钥置换 56位到 48位 unsigned int PM(unsigned int x) 32位置换
unsigned int Sbox(unsigned int x[2]) s 盒置换
void Extend(unsigned int x,unsigned int y[2]) 扩展换算
unsigned int LTr(unsigned int x,unsigned int y) 28位密钥 移位 void Ckey(unsigned
int x[2],unsigned int y[16][2]) 密钥生成
void cryption(unsigned int text[2],unsigned int key[16][2],int flag)
unsigned int chtoint(char ch[4])
void inttoch(_int64 temp,char ch[4])
4.2 DES实现文件加密函数及其代码
运用DES算法可以对目标进行加密使其成为密文,下面函数便是对运用算法对文件加密,使得文件 ckey1[1]=ch[1]; ckey1[2]=ch[2];
ckey1[3]=ch[3];
ckey2[0]=ch[4]; ckey2[1]=ch[5]; ckey2[2]=ch[6];
keyn[0]=chtoint(ckey1);
keyn[1]=chtoint(ckey2);
Ckey(keyn,skeyn);
fp=fopen(fname,"rb+");
if(fp==NULL)
19 ckey2[3]=ch[7];
成都理工大学2012届本科毕业设计(论文)
{
return 2;
}
int ftel=fseek(fp,0,2);
ftel=ftell(fp);
ftel=ftel%8;
for(int j=ftel;0<j&&j<=7;j++) {
fputc(„ „,fp);
}
char filetemp[20000];
int filelength=ftell(fp);
rewind(fp);
fread(filetemp,filelength,1,fp); int endflag=0;
for(;endflag+8<=filelength;) {
text1[0]=filetemp[endflag+0];
text1[2]=filetemp[endflag+2]; text2[0]=filetemp[endflag+4];
text2[2]=filetemp[endflag+6];
textn[0]=chtoint(text1); textn[1]=chtoint(text2);
cryption(textn,skeyn,crypflag); inttoch(textn[0],text1); inttoch(textn[1],text2);
filetemp[endflag+0]=text1[0];
filetemp[endflag+2]=text1[2]; filetemp[endflag+4]=text2[0];
filetemp[endflag+6]=text2[2]; endflag+=8;
}
rewind(fp);
fwrite(filetemp,filelength,1,fp); fclose(fp);
return 1;
} text1[1]=filetemp[endflag+1]; text1[3]=filetemp[endflag+3]; text2[1]=filetemp[endflag+5];
text2[3]=filetemp[endflag+7]; filetemp[endflag+1]=text1[1]; filetemp[endflag+3]=text1[3];
filetemp[endflag+5]=text2[1]; filetemp[endflag+7]=text2[3];
20
成都理工大学2012届本科毕业设计(论文)
第5章 DES加密算法实例
5.1 实例程序 文件加密程序
这是文件加密系统 的截图 ,使用编写软件为vc++6.0
图5-1 文件加密程序截图
使用此程序加密文件使其成为无法识别的密文,从而达到对里面内容的保密。
而文件内容就好比移动充值卡的卡号,只有知道密钥的人才能得到真正的卡号,从而达到充值的目的。所以加密成功后密钥的管理也是很重要的一个环节。
21
成都理工大学2012届本科毕业设计(论文)
加密前文件文件加密前
加密后文件文件加密后截图
22
成都理工大学2012届本科毕业设计(论文)
结 论
经过多月的学习,在老师和同学的支持与帮助之下,我顺利地完成了这次论文设计。使我对DES加密算法有了一定的了解,随着Internet的高速发展和应用,其安全越来越引起人们的关注、如何保护企业和个人在网络上的敏感信息不受侵犯己成为当前摆在人们面前的一个重大问题。加密作为一种用来保护用户内部第一道安全屏障,始终受到人们的关注和重视,并成为网络安全产品的首选。
从当初确定题目到最后一个功能模块的完成,经历了无数次的错误、修改代码、运行的过程,感觉到平时学的知识是多么的浅薄,书到用时方恨少,现在是体验的真真切切。本来已经耳熟能详的代码,一到VC中书写,却提笔忘字,这充分的反应了我平时的基本功不扎实,常用代码的不熟练。给我以后的工作敲响了警钟,有了努力的方向。
本次设计是我工作前一次很好的演练和实践的机会,是培养独立思考问题和自学能力的锻炼,使我意识到必须努力的学习才能在工作中体现自己的价值,适应社会的需要。
虽然
23
成都理工大学2012届本科毕业设计(论文)
致 谢
我首先要感谢我的导师李勇老师给予我的帮助与关怀,从他的身上我学到的不仅仅是知识,更多的是做人。李老师严谨治学,为人谦逊,在论文的写作过程中,李老师没有给我任何压力,让我拥有了很大的发挥空间。
一日为师终身为父。在此,我也要向四年来辛勤培养和教育,关心,帮助我的恩师们表示我最诚挚的敬意和感谢~记得李老师说过,对于父母不能用感谢,更多的是愧疚。的确,每每想到我的父母,眼底总是涌动出愧疚的泪水,他们给了我生命、思想和全部的爱,在我近二十年的读书生涯中,他们用自己微薄的力量保护着我,用自己辛勤的劳动支持着我,我无以为报,只能让自己在今后的道路上踏实向上,走好每一步。
同窗的友情同样难忘,砚湖畔、南强灯下,我们一同嬉笑过、拼搏过,这一路与你们同行真好!感谢我所有朋友对我的包容、体谅,谢谢大家
也许永远没有那一天,前程如朝霞般绚烂;也许永远没有那一天,成功如灯火般辉煌;也许只能是这样,攀援却达不到顶峰,也许一路走来,只为今天在我毕业论文的最后, 对所有关心帮助我的人说一声:谢谢……
24
成都理工大学2012届本科毕业设计(论文)
参考文献
[1] 邱志聪 等. 加密解密技能百练丛书[M].北京: 中国铁道出版社,2005
[2] Atul Kahata 等. CRYPTOGRAPHY AND NETWORK SECURITY[M].北京:清
华大学出版社,2009.
[3] Michael Welschenbach等. kryptographie in cund C++
zweite,uberarbeitete und erweiterte Auflage[M]. 电子工业出版社, 2003年.
[4] 徐若智等. 信息安全与密码学[M]. 北京:清华大学出版社,2007年.
[5] K.Campbell , M.Wiener. DES is not a group,Advances in
Cryptology-CRYPTO ’92[M].Lecture Notes in Computer Science 740 Springer-Verlag,1993,
512-520.
[6] 孙淑玲 . 应用密码学[M]. 北京: 清华大学出版社,2004年,
11-19.
[7] 陈刚 等 .移动通信充值卡加密系统的数据安全策略[M]. 北方交通
大学计算机科学技术系 ,北京10004.
[8] 肖国镇 . 密码学现状与展望[J].电子学报.第5期 , 1987.9.
[9] 胡忠旭 等.基于数字串加密算法的研究与实现[J].红河学院学报.第4
期 ,2011.8.
[10] 刘晓真 等 .几种加密算法安全性的概率分析[J]. 河南教育学院学报
( 自然科学版).第4期 ,2004.12.
[11] 卢开橙 等.计算机密码学—计算机网络中的数据保密与安全[M].北
京:清华大学出版社,2003年,38-48.
[12] 赖溪松 等.计算机密码学及其应用[M].北京:国防工业出版社,2007,
43-49.
[13] D.Coppersmith . The Data Encryption Standard (DES) and its
strength against attacks[M]. IBM Journal of Research and
Development, 38(3).243-250.
[14] Richard Spillman著,叶阮健,曹英,张长富译.经典密码学与现代密码
学[M].北京:清华大学出版社,2005,124-133.
[15] Oded Goldreich. Foundations of Cryptography Volume ? Basic
Applications[M].BEIJING:Publishing House of Electronics Industry,2005年,375-379.
25
成都理工大学2012届本科毕业设计(论文)
附 录
DES实现文件加密源程序代码:
#include "stdafx.h"
#include "file_des_mfc.h"
#include"stdio.h"
#include"iostream.h"
#include "math.h"
#include "stdlib.h"
#include "file_des_mfcDoc.h"
#include "file_des_mfcView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CString s;
int sflag=0;
/////////////////////////////////////////////////////////////////////////////
// CFile_des_mfcView
IMPLEMENT_DYNCREATE(CFile_des_mfcView, CFormView)
BEGIN_MESSAGE_MAP(CFile_des_mfcView, CFormView)
//{{AFX_MSG_MAP(CFile_des_mfcView)
ON_BN_CLICKED(IDC_SCAN, OnScan)
ON_BN_CLICKED(IDC_OPEN, OnOpen)
ON_BN_CLICKED(IDC_ENCRYPTION, OnEncryption)
ON_BN_CLICKED(IDC_DECRYPTION, OnDecryption)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
END_MESSAGE_MAP()
26
成都理工大学2012届本科毕业设计(论文)
/////////////////////////////////////////////////////////////////////////////
// CFile_des_mfcView construction/destruction
CFile_des_mfcView::CFile_des_mfcView()
: CFormView(CFile_des_mfcView::IDD)
{
//{{AFX_DATA_INIT(CFile_des_mfcView)
m_FN = _T("");
m_key = _T("");
//}}AFX_DATA_INIT
// TODO: add construction code here
}
CFile_des_mfcView::~CFile_des_mfcView()
{
}
void CFile_des_mfcView::DoDataExchange(CDataExchange* pDX) {
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFile_des_mfcView)
DDX_Text(pDX, IDC_FileName, m_FN);
DDX_Text(pDX, IDC_Key, m_key);
//}}AFX_DATA_MAP
}
BOOL CFile_des_mfcView::PreCreateWindow(CREATESTRUCT& cs) {
// TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs
return CFormView::PreCreateWindow(cs);
}
void CFile_des_mfcView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
}
/////////////////////////////////////////////////////////////////////////////
27
成都理工大学2012届本科毕业设计(论文)
// CFile_des_mfcView printing
BOOL CFile_des_mfcView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CFile_des_mfcView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {
// TODO: add extra initialization before printing
}
void CFile_des_mfcView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {
// TODO: add cleanup after printing
}
void CFile_des_mfcView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
// TODO: add customized printing code here
}
/////////////////////////////////////////////////////////////////////////////
// CFile_des_mfcView diagnostics
#ifdef _DEBUG
void CFile_des_mfcView::AssertValid() const
{
CFormView::AssertValid();
}
void CFile_des_mfcView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CFile_des_mfcDoc* CFile_des_mfcView::GetDocument() // non-debug version is inline {
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFile_des_mfcDoc))); return (CFile_des_mfcDoc*)m_pDocument;
}
#endif //_DEBUG
28
成都理工大学2012届本科毕业设计(论文)
///////////////////////////////////////////////////////////////////////////// // CFile_des_mfcView message handlers
void CFile_des_mfcView::OnScan()
{
// TODO: Add your control notification handler code here UpdateData(TRUE);
CFile fp;
CFileDialog file_dlg(TRUE,"EC","*.*",NULL,"*.*"); if(file_dlg.DoModal()!=IDOK)
return;
s=file_dlg.GetPathName();
m_FN=s;
sflag=1;
UpdateData(FALSE);
}
void CFile_des_mfcView::OnOpen()
{
// TODO: Add your control notification handler code here UpdateData(TRUE);
system(s);
UpdateData(FALSE);
}
/* DES 中的各个子函数 */
char IP_PERMUTE[64]={\
58,50,42,34,26,18,10,2,\
60,52,44,36,28,20,12,4,\
62,54,46,38,30,22,14,6,\
64,56,48,40,32,24,16,8,\
57,49,41,33,25,17,9,1,\
59,51,43,35,27,19,11,3,\
61,53,45,37,29,21,13,5,\
63,55,47,39,31,23,15,7};
char IP_PERMUTE_1[64]={\
40,8,48,16,56,24,64,32,\
39,7,47,15,55,23,63,31,\
38,6,46,14,54,22,62,30,\
37,5,45,13,53,21,61,29,\
36,4,44,12,52,20,60,28,\
35,3,43,11,51,19,59,27,\
29
成都理工大学2012届本科毕业设计(论文)
34,2,42,10,50,18,58,26,\
33,1,41,9,49,17,57,25};
char P_PERMUTE[32]={\
16,7,20,21,\
29,12,28,17,\
1,15,23,26,\
5,18,31,10,\
2,8,24,14,\
32,27,3,9,\
19,13,30,6,\
22,11,4,25};
char S_BOX1[4][16]={\
14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,\ 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,\ 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,\ 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13};
char S_BOX2[4][16]={\
15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,\ 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,\ 0,14,7,11,10,4,12,1,5,8,12,6,9,3,2,15,\ 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9};
char S_BOX3[4][16]={\
10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,\ 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,\ 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,\ 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12,};
char S_BOX4[4][16]={\
7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,\ 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,\ 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,\ 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14};
char S_BOX5[4][16]={\
2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,\ 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,\ 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,\ 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3};
char S_BOX6[4][16]={\
30
成都理工大学2012届本科毕业设计(论文)
12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,\
10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,\
9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,\
4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13};
char S_BOX7[4][16]={\
4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,2,\
13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,\
1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,\
6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12};
char S_BOX8[4][16]={\
13,2,8,4,6,14,11,1,10,9,3,14,5,0,12,7,\
1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,\
7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,\
2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11};
char PC_PERMUTE1[56]={\
57,49,41,33,25,17,9,\
1,58,50,42,34,26,18,\
10,2,59,51,43,35,27,\
19,11,3,60,52,44,36,\
63,55,47,39,31,23,15,\
7,62,54,46,38,30,22,\
14,6,61,53,45,37,29,\
21,13,5,28,20,12,4};
char PC_PERMUTE2[48]={\
14,17,11,24,1,5,\
3,28,15,6,21,10,\
23,19,12,4,26,8,\
16,7,27,20,13,2,\
41,52,31,37,47,55,\
30,40,51,45,33,48,\
44,49,39,56,23,53,\
46,42,50,36,29,32};
char LTranslocation[16]={\
1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
void IP_PM(unsigned int x[2]) ///////////ip置换 {
unsigned temp[2],flag;
temp[1] = x[1];
temp[0] = x[0];
31
成都理工大学2012届本科毕业设计(论文)
x[0] = 0;
x[1] = 0;
for(int i=0;i<64;i++)
{
if(i<32)
{
if(IP_PERMUTE[i]>32)
{
flag=64-IP_PERMUTE[i];
flag=temp[1]>>flag;
flag=flag&0x1;
x[0]= 2*x[0]+ flag;
}
else
{
flag=32-IP_PERMUTE[i];
flag=temp[0]>>flag;
flag= flag&0x1;
x[0]= 2*x[0]+ flag;
}
}
else
{
if(IP_PERMUTE[i]>32)
{
flag=64-IP_PERMUTE[i];
flag=temp[1]>>flag;
flag=flag&0x1;
x[1]= 2*x[1]+ flag;
}
else
{
flag=32-IP_PERMUTE[i];
flag=temp[0]>>flag;
flag= flag&0x1;
x[1]= 2*x[1]+ flag;
}
}
}
}
void IP_PM1(unsigned int x[2]) /////////////ip 逆置换 {
unsigned int temp[2],flag;
32
成都理工大学2012届本科毕业设计(论文)
temp[1] = x[1];
temp[0] = x[0];
x[0] = 0;
x[1] = 0;
for(int i=0;i<64;i++)
{
if(i<32)
{
if(IP_PERMUTE_1[i]>32)
{
flag=64-IP_PERMUTE_1[i];
flag=temp[1]>>flag;
flag=flag&0x1;
x[0]= 2*x[0]+ flag;
}
else
{
flag=32-IP_PERMUTE_1[i];
flag=temp[0]>>flag;
flag= flag&0x1;
x[0]= 2*x[0]+ flag;
}
}
else
{
if(IP_PERMUTE_1[i]>32)
{
flag=64-IP_PERMUTE_1[i];
flag=temp[1]>>flag;
flag=flag&0x1;
x[1]= 2*x[1]+ flag;
}
else
{
flag=32-IP_PERMUTE_1[i];
flag=temp[0]>>flag;
flag= flag&0x1;
x[1]= 2*x[1]+ flag;
}
}
}
}
void PC1(unsigned int x[2]) ////////////// 密钥置换 64位到56位
33
成都理工大学2012届本科毕业设计(论文)
{
} unsigned int temp[2],flag; temp[1] = x[1]; temp[0] = x[0]; x[0] = 0; x[1] = 0; for(int
i=0;i<56;i++) { if(i<28) { if(PC_PERMUTE1[i]>32) { flag=64-PC_PERMUTE1[i]; flag=temp[1]>>flag; flag=flag&0x1;
x[0]= 2*x[0]+ flag; } else { flag=32-PC_PERMUTE1[i]; flag=temp[0]>>flag; flag= flag&0x1; x[0]= 2*x[0]+ flag; } } else
{ if(PC_PERMUTE1[i]>32) { flag=64-PC_PERMUTE1[i]; flag=temp[1]>>flag; flag=flag&0x1; x[1]= 2*x[1]+ flag; } else
{ flag=32-IP_PERMUTE_1[i]; flag=temp[0]>>flag; flag= flag&0x1;
x[1]= 2*x[1]+ flag; } } }
34
成都理工大学2012届本科毕业设计(论文)
void PC2(unsigned x[2]) //////////// 密钥置换 56位到 48位 {
unsigned int temp[2],flag;
temp[1] = x[1];
temp[0] = x[0];
x[0] = 0;
x[1] = 0;
for(int i=0;i<48;i++)
{
if(i<24)
{
if(PC_PERMUTE2[i]>28)
{
flag=56-PC_PERMUTE2[i];
flag=temp[1]>>flag;
flag=flag&0x1;
x[0]= 2*x[0]+ flag;
}
else
{
flag=28-PC_PERMUTE2[i];
flag=temp[0]>>flag;
flag= flag&0x1;
x[0]= 2*x[0]+ flag;
}
}
else
{
if(PC_PERMUTE2[i]>28)
{
flag=56-PC_PERMUTE2[i];
flag=temp[1]>>flag;
flag=flag&0x1;
x[1]= 2*x[1]+ flag;
}
else
{
flag=28-PC_PERMUTE2[i];
flag=temp[0]>>flag;
flag= flag&0x1;
x[1]= 2*x[1]+ flag;
}
35
成都理工大学2012届本科毕业设计(论文)
}
}
}
unsigned int PM(unsigned int x) /////////////32位置换 {
unsigned int temp,flag;
unsigned int i;
temp=x;
x=0;
for(i=0;i<32;i++)
{
flag=temp>>P_PERMUTE[i];
flag=flag&0x1;
x=x*2+flag;
}
return x;
}
unsigned int Sbox(unsigned int x[2]) /////////////////// s 合置换 {
unsigned int ret=0;
unsigned int i,j;
unsigned int temp=0,flag=0;
for(i=0,j=0;i<8;i++)
{
if(i>=4)
j=1;
temp=x[j]>>((3-i%4)*6);
flag=temp&0x3;
temp=temp>>2;
temp=temp&0xf;
switch(i)
{
case 0:temp=S_BOX1[flag][temp];break;
case 1:temp=S_BOX2[flag][temp];break;
case 2:temp=S_BOX3[flag][temp];break;
case 3:temp=S_BOX4[flag][temp];break;
case 4:temp=S_BOX5[flag][temp];break;
case 5:temp=S_BOX6[flag][temp];break;
case 6:temp=S_BOX7[flag][temp];break;
case 7:temp=S_BOX8[flag][temp];break;
}
36
成都理工大学2012届本科毕业设计(论文)
ret=ret<<4;
ret+=temp;
}
return ret;
}
void Extend(unsigned int x,unsigned int y[2]) /////////////扩展换算 {
unsigned int i;
unsigned int temp=0;
y[0]=0;
y[1]=0;
for(i=0;i<8;i++)
{
temp=(x>>(8*(7-i)+7))&0x1;
temp=(temp<<4)+((x>>(8*(7-i)))&0xf);
temp=temp*2+((x>>(8*(7-i)+7))&0x1);
if(i<4)
y[0]=(y[0]<<6)+temp;
else
y[1]=(y[1]<<6)+temp;
}
}
unsigned int LTr(unsigned int x,unsigned int y)
{
unsigned int temp;
unsigned int flag;
flag=LTranslocation[x-1];
temp=y>>(28-flag);
if(flag=1)
temp=temp&0x1;
else
temp=temp&0x3;
y=(y<<flag)+temp;
return y;
}
void Ckey(unsigned int x[2],unsigned int y[16][2])
{
unsigned int i;
PC1(x);
37 ////////////// 28位密钥 移位///////////密钥生成
成都理工大学2012届本科毕业设计(论文)
for(i=0;i<16;i++)
{
x[0]=LTr(i+1,x[0]);
x[1]=LTr(i+1,x[1]);
y[i][0]=x[0];
y[i][1]=x[1];
PC2(y[i]);
}
}
void cryption(unsigned int textxt[1]);
text[1]=text[0] ext[1];
text[0]=temp;
if(flag==0)
{
i++;
if(i==16)
break;
}
else
{
i--;
if(i<0)
break;
}
}
temp=text[1];
text[1]=text[0];
38
成都理工大学2012届本科毕业设计(论文)
text[0]=temp;
}
unsigned int chtoint(char ch[4])
{
unsigned int temp;
unsigned int intt[4];
for(int i=0;i<4;i++)
{
int flag=(ch[i]>>7)&0x1;
if(flag==1)
intt[i]=128+(ch[i]&0x7f);
else
intt[i]=ch[i];
}
temp=256*256*256*intt[0]+256*256*intt[1]+256*intt[2]+intt[3]; return temp;
}
void inttoch(_int64 temp,char ch[4])
{
ch[0]=temp/(256*256*256);
ch[1]=(temp-256*256*256*ch[0])/(256*256);
ch[2]=(temp-256*256*256*ch[0]-256*256*ch[1])/256; ch[3]=temp-256*256*256*ch[0]-256*256*ch[1]-256*ch[2]; }
/* 以下是文件的加解密过程 */
int filecryption(char *fname,char ch[9],int crypflag)
{
FILE *fp;
char ckey1[4]={„\0?,?\0?,?\0?,?\0?},ckey2[4]={„\0?,?\0?,?\0?,?\0?}; unsigned keyn[2];
unsigned skeyn[16][2];
char text1[4],text2[4];
unsigned int textn[2];
ckey1[0]=ch[0]; ckey1[1]=ch[1]; ckey1[2]=ch[2]; ckey2[0]=ch[4];
ckey2[1]=ch[5]; ckey2[2]=ch[6]; keyn[0]=chtoint(ckey1);
keyn[1]=chtoint(ckey2);
Ckey(keyn,skeyn);
fp=fopen(fname,"rb+");
if(fp==NULL)
39 ckey1[3]=ch[3]; ckey2[3]=ch[7];
成都理工大学2012届本科毕业设计(论文)
{
return 2;
}
int ftel=fseek(fp,0,2);
ftel=ftell(fp);
ftel=ftel%8;
for(int j=ftel;0<j&&j<=7;j++)
{
fputc(„ „,fp);
}
char filetemp[20000];
int filelength=ftell(fp);
rewind(fp);
fread(filetemp,filelength,1,fp);
int endflag=0;
for(;endflag+8<=filelength;)
{
text1[0]=filetemp[endflag+0]; text1[1]=filetemp[endflag+1]; text1[2]=filetemp[endflag+2];
text1[3]=filetemp[endflag+3]; text2[0]=filetemp[endflag+4]; text2[1]=filetemp[endflag+5];
text2[2]=filetemp[endflag+6]; text2[3]=filetemp[endflag+7];
textn[0]=chtoint(text1);
textn[1]=chtoint(text2);
cryption(textn,skeyn,crypflag);
inttoch(textn[0],text1);
inttoch(textn[1],text2);
filetemp[endflag+0]=text1[0]; filetemp[endflag+1]=text1[1]; filetemp[endflag+2]=text1[2];
filetemp[endflag+3]=text1[3];
filetemp[endflag+4]=text2[0]; filetemp[endflag+5]=text2[1]; filetemp[endflag+6]=text2[2]; filetemp[endflag+7]=text2[3];
endflag+=8;
}
rewind(fp);
fwrite(filetemp,filelength,1,fp);
fclose(fp);
return 1;
}
40
成都理工大学2012届本科毕业设计(论文)
void CFile_des_mfcView::OnEncryption()
{
// TODO: Add your control notification handler code here UpdateData(TRUE);
char ch_Key[9];
char *fname=(LPSTR)(LPCTSTR) m_FN;
if(fname[0]==„\0?)
{
MessageBox("没有打开文件!!!");
return;
}
int kf=GetDlgItemText(IDC_Key,ch_Key,9);
if(kf<=0)
{
MessageBox("没有密钥!");
return;
}
if(kf<=7)
{
MessageBox("密钥长度过短! 重新输入!!!!"); return;
}
int flag=filecryption(fname,ch_Key,0);
if(flag==1)
MessageBox("加密完成!");
if(flag==2)
MessageBox("没有打开文件!");
UpdateData(FALSE);
}
void CFile_des_mfcView::OnDecryption()
{
// TODO: Add your control notification handler code here UpdateData(TRUE);
char ch_Key[9];
char *fname=(LPSTR)(LPCTSTR) m_FN;
if(fname[0]==„\0?)
{
MessageBox("没有打开文件!!!");
return;
41
成都理工大学2012届本科毕业设计(论文)
}
int kf=GetDlgItemText(IDC_Key,ch_Key,9); if(kf<=0)
{
MessageBox("没有密钥!");
return;
}
if(kf<=7)
{
MessageBox("密钥长度过短! 重新输入!!!!"); return;
}
int flag=filecryption(fname,ch_Key,1);
if(flag==1)
MessageBox("解密完成!");
if(flag==2)
MessageBox("没有打开文件!");
UpdateData(FALSE);
}
42