DES加密算法编程实现

课程上比较好玩的实验,分享出来给大家一起学习~

DES加密算法编程实现

华南理工大学 软件学院 陈春华 (博士)

实验目的

      通过使用DES 算法对实验数据进行加密和解密,掌握现代分组密码算法基本原理,熟练掌握DES 算法各部件的运算原理和具体运算过程。

实验原理

      现在密码算法可分为对称密码(Symmetric Cryptology)和非对称密码(Asymmetric Cryptology);其区分依据主要是所采用的密钥间的关系。在对称密码中,加密密钥和解密密钥是完全相同的,或彼此之间容易互相推导。在非对称密码算法,或称为公钥密码(Public Key Cryptology)中,加密密钥和解密密钥是不同的,从加密密钥推导出解密密钥在计算上是不可行的(Computationally infeasible)。
        根据对明文的处理方式不同,密码算法又可分为流密码(Stream Cipher)和分组密码(Block Cipher)。一次只对明文中的单个比特(有时对字节)运算的密码称为流密码。对明文的一组比特进行运算,这些比特组称为分组(如64位比特为一组),相应的密码称为分组密码。
      1973 年,美国国家标准局(NBS)开始征集一种标准的数据加密标准算法(DES),以用于非机密性政府机构、商业部门和民间的对非机密的敏感数据进行加密。IBM 公司在1971年完成的LUCIFER 密码(64 比特分组,128 比特密钥)的基础上,改进成为建议的DES。改进后的DES算法仅使用56比特密钥,同时对S盒的修改被列入官方机密,曾广受批评。1975 年3 月17 日,NBS 公布了这个算法,并说明要以它作为联邦信息处理标准,征求各方意见。1977 年1 月15 日,建议被批准为联邦标准—FIPSPUB 46,并设计推出了DES 芯片。1981 年,ANSI 将DES 作为标准,即DEA[ANSI X3.92]。1983 年,ISO 采用DES 作为标准,即DEA-1。DES(Data Encryption Standard)是一个优秀的对称分组密码算法,直到2000 年10 月2 日NIST 宣布AES 算法前,其一直是业界的标准。

DES加密:

      图1表明了DES加密的整个机制。对任意加密方案,总有两个输入:明文和密钥。DES的明文长为64位,密钥长为56位。
      从图1的左半部分,可见明文的处理经过三个阶段。首先,64位的明文经过初始置换(而重新排列。然后进行16轮相同函数的作用(又称迭代 ),每轮都进行置换和替代的操作。这16轮迭代操作可以视为一个函数,其输入包括64位明文和16个轮密钥(图1中的K1等,详细见下文),其输出为64位比特流(即为最后一轮迭代输出)。该输出左半部分(左32位)和右半部分(右32位)互换(即图中32位互换)产生预输出。最后该预输出再通过一个初始置换()互逆的置换(,又称逆初始置换 )的作用产生64位的密文。
      图1的右半部分给出了使用56位密钥的过程。密钥经过初始置换(即图中置换选择1)后,经过循环左移和置换(即图中 置换选择2 )分别得到子密钥用于每轮的迭代(又称轮密钥 )。每轮的置换函数(置换选择2)都一样,但是由于密钥的循环位移使得轮密钥互不相同。

初始置换:

      表1和表2给分别定义了初始置换和逆初始置换,其解释如下。表的输入标记为1到64,共64位。置换表中64个元素代表从1到64这些数的一个置换。置换表中的每一个元素表明了某个输入位在64位输出中的位置。
         

每轮变换的详细过程:

        图2给出了一轮变换的内部结构。我们同样先看看图的左半部分。64位中间数据的左右两部分分作独立的32位数据,分别记为L(左)和R(右)。在任何古典Feistel密码中,每轮变换的整个过程可以写成如下的公式:

        
        

        子密钥长48位。R为32位。首先将R用表3定义的置换(E)扩展为48位(见表3扩充置换),其中16位是重复的。输出的48位与异或,再用一个代换函数(即S盒)作用产生32位的输出,再用表4定义的置换(P)进行作用后输出。


      图3解释了S盒在函数F中的作用。代换函数有8个S盒来组成(见下列表),每个S盒都输入6位,输出4位。这些变换参见表5,其中解释如下: 盒输入的第一位和最后一位组成一个2位的二进制数来选择 盒4行(编号0~3)代换值中的一行,中间4位用来选择16列(编号0~15)中的一列。行列交叉处的十进制数转换为二进制后可得到输出的4位二进制数。例如,在 中,如输入位011001,则行是1(01),列是12(1100),该处的值是9,所以输出为1001。注意,S盒的每一行都定义了一个普通的可逆代换。








密钥产生:

      回顾图1和图2中,我们看到算法输入了64位的密钥,但是DES算法仅使用其中的56位。密钥各个比特分别标记为1到64,选取如表6中的无阴影部分,也就是每行的第8个比特位被忽略。对选取的56位密钥,首先进行置换选择1(表7)操作,所得到的56位密钥分为前后两个28位密钥数据。每轮迭代中,分别循环左移 一位或两位,参加表8。移位后的值,通过置换选择2(表9)操作,产生一个48位的轮密钥作为函的输入。



DES解密:

Feistel密码的解密算法和加密算法是相同的,只是轮密钥的使用次序相反。

Python实现链接:https://github.com/kingboung/web-security/tree/master/DES
雪崩效应:

雪崩效应就是一种不稳定的平衡状态也是加密算法的一种特征,它指明文或密钥的少量变化会引起密文的很大变化,就像雪崩前,山上看上去很平静,但是只要有一点问题,就会造成一片大崩溃。实验证明DES算法是具备该性质的。可以通过以下几组数据进行测试。
使用同一密钥,对两组明文进行加密和解密———
64位密钥:
00000010 10010110 01001000 11000100 00111000 00110000 00111000 01100100

64位明文块1:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

64位明文块2(与明文块1仅有一位的不同):
10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

输出两个密文块的二进制流,统计两个密文块间不同数据位的数量。


对同一段明文,使用不同密钥进行加密和解密操作。
64位密钥1:
11100010 11110110 11011110 00110000 00111010 00001000 01100010 11011100

64位密钥2(与密钥1仅有一位的不同):
01100010 11110110 11011110 00110000 00111010 00001000 01100010 11011100

明文:
01101000 10000101 00101111 01111010 00010011 01110110 11101011 10100100

输出两个密文块的二进制流,统计两个密文块间不同数据位的数量。

参考文献:

[1] 《密码编码学与网络安全》 William Stallings(著),孟庆树等(译),电子工业出版社。


转载请告知!!博主个人博客:http://www.kingboung.me
文章有不完善的地方,请留言告知!My lord

  • 6
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值