DES算法及其VC源代码.docx
- 文档编号:11297370
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:15
- 大小:45.25KB
DES算法及其VC源代码.docx
《DES算法及其VC源代码.docx》由会员分享,可在线阅读,更多相关《DES算法及其VC源代码.docx(15页珍藏版)》请在冰豆网上搜索。
DES算法及其VC源代码
DES算法及其在VC++6.0下的实现:
本文介绍了一种国际上通用的加密算法—DES算法的原理,并给出了在VC++6.0语言环境下实现的源代码。
最后给出一个示例,以供参考。
关键字:
DES算法、明文、密文、密钥、VC;
本文程序运行效果图如下:
正文:
当今社会是信息化的社会。
为了适应社会对计算机数据安全保密越来越高的要求,美国国家标准局(NBS)于1997年公布了一个由IBM公司研制的一种加密算法,并且确定为非机要部门使用的数据加密标准,简称DES(DataEncryptonStandard)。
自公布之日起,DES算法作为国际上商用保密通信和计算机通信的最常用算法,一直活跃在国际保密通信的舞台上,扮演了十分突出的角色。
现将DES算法简单介绍一下,并给出实现DES算法的VC源代码。
DES算法由加密、解密和子密钥的生成三部分组成。
一.加密
DES算法处理的数据对象是一组64比特的明文串。
设该明文串为m=m1m2…m64(mi=0或1)。
明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。
其加密过程图示如下:
DES算法加密过程
对DES算法加密过程图示的说明如下:
待加密的64比特明文串m,经过IP置换后,得到的比特串的下标列表如下:
IP
58
50
42
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
该比特串被分为32位的L0和32位的R0两部分。
R0子密钥K1(子密钥的生成将在后面讲)经过变换f(R0,K1)(f变换将在下面讲)输出32位的比特串f1,f1与L0做不进位的二进制加法运算。
运算规则为:
f1与L0做不进位的二进制加法运算后的结果赋给R1,R0则原封不动的赋给L1。
L1与R0又做与以上完全相同的运算,生成L2,R2……一共经过16次运算。
最后生成R16和L16。
其中R16为L15与f(R15,K16)做不进位二进制加法运算的结果,L16是R15的直接赋值。
R16与L16合并成64位的比特串。
值得注意的是R16一定要排在L16前面。
R16与L16合并后成的比特串,经过置换IP-1后所得比特串的下标列表如下:
IP-1
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
经过置换IP-1后生成的比特串就是密文e.。
下面再讲一下变换f(Ri-1,Ki)。
它的功能是将32比特的输入再转化为32比特的输出。
其过程如图所示:
对f变换说明如下:
输入Ri-1(32比特)经过变换E后,膨胀为48比特。
膨胀后的比特串的下标列表如下:
E:
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
31
膨胀后的比特串分为8组,每组6比特。
各组经过各自的S盒后,又变为4比特(具体过程见后),合并后又成为32比特。
该32比特经过P变换后,其下标列表如下:
P:
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
经过P变换后输出的比特串才是32比特的f(Ri-1,Ki)。
下面再讲一下S盒的变换过程。
任取一S盒。
见图:
在其输入b1,b2,b3,b4,b5,b6中,计算出x=b1*2+b6,y=b5+b4*2+b3*4+b2*8,再从Si表中查出x行,y列的值Sxy。
将Sxy化为二进制,即得Si盒的输出。
(S表如图所示)
至此,DES算法加密原理讲完了。
在VC++6.0下的程序源代码为:
for(i=1;i<=64;i++)
m1[i]=m[ip[i-1]];//64位明文串输入,经过IP置换。
下面进行迭代。
由于各次迭代的方法相同只是输入输出不同,因此只给出其中一次。
以第八次为例:
//进行第八次迭代。
首先进行S盒的运算,输入32位比特串。
for(i=1;i<=48;i++)//经过E变换扩充,由32位变为48位
RE1[i]=R7[E[i-1]];
for(i=1;i<=48;i++)//与K8按位作不进位加法运算
RE1[i]=RE1[i]+K8[i];
for(i=1;i<=48;i++)
{
if(RE1[i]==2)
RE1[i]=0;
}
for(i=1;i<7;i++)//48位分成8组
{
s11[i]=RE1[i];
s21[i]=RE1[i+6];
s31[i]=RE1[i+12];
s41[i]=RE1[i+18];
s51[i]=RE1[i+24];
s61[i]=RE1[i+30];
s71[i]=RE1[i+36];
s81[i]=RE1[i+42];
}//下面经过S盒,得到8个数。
S1,s2,s3,s4,s5,s6,s7,s8分别为S表
s[1]=s1[s11[6]+s11[1]*2][s11[5]+s11[4]*2+s11[3]*4+s11[2]*8];
s[2]=s2[s21[6]+s21[1]*2][s21[5]+s21[4]*2+s21[3]*4+s21[2]*8];
s[3]=s3[s31[6]+s31[1]*2][s31[5]+s31[4]*2+s31[3]*4+s31[2]*8];
s[4]=s4[s41[6]+s41[1]*2][s41[5]+s41[4]*2+s41[3]*4+s41[2]*8];
s[5]=s5[s51[6]+s51[1]*2][s51[5]+s51[4]*2+s51[3]*4+s51[2]*8];
s[6]=s6[s61[6]+s61[1]*2][s61[5]+s61[4]*2+s61[3]*4+s61[2]*8];
s[7]=s7[s71[6]+s71[1]*2][s71[5]+s71[4]*2+s71[3]*4+s71[2]*8];
s[8]=s8[s81[6]+s81[1]*2][s81[5]+s81[4]*2+s81[3]*4+s81[2]*8];
for(i=0;i<8;i++)//8个数变换输出二进制
{
for(j=1;j<5;j++)
{
temp[j]=s[i+1]%2;
s[i+1]=s[i+1]/2;
}
for(j=1;j<5;j++)
f[4*i+j]=temp[5-j];
}
for(i=1;i<33;i++)//经过P变换
frk[i]=f[P[i-1]];//S盒运算完成
for(i=1;i<33;i++)//左右交换
L8[i]=R7[i];
for(i=1;i<33;i++)//R8为L7与f(R,K)进行不进位二进制加法运算结果
{
R8[i]=L7[i]+frk[i];
if(R8[i]==2)
R8[i]=0;
}
其它各次迭代类似,可以依此类推。
二.子密钥的生成
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=01101100011001010110000101110010
01101110011010010110111001100111
密钥k的ASCII二进制表示:
k=01100011011011110110110101110000
01110101011101000110010101110010
明文m经过IP置换后,得:
1111111100001000110100111010011000000000111111110111000111011000
等分为左右两段:
L0=11111111000010001101001110100110R0=00000000111111110111000111011000
经过16次迭代后,所得结果为:
L1=00000000111111110111000111011000R1=00110101001100010011101110100101
L2=00110101001100010011101110100101R2=00010111111000101011101010000111
L3=00010111111000101011101010000111R3=00111110101100010000101110000100
L4=00111110101100010000101110000100R4=111101*********11111101000111110
L5=111101*********11111101000111110R5=10010110011001110100111111100101
L6=10010110011001110100111111100101R6=11001011001010000101110110100111
L7=11001011001010000101110110100111R7=01100011110011101000111011011001
L8=01100011110011101000111011011001R8=01001011110100001111001000000100
=010*********
L10=00011101001101111010111011100001R10=111011*********11111010100000101
L11=111011*********11111010100000101R11=01101101111011011110010111111000
L12=01101101111011011110010111111000R12=11111101110011100111000110110111
L13=11111101110011100111000110110111R13=111001*********11010101000000100
L14=111001*********11010101000000100R14=00011110010010011011100001100001
L15=00011110010010011011100001100001R15=01010000111001001101110110100011
=010*********
其中,f函数的结果为:
f1=11001010001110011110100000000011f2=00010111000111011100101101011111
f3=00001011100000000011000000100001f4=11100000001101010100000010111001
f5=10101000110101100100010001100001f6=00111100111111111010011110011001
f7=111101*********11100000100111100f8=10000000111110001010111110100011
f9=01111110111110010010000000111000f10=10100101001010110000011100000001
f11=01110000110110100100101100011001f12=00010011001101011000010010110010
f13=10001010000010000100111111111100f14=11100011100001111100100111010110
f15=10110111000000010111011110100111f16=01100011111000011111010000000000
16个子密钥为:
K1=111100*********01110111011010000K2=111000*********01111011010010101
K3=111101*********00111011000101000K4=111001*********10111001000011010
K5=111011*********10111011100100110K6=111011*********10101101110001011
K7=00101111110100111111101111100110K8=10111111010110011101101101010000
K9=00011111010110111101101101000100K10=00111111011110011101110100001001
K11=00011111011011011100110101101000K12=01011011011011011011110100001010
K13=110111*********11010110110001111K14=110100*********01010111110000000
*010*********
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=0000000011111111111111111011D0=1000001101110110000001101000
C1=0000000111111111111111110110D1=0000011011101100000011010001
C2=0000001111111111111111101100D2=0000110111011000000110100010
C3=0000111111111111111110110000D3=0011011101100000011010001000
C4=0011111111111111111011000000D4=1101110110000001101000100000
C5=111111*********1101100000000D5=0111011000000110100010000011
C6=111111*********0110000000011D6=1101100000011010001000001101
C7=111111*********1000000001111D7=0110000001101000100000110111
C8=111111*********0000000111111D8=1000000110100010000011011101
C9=111111*********0000001111111D9=0000001101000100000110111011
C10=111111*********0000111111111D10=0000110100010000011011101100
C11=1111110110000000011111111111D11=0011010001000001101110110000
C12=1111011000000001111111111111D12=1101000100000110111011000000
C13=1101100000000111111111111111D13=0100010000011011101100000011
C14=0110000000011111111111111111D14=0001000001101110110000001101
C15=1000000001111111111111111101D15=0100000110111011000000110100
C16=0000000011111111111111111011D16=1000001101110110000001101000
解密过程与加密过程相反,所得的数据的顺序恰好相反。
在此就不赘述。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DES 算法 及其 VC 源代码