DES

DES( Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。虽然56位密钥的DES算法已经风光不在,而且常有用Des加密的明文被破译的报道,但是了解一下昔日美国的标准加密算法总是有益的,而且目前DES算法得到了广泛的应用,在某些场合,她仍然发挥着余热^_^.
1.1 密钥生成
1.1.1 取得密钥
从用户处取得一个64位(本文如未特指,均指二进制位))长的密码key ,

去除64位密码中作为奇偶校验位的第8、16、24、32、40、48、56、64位,剩下的56位作为有效输入密钥.
1.1.2 等分密钥
表1. 5749413325179158504234261810259514335271911360504436
表2.
6555473931231576254463830221466153453729211352820124
把在1.1.1步中生成的56位输入密钥分成均等的A,B两部分,每部分为28位,参照表1和表2把输入密钥的位值填入相应的位置. 按照表1所示A的第一位为输入的64位密钥的第57位,A的第2位为64位密钥的第49位,...,依此类推,A的最后一位最后一位是64位密钥的第36位。

1.1.3 密钥移位
表3. i12345678?? 11222222i910111213141516??12222221
DES算法的密钥是经过16次迭代得到一组密钥的,把在1.1.2步中生成的A,B视为迭代的起始密钥,表3显示在第i次迭代时密钥循环左移的位数. 比如在第1次迭代时密钥循环左移1位,第3次迭代时密钥循环左移2位.
第9次迭代时密钥循环左移1位,第14次迭代时密钥循环左移2位.
第一次迭代:
A(1) = ??(1) A
B(1) = ??(1) B
第i次迭代:
A(i) = ??(i) A(i-1)
B(i) = ??(i) B(i-1)
1.1.4 密钥的选取
表4.
1417112415328156211023191242681672720132415231374755304051453348444939563453464250362932
在1.1.3步中第i次迭代生成的两个28位长的密钥为

合并

按照表4所示k的第一位为56位密钥的第14位,k的第2位为56位密钥的第17位,...,依此类推,k的最后一位最后一位是56位密钥的第32位。 生成与进行第i次迭代加密的数据进行按位异或的48位使用密钥:

1.1.5迭代
DES算法密钥生成需要进行16次迭代,在完成16次迭代前,循环执行1.1.3-1.1.4步.
最终形成16套加密密钥:key[0] , key[1] , key[2] ,…. key[14] , key[15] .
1. 2 数据的加密操作
1.2.1 取得数据

把明文数据分成64位的数据块,不够64位的数据块以适当的方式补足。

1.2.2 初始换位
表5. 58504234261810260524436282012462544638302214664564840322416857494133251791595143352719113615345372921135635547393123157按照表5所示把输入的64位数据的原第58位换到第一位,原第50位换到第二位,...,依此类推,最后的得到新的64位数据.
OldData newData

1.2.3 数据扩展
表6.
3212345456789891011121312131415161716171819202120212223242524252627282928293031321第一次迭代以1.2.2步中生成的newData作为输入数据,第i (i > 1)次迭代以第i-1次的64位输出数据为输入数据,把64位数据按位置等分成左右两部分:

保持left不变,根据表6把right由32位扩展成48位

把扩展后的48位right与第i次迭代生成的48位加密密钥进行按位异或操作 形成一个新的48位的right.

