分享
 
 
 

DES算法及其在VC++6.0下的实现(下)

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

DES算法及其在VC++6.0下的实现(下)

作者:航天医学工程研究所四室 朱彦军

《DES算法及其在VC++6.0下的实现(上)》中主要介绍了DES算法的基本原理,下面让我们继续:

二.子密钥的生成

64比特的密钥生成16个48比特的子密钥。其生成过程见图:

子密钥生成过程具体解释如下:

64比特的密钥K,经过PC-1后,生成56比特的串。其下标如表所示:

PC-1

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

该比特串分为长度相等的比特串C0和D0。然后C0和D0分别循环左移1位,得到C1和D1。C1和D1合并起来生成C1D1。C1D1经过PC-2变换后即生成48比特的K1。K1的下标列表为:

PC-2

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

C1、D1分别循环左移LS2位,再合并,经过PC-2,生成子密钥K2……依次类推直至生成子密钥K16。

注意:Lsi (I =1,2,….16)的数值是不同的。具体见下表:

迭代顺序

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

左移位数

1

1

2

2

2

2

2

2

1

2

2

2

2

2

2

1

生成子密钥的VC程序源代码如下:

for(i=1;i<57;i++)//输入64位K,经过PC-1变为56位 k0[i]=k[PC_1[i-1]];

56位的K0,均分为28位的C0,D0。C0,D0生成K1和C1,D1。以下几次迭代

方法相同,仅以生成K8为例。

for(i=1;i<27;i++)//循环左移两位

{

C8[i]=C7[i+2];

D8[i]=D7[i+2];

}

C8[27]=C7[1];

D8[27]=D7[1];

C8[28]=C7[2];

D8[28]=D7[2];

for(i=1;i<=28;i++)

{

C[i]=C8[i];

C[i+28]=D8[i];

}

for(i=1;i<=48;i++)

K8[i]=C[PC_2[i-1]];//生成子密钥k8

注意:生成的子密钥不同,所需循环左移的位数也不同。源程序中以生成子密钥 K8为例,所以循环左移了两位。但在编程中,生成不同的子密钥应以Lsi表为准。

三.解密

DES的解密过程和DES的加密过程完全类似,只不过将16圈的子密钥序列K1,K2……K16的顺序倒过来。即第一圈用第16个子密钥K16,第二圈用K15,其余类推。

第一圈:

加密后的结果

L=R15, R=L15⊕f(R15,K16)⊕f(R15,K16)=L15

同理R15=L14⊕f(R14,K15), L15=R14。

同理类推:

得 L=R0, R=L0。

其程序源代码与加密相同。在此就不重写。

四.示例

例如:已知明文m=learning, 密钥 k=computer。

明文m的ASCII二进制表示:

m= 01101100 01100101 01100001 01110010

01101110 01101001 01101110 01100111

密钥k的ASCII二进制表示:

k=01100011 01101111 01101101 01110000

01110101 01110100 01100101 01110010

明文m经过IP置换后,得:

11111111 00001000 11010011 10100110 00000000 11111111 01110001 11011000

等分为左右两段:

L0=11111111 00001000 11010011 10100110 R0=00000000 11111111 01110001 11011000

经过16次迭代后,所得结果为:

L1=00000000 11111111 01110001 11011000 R1=00110101 00110001 00111011 10100101

L2=00110101 00110001 00111011 10100101 R2=00010111 11100010 10111010 10000111

L3=00010111 11100010 10111010 10000111 R3=00111110 10110001 00001011 10000100

L4=00111110101100010000101110000100 R4=11110111110101111111101000111110

L5=11110111110101111111101000111110 R5=10010110011001110100111111100101

L6=10010110011001110100111111100101 R6=11001011001010000101110110100111

L7=11001011001010000101110110100111 R7=01100011110011101000111011011001

L8=01100011110011101000111011011001 R8=01001011110100001111001000000100

L9=01001011110100001111001000000100 R9=00011101001101111010111011100001

L10=00011101001101111010111011100001 R10=11101110111110111111010100000101

L11=11101110111110111111010100000101 R11=01101101111011011110010111111000

