为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

移动充值卡密加密技术 毕业论文

2017-09-01 50页 doc 190KB 16阅读

用户头像

is_624976

暂无简介

举报
移动充值卡密加密技术 毕业论文移动充值卡密加密技术 毕业论文 移动充值卡密加密技术 摘 要 随着信息社会的到来,人们在享受信息资源所带来的巨大的利益的同时,也面临着信息安全的严峻考验。信息安全已经成为世界性的现实问题,信息安全问题已威胁到国家的政治、经济、军事、文化、意识形态等领域,同时,信息安全问题也是人们能否护自己的个人隐私的关键。信息安全是社会稳定安全的必要前提条件。 本文通过对各种软件和算法的研究,最后采用VC++编写程序,实现了DES加密算法,对移动充值卡密进行加密。将移动充值卡密以文件形式进行加密后,其中信息不会被轻易盗用,保证了信息的...
移动充值卡密加密技术  毕业论文
移动充值卡密加密技术 毕业论文 移动充值卡密加密技术 摘 要 随着信息社会的到来,人们在享受信息资源所带来的巨大的利益的同时,也面临着信息安全的严峻考验。信息安全已经成为世界性的现实问,信息安全问题已威胁到国家的政治、经济、军事、文化、意识形态等领域,同时,信息安全问题也是人们能否护自己的个人隐私的关键。信息安全是社会稳定安全的必要前提条件。 本文通过对各种软件和算法的研究,最后采用VC++编写程序,实现了DES加密算法,对移动充值卡密进行加密。将移动充值卡密以文件形式进行加密后,其中信息不会被轻易盗用,保证了信息的安全性。 关键词:解密 加密 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 参考文献 ................................................................................................................ 24 附 录 ...................................................................................................................... 25 III 第1章 前 言 信息安全是一个综合性的交叉学科领域,广泛涉及数学、密码学、计算机、通信、控制、人工智能、安全工程、人文科学等诸多学科,是近几年迅速发展的一个热点学科领域。信息对抗和网络安全是信息安全的核心热点,它的研究和发展又将刺激、推动和促进相关学科的研究与发展。至今,密码技术是取得信息安 [1]全性最有效的一种方法, 密码技术是信息安全的核心技术。 通过数据加密,人们可以有效地保证通信线路上的内容不被泄露,而且还可以检验传送信息的完整性。进一步,密码技术可以应用于数字签名、身份认证和信息鉴定,这些应用对于资源存取控制以及其它安全措施是必须而且有效的。信息安全产品从应用类型上可以分为防火墙类产品、防病毒类产品、防攻击类产品、密码类产品、认证类产品和访问控制类产品。相对于防病毒软件和防火墙软件来说,基于密码技术密码类产品、认证类产品份额相对较小,但随着金融、电信、政府等行业信息化建设对于网络安全整体解决需求的增加,将会有较大的增长。 在本次毕业设计中,使用典型的加密算法-DES对移动充值卡密进行加密,从而达到防止别人盗用此卡密的目的。 1 第2章 需求分析 2.1 系统概述 移动通信充值卡加密系统是针对移动通信后付费业务而提出的一种便利而又安全的解决方案。然而这种加密系统又由几部分决定其安全性:一是加密算法的安全性,即加密技术。二是密钥的管理。本文主要针对加密算法进行研究。 2.1.1概述 在现代社会中,信息处理和通信技术日益发展,保护信息的安全,特别是保护重要信息的安全,越来越成受到国内外有关研究人员的极大重视。当前由于信息的保护不利和失误,世界各国遭受的损失是巨大的。现在,国际互联网上的各站点,几乎都有各种各样的安全措施,例如防火墙(FireWall)、网络加密、加密狗等。但是,这些都是系统或网站层次的安全设施。对于广大用户来说,更为直接、也更为有效的办法,就是使用信息加密技术。加密技术是一门实用的技术,有着悠久的历史。过去,加密技术仅被军事和谋报人员以及某些大型商业企业所采用,应用范围十分有限。加密学也是一门与数学有关的深奥的科学,有能力研究加密学的人为数不多。恐怕这也是它鲜为人知、较少应用的原因。信息安全的内容主要包括五个部分:信息的保密性、信息的完整性、信息的可用性、信息的可控性、信息的不可否认性。密码技术是保证信息安全的核心。 2.2密码学的发展 密码学的发展历程大致经历了四个阶段:古代加密方法、古典密码、近代密码以及当代加密。 1.古代加密方法(手工阶段) 源于应用的无穷需求总是推动技术发明和进步的直接动力。存于石刻或史书中的记载表明,许多古代文明,包括埃及人、希伯来人、亚述人都在实践中逐步发明了密码系统。从某种意义上说,战争是科学技术进步的催化剂。人类自从有了战争,就面临着通信安全的需求,密码技术源远流长。 2 古代加密方法大约起源于公元前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 时发明的“凯撒密码”书写军事文书,用于战时通信。后来他成了古罗马帝王,就是“凯撒”(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 明文: 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 密码形成一门新的学科是在20世纪70年代,这是受计算机科学蓬勃发展刺激和推动的结果。快速电子计算机和现代数学方法一方面为加密技术提供了新的概念和工具,另一方面也给破译者提供了有力武器。计算机和电子学时代的到来给密码设计者带来了前所未有的自由,他们可以轻易地摆脱原先用铅笔和纸进行手工设计时易犯的错误,也不用再面对用电子机械方式实现的密码机的高额费用。总之,利用电子计算机可以设计出更为复杂的密码系统。 1.常见的对称加密算法: DES、IDEA、RC系列(RC2,RC4,RC5)、CAST和Blowfish. 2.常见的非对称加密算法: RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。 而非对称密码与对称密码比较,非对称加密运算速度比对称加密要慢数千倍。并且其算法也较复杂,所以本文用比较常用的对称加密算法,且对密码学发展史上有着重要作用的DES算法对移动充值卡加密进行探讨。 4.当代密码 由于技术发展,当代加密技术更加先进,更加难以破解。当代加密系统除了加强以前的经典加密算法外,已经研究出图像加密以及生物加密。已经广泛使用的就是一维码和二维码。生物加密是指根据指纹以及瞳孔等人体生物特征对重要文件或者其他重要东西进行加密。 2.3 文件加密解密中密码体制研究 就整体而言,计算机中的加密问题应包括文件存储加密、口令存储加密、数据库数据加密、电子邮件加密等信息加密和数据传输加密(信道加密)以及密码体制、密钥管理中心等三个方面的内容,下面我们通过加密原理和密码体制来概略地讲讲这三个方面的内容: 2.3.1密码原理 (1)密码原理。所谓加密,就是将正常情况下可懂的文件数据输入密码机,由密码机变成不可懂的乱码,即将“明文”变成“密文”;所谓解密,就是上述过程的逆过程,即将“密文” 变成“明文”。密码机可看做是一个用电子元件实现一种复杂数学运算的机器。复杂数学运算可记为,这里C=密文,p=明文, 6 k=密钥,f是密码算法。K是自变量,C是因变量。不同的K有不同的C,对于某个密码算法f,K的选择范围越大,C的变化就越多,这个密码算法被人破译的难度就越大,保密强度就越高。如何K的选择范围大小呢,一般是看K的位数,位数长的(如128位以上)选择范围大,位数短的(如56位)选择范围小。一个国家的密码政策,通常是用位数长的高强度密码(位数可达)保护国家秘密,其它用于保护商业秘密。 在数据传输加密过程中,收发双方线路密码机使用的是相同的密码算法,注入了相同的密钥,发方向收方发出明文,经密码机变成密文后送上公网通信线路,到达收方后先经密码机解密再送到收方电脑上。密文在公用通信网上传输时,如果被截收,窃密方收到的是不可懂的乱码,无法窃取信息内容。 在文件存储加密中,加密解密卡加解密采用同一种算法和同一个密钥,工作人员用电脑处理文件后先将文件加密再存入磁盘,以防窃密者盗用磁盘窃取文件。工作人员调用该文件时,文件先经解密再从显示器上显示出来以供使用。 2.3.2密码体制 密码体制:密码体制也叫密码系统,是指能完整地解决信息安全中的机密性、数据完整性、认证、身份识别、可控性及不可抵赖性等问题中的一个或几个的一个系统。对一个密码体制的正确描述,需要用数学方法清楚地描述其中的各种对象、参数、解决问题所使用的算法等。 密码体制又分为私用密钥加密技术(对称加密)和公开密钥加密技术(非对称加密)。 1、对称密码体制 对称密码体制是一种传统密码体制,也称为私钥密码体制。在对称加密系统中,加密和解密采用相同的密钥。因为加解密密钥相同,需要通信的双方必须选择和保存他们共同的密钥,各方必须信任对方不会将密钥泄密出去,这样就可以实现数据的机密性和完整性。对于具有n个用户的网络,需要n(n-1)/2个密钥,在用户群不是很大的情况下,对称加密系统是有效的。但是对于大型网络,当用户群很大,分布很广时,密钥的分配和保存就成了问题。对机密信息进行加密和验证随报文一起发送报文摘要(或散列值)来实现。比较典型的算法有 7 DES(Data,, Encryption Standard数据加密)算法及其变形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、数据完整性(Data,, integrity):保证信息内容不被篡改,入侵者不可能用假消息代替合法消息, 8 通过数字签名来实现;D、不可抵赖性(Nonrepudiation):发送者不可能事后否认他发送过消息,消息的接受者可以向中立的第三方证实所指的发送者确实发出了消息,通过数字签名来实现。可见公钥加密系统满足信息安全的所有主要目标。 9 第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 设明文串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 表3-1 IP置换规则 5543211 8 0 2 4 6 8 0 2 6543221 0 2 4 6 8 0 2 4 6543321 2 4 6 8 0 2 4 6 6544321 4 6 8 0 2 4 6 8 544321 7 9 1 3 5 7 9 1 5543211 9 1 3 5 7 9 1 3 6543221 1 3 5 7 9 1 3 5 6543321 3 5 7 9 1 3 5 7 即将输入的第58位换到第1位,第50位换到第2位„„,依次类推, 最后一位是原来的第7位。 3.2.3 IP-1是IP的逆置换表 逆置换规则如下表所示:由于第1位经过初始置换后,已处于第40位。 逆置换就是再将第40位换回到第1位。 表3-2 IP-1置换 48 4152630 8 6 6 4 4 2 3 4152639 7 7 5 5 3 3 1 3 4152638 6 6 4 4 2 2 0 3 4152627 5 5 3 3 1 1 9 3 4152626 4 4 2 2 0 0 8 3 4151525 3 3 1 1 9 9 7 3 4151524 2 2 0 0 8 8 6 3 4 41523 1 1 9 9 7 7 5 12 初始置换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 表3-3 扩展E 32 1 2 3 4 5 4 5 6 7 8 9 8 9 10 11 12 13 12 13 14 15 16 17 16 17 18 19 20 21 20 21 22 23 24 25 24 25 26 27 28 29 28 29 30 31 32 1 ki是由64比特的初始密钥(亦称种子密钥)导出的第i轮子密钥,ki 是48比特 DES算法的关键是f(Ri-1,ki)的功能,其中的重点又在S-盒 (Substitution Boxes)上。F函数的输出是32比特。 图3-3 F函数计算过程图 14 ,将R经过一个扩展运算E变为48位,记为E(R)。计算E(R)K=B,对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-盒函数 14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7 S 1 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 15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 10 S 2 3 13 4 7 15 2 8 14 12 0 1 10 6 9 11 5 0 14 7 11 10 4 13 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 10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 8 S 313 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 7 13 14 3 0 6 9 10 1 2 8 5 11 12 4 15 S 413 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 2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 9 S14 11 2 12 4 7 13 1 5 0 15 10 3 9 8 6 5 4 5 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 15 12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 11 S 610 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 4 11 2 14 15 0 8 13 3 12 9 7 5 10 6 1 S 7 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 13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7 S 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 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 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 16 3.2.5 子密钥生成 初始密钥K(64bit) PC-1 C(28bit) D(28bit) 00 LS LS 11 K PC-2 C D 111 LS LS 22 LS LS 1616 PC-2 K C D 161616 图3-4 DES子密钥生成流程图 图3.4给出了子密钥产生的流程图。首先对初始密钥经过置换PC-1(表3.6[7]),将初始密钥的8个奇偶校验位剔除掉,而留下真正的56比特初始密钥。 表3-6 密钥置换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 然后将此56位分为C0,D0两部分,各28比特,C0,D0如下: 17 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] 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 34 53 46 42 50 36 29 32 其中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 第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算法可以对目标进行加密使其成为密文,下面函数便是对运用算法对文件加密,使得文件内容变得不可读取。 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]; ckey1[3]=ch[3]; ckey2[0]=ch[4]; ckey2[1]=ch[5]; ckey2[2]=ch[6]; ckey2[3]=ch[7]; keyn[0]=chtoint(ckey1); keyn[1]=chtoint(ckey2); Ckey(keyn,skeyn); fp=fopen(fname,"rb+"); if(fp==NULL) 19 { return 2; } int ftel=fseek(fp,0,2); ftel=ftell(fp); ftel=ftel%8; for(int j=ftel;0RecalcLayout(); ResizeParentToFit(); } ///////////////////////////////////////////////////////////////////////////// 26 // 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 27 ///////////////////////////////////////////////////////////////////////////// // 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,\ 28 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]={\ 29 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]; 30 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; 31 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位 32 { 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; } } } } 33 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; } 34 } } } 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; } 35 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) ////////////// 28位密钥 移位 { 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<>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]; ckey1[3]=ch[3]; ckey2[0]=ch[4]; ckey2[1]=ch[5]; ckey2[2]=ch[6]; ckey2[3]=ch[7]; keyn[0]=chtoint(ckey1); keyn[1]=chtoint(ckey2); Ckey(keyn,skeyn); fp=fopen(fname,"rb+"); if(fp==NULL) 38 { return 2; } int ftel=fseek(fp,0,2); ftel=ftell(fp); ftel=ftel%8; for(int j=ftel;0
/
本文档为【移动充值卡密加密技术 毕业论文】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索