DES加密

一 64位密钥计算出16个48位子密钥

1. 对输入的密钥进行变换。
      用户的64bit密钥,其中第8, 16, 24, 32, 40, 48, 56, 64位是校验位, 使得每个密钥都有奇数个1。所以密钥事实上是56位。对这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,

表的意思是第57位移到第1位,第49位移到第2位,...... 以此类推。变换后得到56bit数据,将它分成两部分,C[0][28], D[0][28]。

2. 计算16个子密钥,计算方法C[i][28] D[i][28]为对前一个C[i-1][28], D[i-1][28]做循环左移操作。16次的左移位数如下表:

 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16   (第i次)
 1,  1,  2,  2,  2,  2,  2,  2,  1,   2,  2,   2,   2,   2,   2,  1    (左移位数)

3. 串联计算出来的C[i][28] D[i][28] 得到56位,然后对它进行如下变换得到48位子密钥K[i][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,

表的意思是第14位移到第1位,第17位移到第2位,以此类推。在此过程中,发现第9,18,22,25, 35,38,43,54位丢弃。

二 对64位明文进行操作

1. 对64bit的明文输入进行换位变换。换位表如下:

58, 50, 12, 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

表的意思就是第一次变换时,第58位移到第1位,第50位移到第2位,...... 依此类推。得到64位数据,将这数据前后分成两块L[0][32], R[0][32]。

2. 加密过程,对R[i][32]进行扩展变换成48位数,方法如下, 记为E(R[i][32])

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,

3. 将E(R[i][32])与K[i][48]作异或运算,得到48位数,将48位数顺序分成8份,6位一份,B[8][6]。

4. 使用S[i]替换B[i][6]。过程如下: 取出B[i][6]的第1位和第6位连成一个2位数m, m就是S[i]中对应的行数(0-3),取出B[i][6]的第2到第5位连成一个4位数n(0-15),n就是S[i]中对应的列数,用S[i][m][n]代替B[i][6]。S是4行16列的对应表,里面是4位的数,一共有8个S,定义如下:

S[1]:
   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,
S[2]:
    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,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,
S[3]:
    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,
S[4]:
    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,
S[5]:
  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,
S[6]:
  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,
S[7]:
  4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,
  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,
S[8]:
  13,2,8,4,6,15,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,

5. 将从B[i][6]经过S得到的8个4位数连起来得到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,

  得到的结果与L[i][32]作异或运算,把结果赋给R[i][32]。

6. 把R[i-1][32]的值赋给L[i],从5开始循环。直到K[16][48]结束。

10. 将最后的L,R合并成64位,然后进行如下转化得到最后的结果。这是对第4步的一个逆变化。
 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,
 34, 2, 42, 10, 50, 18, 58, 26,
 33, 1, 41,   9, 49, 17, 57, 25

以上是Des的加密过程,解密过程同样,只需要把16个子密钥K[i][48]的顺序颠倒过来就行了。

 

 

 

例题:

设明文m=computer,密钥k为program,它们用ASCII码表示为:

m= 01100011   01101111   01101101   01110000

      01110101   01110100   01100101   01110010

k=  01110000   01110010   01101111   01100111

      01110010    01101101   01101101

这里的k只有56位,由于第8,16,24,32,40,48,58,64位不起作用,所以没有赋值。也就是其中的k8 k16 k24 k32 k40 k48 k56 k64不起作用。其中的密钥为64比特如下:

         k=0111000*0011100*1001101*1110110*0111011*1001001*1000010*1101101*

在这里密钥K是在主函数中已设定,所以在程序运行时只输入明文就可以了。

密钥k经过PC-1置换后,分成两组C0,D0。可得

C0=11101100   10011001   00011011   1011

D0=10110100   01011000   10001110   0111

C0,D0 分别进行循环左移运算,得到C1,D1

C1=11011001   00110010   00110111   0111

D1=01101000   10110001   00011100   1111

依次类推,C1,D1继续进行循环左移,最后得到C2,D2进行循环左移,得到C3,D3……C16,D16

C1,D1进行PC-2置换,得到密钥k1,可得:

K1=00111101   10001111    11001101   00110111   00111111    01001000

依次类推,C2,D2进行PC-2置换,得到密钥k2, C3,D3进行PC-2置换得到k3,……C16,D16进行PC-2置换得到k16。

明文M进行IP置换后,分成两组:L0,R0,可得:

L0=11111111    10111000   01110110   01010111

R0=00000000   11111111   00000110    10000011

R0进行E膨胀后,与密钥k1进行异或运算,得到48比特的数据

S=10111101   10011000   00110011   10110111   11101011   01001110

将这些数据分别装入S盒:

(1)    101111进入S1,从S1的第3行第7列的元素7,可知其输出为0111

(2)    011001进入S2,从S2的第1行第12列的元6,可知其输出为0110

(3)    100000进入S3,从S3的第2行第0列的元素13,可知其输出为1101

(4)    110011进入S4,从S4的第3行第9列的元素4,可知其输出为0100

(5)    101101进入S5,从S5的第3行第6列的元素2,可知其输出为0010

(6)    111110进入S6,从S6的第2行第15列的元素6,可知其输出为0100

(7)    101101进入S7,从S7的第3行第6列的元素10,可知其输出为1010

(8)    001110进入S8,从S8的第0行第7列的元素1,可知其输出为0001

故8个S盒的输出为:

01110110   11010100   00100110    10100001

最后通过P得f(R0,k1)为:

01110110   11010100   00100110   10100001

L0   f(R0,k1)得到R1

R1=10111011   10011001   11101001   11001100

L1= R0=00000000     11111111    00000110    10000011

经过16轮的迭代最后得到:

L16= R15=01010010   10011000   11000001    01011010

R16=11101000   10000011   01111000     01001100

最后经过IP逆置换后得到密文如下:

00100100    01100001     00000010     10011011     01011001     10001000     11001111     10110100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值