L12=01101101111011011110010111111000 R12=11111101110011100111000110110111

L13=11111101110011100111000110110111 R13=11100111111001011010101000000100

L14=11100111111001011010101000000100 R14=00011110010010011011100001100001

L15=00011110010010011011100001100001 R15=01010000111001001101110110100011

L16=01010000111001001101110110100011 R16=01111101101010000100110001100001

其中,f函数的结果为:

f1=11001010001110011110100000000011 f2=00010111000111011100101101011111

f3=00001011100000000011000000100001 f4=11100000001101010100000010111001

f5=10101000110101100100010001100001 f6=00111100111111111010011110011001

f7=11110101101010011100000100111100 f8=10000000111110001010111110100011

f9=01111110111110010010000000111000 f10=10100101001010110000011100000001

f11=01110000110110100100101100011001 f12=00010011001101011000010010110010

f13=10001010000010000100111111111100 f14=11100011100001111100100111010110

f15=10110111000000010111011110100111 f16=01100011111000011111010000000000

16个子密钥为:

K1=11110000101111101110111011010000 K2=11100000101111101111011010010101

K3=11110100111111100111011000101000 K4=11100110111101110111001000011010

K5=11101110110101110111011100100110 K6=11101111110100110101101110001011

K7=00101111110100111111101111100110 K8=10111111010110011101101101010000

K9=00011111010110111101101101000100 K10=00111111011110011101110100001001

K11=00011111011011011100110101101000 K12=01011011011011011011110100001010

K13=11011101101011011010110110001111 K14=11010011101011101010111110000000

K15=11111001101111101010011011010011 K16=11110001101111100010111000000001

S盒中,16次运算时,每次的8 个结果为:

第一次:5,11,4,1,0,3,13,9;

第二次:7,13,15,8,12,12,13,1;

第三次:8,0,0,4,8,1,9,12;

第四次:0,7,4,1,7,6,12,4;

第五次:8,1,0,11,5,0,14,14;

第六次:14,12,13,2,7,15,14,10;

第七次:12,15,15,1,9,14,0,4;

第八次:15,8,8,3,2,3,14,5;

第九次:8,14,5,2,1,15,5,12;

第十次:2,8,13,1,9,2,10,2;

第十一次:10,15,8,2,1,12,12,3;

第十二次:5,4,4,0,14,10,7,4;

第十三次:2,13,10,9,2,4,3,13;

第十四次:13,7,14,9,15,0,1,3;

第十五次:3,1,15,5,11,9,11,4;

第十六次:12,3,4,6,9,3,3,0;

子密钥生成过程中,生成的数值为:

C0=0000000011111111111111111011 D0=1000001101110110000001101000

C1=0000000111111111111111110110 D1=0000011011101100000011010001

C2=0000001111111111111111101100 D2=0000110111011000000110100010

C3=0000111111111111111110110000 D3=0011011101100000011010001000

C4=0011111111111111111011000000 D4=1101110110000001101000100000

C5=1111111111111111101100000000 D5=0111011000000110100010000011

C6=1111111111111110110000000011 D6=1101100000011010001000001101

C7=1111111111111011000000001111 D7=0110000001101000100000110111

C8=1111111111101100000000111111 D8=1000000110100010000011011101

C9=1111111111011000000001111111 D9=0000001101000100000110111011

C10=1111111101100000000111111111 D10=0000110100010000011011101100

C11=1111110110000000011111111111 D11=0011010001000001101110110000

C12=1111011000000001111111111111 D12=1101000100000110111011000000

C13=1101100000000111111111111111 D13=0100010000011011101100000011

C14=0110000000011111111111111111 D14=0001000001101110110000001101

C15=1000000001111111111111111101 D15=0100000110111011000000110100

C16=0000000011111111111111111011 D16=1000001101110110000001101000

解密过程与加密过程相反,所得的数据的顺序恰好相反。在此就不赘述。

参考书目:

《计算机系统安全》 重庆出版社 卢开澄等编著

《计算机密码应用基础》 科学出版社 朱文余等编著

《Visual C++ 6.0 编程实例与技巧》 机械工业出版社 王华等编著

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有