1.2.4 数据压缩
表7.1  123456781-80xe0x00x40xf0xd0x70x10x49-160x20xe0xf0x20xb0xd0xb0xe17-240x30xa0xa0x60x60xc0xc0xb25-320x50x90x90x50x00x30x70x833-400x40xf0x10xc0xe0x80x80x241-480xd0x40x60x90x20x10xb0x749-560xf0x50xc0xb0x90x30x70xe57-640x30xa0xa0x00x50x60x00xd
表7.2 1234 56781-80xf0x30x10xd0x80x40xe0x79-160x60xf0xb0x20x30x80x40xf17-240x90xc0x70x00x20x10xd0xa25-320xc0x60x00x90x50xb0xa0x533-400x00xd0xe0x80x70xa0xb0x141-480xa0x30x40xf0xd0x40x10x249-560x50xb0x80x60xc0x70x60xc57-640x90x00x30x50x20xe0xf0x9
表7.3 123456781-80xa0xd0x00x70x90x00xe0x99-160x60x30x30x40xf0x60x50xa17-240x10x20xd0x80xc0x50x70xe25-320xb0xc0x40xb0x20xf0x80x133-400xd0x10x60xa0x40xd0x90x041-480x80x60xf0x90x30x80x00x749-560xb0x40x10xf0x20xe0xc0x357-640x50xb0xa0x50xe0x20x70xc
表7.4  123456781-80x70xd0xd0x80xe0xb0x30x59-160x00x60x60xf0x90x00xa0x317-240x10x40x20x70x80x20x50xc25-320xb0x10xc0xa0x40xe0xf0x933-400xa0x30x60xf0x90x00x00x641-480xc0xa0xb0xa0x70xd0xd0x849-560xf0x90x10x40x30x50xe0xb57-640x50xc0x20x70x80x20x40xe
表7.5 123456781-80x20xe0xc0xb0x40x20x10xc9-160x70x40xa0x70xb0xd0x60x117-240x80x50x50x00x30xf0xf0xa25-320xd0x30x00x90xe0x80x90x633-400x40xb0x20x80x10xc0xb0x741-480xa0x10xd0xe0x70x20x80xd49-560xf0x60x90xf0xc0x00x50x957-640x60xa0x30x40x00x50xe0x3
表7.6 123456781-80xc0xa0x10xf0xa0x40xf0x29-160x90x70x20xc0x60x90x80x517-240x00x60xd0x10x30xd0x40xe25-320xe0x00x70xb0x50x30xb0x833-400x90x40xe0x30xf0x20x50xc41-480x20x90x80x50xc0xf0x30xa49-560x70xb0x00xe0x40x10xa0x757-640x10x60xd0x00xb0x80x60xd
表7.7  123456781-80x40xd0xb0x00x20xb0xe0x79-160xf0x40x00x90x80x10xd0xa17-240x30xe0xc0x30x90x50x70xc25-320x50x20xa0xf0x60x80x10x633-400x10x60x40xb0xb0xd0xd0x841-480xc0x10x30x40x70xa0xe0x749-560xa0x90xf0x50x60x00x80xf57-640x00xe0x50x20x90x30x20xc
表7.8  123456781-80xd0x10x20xf0x80xd0x40x89-160x60xa0xf0x30xb0x70x10x417-240xa0xc0x90x50x30x60xe0xb25-320x50x00x00xe0xc0x90x70x233-400x70x20xb0x10x40xe0x10x741-480x90x40xc0xa0xe0x80x20xd49-560x00xf0x60xc0xa0x90xd0x057-640xf0x30x30x50x50x60x80xb
在1.2.3步中形成了48位的right值,

需要把48位的right值转换成32位的right值.把right视为由8个6位二进制块组成,

a,b….h都是6位,强制转换成10进制整数的值都不大于64 ,a,b…h转成10进制整数后,在对应的表中根据转换后整数值取得对应位置的替代值,
a对应表7.1
b对应表7.2
c对应表7.3
d对应表7.4
e对应表7.5
f对应表7.6
g对应表7.7
h对应表7.8
比如:
a = 32 ,那么到表7.1中找到32的位置,把对应的替代值0x8赋给a;
d = 53 ,那么到表7.4中找到的位置,把对应的替代值 0x3赋给d ;
g = 16, 那么到表7.7中找到16的位置,把对应的替代值0xa赋给g;
每6位用一个4位替换这样就完成了从48位向32位数据的转换.

有些资料中介绍6位转4位的实现方法与本文所采用的不同,但殊途同归,最终的结果是相同的.
1.2.5 数据换位

表8
1672021291228171152326518311028241432273919133062211425
把1.2.4步形成的32位right

根据表8进行转换:
数据的原第16位换到第一位,原第7位换到第二位,...,依此类推,最后得到新的32位数据.

1.2.6 交换数据
把right 和left按位异或后的值赋给right,然后将本轮输入的原始right值赋给left.
1.2.7 迭代
DES算法需要进行16次迭代,在完成16次迭代前,把第i-1次得到的的left和right的值作为第i次的输入数据,重复1.2.3~1.2.6的步骤,但是有一点要记住:在步骤1.2.3中第i次迭代要选择第i次迭代生成的密钥与数据进行按位异或.
1.2.8 数据整理
表9
40848165624643239747155523633138646145422623037545135321612936444125220602835343115119592734242105018582633141949175725
为保证加密和解密的对称性,DES算法的前15次迭代每完成一次迭代都要交换left和right的值,第16次迭代不交换两者的数值. 到此把32位的left和right合并成64位的Data

根据表9重新调整Data的位值
数据的原第40位换到第一位,原第8位换到第二位,...,依此类推,最后的得到新的64位.

Data即为密文.
1.3 数据的解密
数据解密的算法与加密算法相同,区别在于1.2.3步中和数据进行按位异或的密钥的使用顺序不同,在加密中是按照第i次迭代就采用第i次迭代生成的密钥进行异或,而解密时第i次迭代就采用第17-i次迭代生成的密钥和数据进行异或.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值