暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

密码学:DES算法

糟老头修炼记 2020-03-04
2668

DES:数据加密标准

DES具有十分对称的加密和解密结构,它使用排斥加、置换、替换和循环移位四种简单运算


DES算法思想:

DES算法将输入的明文分为64位的数据分组(最后一个分组不足64位则补0),使用一个56+8 (第8i位为奇偶校验位,i=1,2,…)=64位的密钥进行变换,每个64位明文分组数据经过初始置换、16次迭代和逆初始置换3个主要阶段,最后输出得到64位密文。


(1)初始置换


对明文64位明文段M按下表初始置换IP(8×8)

初始置换表IP:

设有明文M(64位) = 0123456789ABCDEF,即

M(64位) :

00000001 00100011

01000101 01100111

10001001 10101011

11001101 11101111

对M运用IP运算,即把明文M的第58位放在IP(M)的第一位,把明文M的第50位放在IP(M)的第二位,以此类推,故有:

IP(M) :

1100 1100 0000 0000

1100 1100 1111 1111

1111 0000 1010 1010

1111 0000 1010 1010 

(由初始置换表IP很容易找到规律,从图中易得:把M的第2,4,6,8,1,3,5,7依次放在IP(M)的最后一列,依次往前,即可轻松得到IP(M))


IP(64位) = L0(32位) + R0(32位)

L0 (32位) = 1100 1100 0000 0000 1100 1100 1111 1111

R0 (32位) = 1111 0000 1010 1010 1111 0000 1010 1010


对64位密钥K按下表做初始置换Ik(K),得到56位有效位输入密钥。其中需去掉K中的奇偶校验位第8i位(i=1,2,…,8),剩下的56位作为有效输入密钥

设有密钥K(64位) = 133457799BBCDFF1,即

K(64位) :

00010011 00110100

01010111 01111001

10011011 10111100

11011111 11110001

其中第8i位为奇偶校验位,即实际密钥为56位


密钥初始置换表Ik:

密钥初始置换表Ik与初始置换表IP的关系:密钥初始置换表Ik是初始置换表IP除去奇偶校验位,即8i位,也就是初始置换表IP的第四行,剩下七行,按照每一行最后一位数字作为序号,(1,2,3,4)(7,6,5,4),如图很容易看出两个表的规律

初始置换得到:

Ik(K) :

1111000 0110011 0010101 0101111

0101010 1011001 1001111 0001111

所以得到:

U0(28位) = 1111000 0110011 0010101 0101111

V0(28位) = 0101010 1011001 1001111 0001111

U0和V0分别是密钥置换后的高(左)28位和低(右)28位


(2)移位

将置换后的56位有效密钥的左28位U0和右28位V0分别进行16轮循环移位,移位得到Ui和Vi(i=1,2……,16),每轮移位得到的新56位密钥作为下一轮移位的有效密钥,每轮移位的次数按下表:

说明:U0、V0各左移1位分别得到U1、V1,U1、V1各左移1位分别得到U2、V2,U2、V2各左移2位分别得到U3、V3,……, U15、V15各左移1位分别得到U16、V16

从而得到U1V1 ,U2V2,…, U16V16:

U1 = 1110000110011001010101011111

V1 = 1010101011001100111100011110


U2 = 1100001100110010101010111111

V2 = 0101010110011001111000111101


U3 = 0000110011001010101011111111

V3 = 0101011001100111100011110101


U4 = 0011001100101010101111111100

V4 = 0101100110011110001111010101

U15 = 1111100001100110010101010111

V15 = 1010101010110011001111000111


U16 = 1111000011001100101010101111

V16 = 0101010101100110011110001111


(3)把16个56位子密钥置换压缩为48位

按下表将以上得到的16个56位子密钥置换压缩为48位,压缩后每个子钥的第9、18、22、25、35、38、43、54共8位数据会丢失,Ki(48位) = PC-2( UiVi(56位) )

子钥置换表PC-2(8×6): (不知道这个表有什么规律,如果没有的话我觉得把16个56位子密钥置换压缩为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


结果得到所有16个48位子钥:

K1 = 000110 110000 001011 101111 111111 000111 000001 110010

K2 = 011110 011010 111011 011001 110110 111100 100111 100101

K3 = 010101 011111 110010 001010 010000 101100 111110 011001

K4 = 011100 101010 110111 010110 110110 110011 010100 011101

K15 = 101111 111001 000110 001101 001111 010011 111100 001010

K16 =110010 110011 110110 001011 000011 100001 011111 110101


(4)扩展置换:将明文初始置换后得到的右边32位R0按下表扩展置换为48位R01

(上边过程(1)得到的,IP(64位) = L0(32位) + R0(32位)

故:

L0 (32位) = 1100 1100 0000 0000

1100 1100 1111 1111

R0 (32位) = 1111 0000 1010 1010

1111 0000 1010 1010)

扩展置换表:

置换规则:把旧组的最后一位放到下一组的第一位,把旧组的第一位放到上一组的最后一位


(5)S盒压缩

用以上扩展得到的48位R01与48位子密钥K1做“异或”运算,得到48位的加密数据R02

将以上得到48位加密数据R02进行S盒压缩替换运算,替换压缩成一个新的32位数据R03


S盒压缩过程:将48位的加密数据R02分成8个6位的数,取6位数的最高位和和最低位组合成一个2位数,将该数转换为十进制,用其值来表示加密数所在的行号;取6位数的中间4位组成的一组新的二进制数,将其转换为十进制,表示加密数所在的列号;按行列在S盒中找到对应的数即为压缩后的4位数。例如:101010,取高位1和低位0组合成10,表示第2行,中间4位0101表示第5行,若用S1盒压缩,则在S1盒中相对应的数为6,即0110。即101010用S1盒压缩后变为0110。

每个6位数用1个S盒压缩成4位,最终形成8个4位的数据,即32位数R03


(6)P置换表

将以上用S盒压缩得到的32位数R03按下表置换得到32位数R04,R04其实就是F函数的操作结果。

P置换表:

将以上置换得到的32位数R04与明文初始置换得到的L0做“异或”运算,其结果作为R1;并使L1=R0。得到L1R1 ,至此第1轮加密变换完成

将得到的L1R1用对L0R0加密的方法再加密得到L2R2,如此循环操作共16次,最后得到L16R16

(7)逆初始置换

将L16R16合并成64位按以下逆初始置换表进行重排列,置换后的数据即为最终密文

逆初始置换表:

R16L16 :

00001010 01001100

11011001 10010101

01000011 01000010

00110010 00110100

再对R16L16运用IP-1:

IP-1(R16L16) :

10000101 11101000

00010011 01010100

00001111 00001010

10110100 00000101

转换为十六进制即 85E813540F0AB405(密文)

从明文M:

M = 0123456789ABCDEF,

在密钥K的作用下:

K = 133457799BBCDFF1

经过以上步骤,最终得到密文:

C = 85E813540F0AB405


文章转载自糟老头修炼记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论