des算法加密解密的实现 des加密解密算法的完整程序

DES\u7b97\u6cd5\u52a0\u5bc6\u7684\u7b97\u6cd5\u6b65\u9aa4\u662f

#define READFILESIZE 512
\u6b65\u9aa4:
1.\u4ece\u6587\u4ef6\u4e2d\u8bfb\u53d6READFILESIZE\u4e2a\u5b57\u8282\u7684\u6570\u636e
2.,\u5982\u679c\u4ece\u6587\u4ef6\u4e2d\u8bfb\u51fa\u7684\u6570\u636e\u5c11\u4e8eREADFILESIZE\u4e2a,\u4ee50\u8865\u8db3,\u7136\u540e\u6839\u636e\u7528\u6237\u6307\u5b9a\u7684\u7c7b\u578b\u5bf9\u8fd9READFILESIZE\u4e2a\u5b57\u8282\u7684\u6570\u636e\u8fdb\u884c\u64cd\u4f5c.
3.\u5224\u65ad\u6587\u4ef6\u662f\u5426\u7ed3\u675f,\u6ca1\u6709\u5219\u6267\u884c\u6b65\u9aa41
4.\u628a\u52a0\u5bc6\u540e\u7684\u6587\u4ef6\u5b9e\u9645\u957f\u5ea6\u6dfb\u52a0\u5230\u5bc6\u6587\u7684\u672b\u5c3e
5.\u7ed3\u675f
\u91c7\u7528\u4e00\u6b21\u53ea\u4ece\u6587\u4ef6\u8bfb\u53d6READFILESIZE\u4e2a\u5b57\u8282\u662f\u5728\u4e3a\u4e86\u9632\u6b62\u7531\u4e8e\u9700\u8981\u52a0\u5bc6\u6216\u89e3\u5bc6\u7684\u6587\u4ef6\u592a\u5927\u5bfc\u81f4\u5185\u5b58\u4e0d\u591f\u7684\u60c5\u51b5\u51fa\u73b0\u3002

\u5230VCKBase\u4e0a\u627e
http://www.vckbase.com/document/viewdoc/?id=623
http://www.vckbase.com/document/viewdoc/?id=624

一.加密

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;
}

[ 原创文档 本文适合中级读者 已阅读21783次 ] 文档 代码 工具

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

本文介绍了一种国际上通用的加密算法—DES算法的原理,并给出了在VC++6.0语言环境下实现的源代码。最后给出一个示例,以供参考。
关键字:DES算法、明文、密文、密钥、VC;

本文程序运行效果图如下:

正文:
当今社会是信息化的社会。为了适应社会对计算机数据安全保密越来越高的要求,美国国家标准局(NBS)于1997年公布了一个由IBM公司研制的一种加密算法,并且确定为非机要部门使用的数据加密标准,简称DES(Data Encrypton Standard)。自公布之日起,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;
}

[ 原创文档 本文适合中级读者 已阅读21783次 ] 文档 代码 工具

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 编程实例与技巧》 机械工业出版社 王华等编著

  • DES鍔犲瘑绠楁硶
    绛旓細DES鍔犲瘑绠楁硶鏄暟鎹姞瀵嗘爣鍑嗭紙Data Encryption Standard锛夌殑缂╁啓锛瀹冩槸涓绉嶅绉板垎缁勫姞瀵嗘妧鏈紝浠ュ叾64姣旂壒鐨勫瘑閽ュ拰16杞姞瀵嗚繃绋嬭岄椈鍚銆傚湪DES鐨勮璁′腑锛屽瘑閽ュ鐞嗙粡杩囦簡绮惧瘑鐨勮疆鍑芥暟E銆両P/IPI缃崲浠ュ強闈炵嚎鎬鐩掑拰P鐩掓搷浣滐紝纭繚浜嗘暟鎹殑瀹夊叏鎬с傞鍏堬紝DES鐨勫姞瀵嗚繃绋嬩粠鎺ユ敹64姣旂壒鐨勫瘑閽ュ紑濮嬶紝閫氳繃PC1鍜孭C2缃崲瀛...
  • des绠楁硶鍔犲瘑瑙e瘑鐨勫疄鐜
    绛旓細鐜板皢DES绠楁硶绠鍗曚粙缁嶄竴涓,骞剁粰鍑瀹炵幇DES绠楁硶鐨刅C婧愪唬鐮併侱ES绠楁硶鐢卞姞瀵嗐瑙e瘑鍜屽瓙瀵嗛挜鐨勭敓鎴愪笁閮ㄥ垎缁勬垚銆 涓.鍔犲瘑DES绠楁硶澶勭悊鐨勬暟鎹璞℃槸涓缁64姣旂壒鐨勬槑鏂囦覆銆傝璇ユ槑鏂囦覆涓簃=m1m2鈥64 (mi=0鎴1)銆傛槑鏂囦覆缁忚繃64姣旂壒鐨勫瘑閽鏉ュ姞瀵,鏈鍚庣敓鎴愰暱搴︿负64姣旂壒鐨勫瘑鏂嘐銆傚叾鍔犲瘑杩囩▼鍥剧ず濡備笅:DES绠楁硶鍔犲瘑杩囩▼瀵笵ES绠楁硶...
  • des绠楁硶涓昏娴佺▼
    绛旓細DES绠楁硶鐨勪富瑕佹祦绋嬫槸灏64浣嶇殑鏄庢枃杈撳叆鍧楄浆鎹㈡垚64浣嶇殑瀵嗘枃杈撳嚭鍧楋紝浣跨敤鍚屾牱闀垮害涓64浣嶇殑瀵嗛挜杩涜鍔犲瘑銆傛暣涓繃绋嬪彲浠ュ垎涓哄嚑涓楠:棣栧厛锛岃緭鍏ョ殑64浣嶆暟鎹潡閫氳繃缃崲瑙勫垯琛ㄨ繘琛屽垵濮嬪鐞嗐傝琛ㄥ皢鏁版嵁浣嶈繘琛岄噸鏂扮粍鍚堬紝灏嗚緭鍑哄垎涓篖0锛堝乏32浣嶏級鍜孯0锛堝彸32浣嶏級锛屼緥濡傦紝杈撳叆鐨勭58浣嶅皢绉诲姩鍒扮涓浣嶏紝浠ユ绫绘帹...
  • DES 鍔犲瘑绠楁硶鏄庢牱鐨勪竴绉嶇畻娉
    绛旓細鏁版嵁鍔犲瘑绠楁硶锛圖ata Encryption Algorithm锛孌EA锛夌殑鏁版嵁鍔犲瘑鏍囧噯锛圖ata Encryption Standard锛DES锛夋槸瑙勮寖鐨勬弿杩帮紝瀹冨嚭鑷 IBM 鐨勭爺绌跺伐浣滐紝骞跺湪 1997 骞磋缇庡浗鏀垮簻姝e紡閲囩撼銆傚畠寰堝彲鑳芥槸浣跨敤鏈骞挎硾鐨勭閽ョ郴缁燂紝鐗瑰埆鏄湪淇濇姢閲戣瀺鏁版嵁鐨勫畨鍏ㄤ腑锛屾渶鍒濆紑鍙戠殑 DES 鏄祵鍏ョ‖ 浠朵腑鐨勩傞氬父锛岃嚜鍔ㄥ彇娆炬満锛圓utomated T...
  • 浣跨敤C/C++璇█,灏DES/AES鍔犲瘑绠楁硶,鐢ㄤ唬鐮瀹炵幇
    绛旓細濡傛灉浼佷笟鍐呴儴閲囩敤eclipse銆乂S绛夊紑鍙戝伐鍏凤紝浠庤繖浜涘紑鍙戝伐鍏峰皢浠g爜鐩存帴涓婁紶鍒癝VN鏈嶅姟鍣ㄤ笂鏃朵細鑷姩瑙e瘑銆備负浜嗛伩鍏嶆槑鏂囥佸瘑鏂囨贩涔卞瓨鏀惧鑷寸増鏈瘮瀵规椂鍑虹幇閿欒绛夐棶棰樸傚洜姝わ紝SVN鏈嶅姟鍣ㄤ笂闇缁熶竴瀛樻斁鏄庢枃鏂囦欢銆傚垯閫氳繃鏈嶅姟鍣ㄧ櫧鍚嶅崟鍔熻兘瀹炵幇瀵圭粓绔數鑴戞暟鎹繘琛屽己鍒堕忔槑鍔犲瘑锛屽涓婁紶鍒板簲鐢ㄦ湇鍔″櫒鏁版嵁瀹炵幇涓婁紶鑷姩瑙e瘑銆佷笅杞借嚜鍔...
  • DES 鍔犲瘑绠楁硶鏄庢牱鐨勪竴绉嶇畻娉?瑕侀氫織瑙i噴..
    绛旓細DES绠楁硶鏄繖鏍峰伐浣滅殑锛氬Mode涓鍔犲瘑锛屽垯鐢↘ey 鍘绘妸鏁版嵁Data杩涜鍔犲瘑锛 鐢熸垚Data鐨勫瘑鐮佸舰寮忥紙64浣嶏級浣滀负DES鐨勮緭鍑虹粨鏋滐紱濡侻ode涓瑙e瘑锛屽垯鐢↘ey鍘绘妸瀵嗙爜褰㈠紡鐨勬暟鎹瓺ata瑙e瘑锛岃繕鍘熶负Data鐨勬槑鐮佸舰寮忥紙64浣嶏級浣滀负DES鐨勮緭鍑虹粨鏋溿傚湪閫氫俊缃戠粶鐨勪袱绔紝鍙屾柟绾﹀畾涓鑷寸殑Key锛屽湪閫氫俊鐨勬簮鐐圭敤Key瀵规牳蹇冩暟鎹繘琛孌ES鍔犲瘑...
  • 姹des C#绠楁硶
    绛旓細Des绠楁硶鏄竴绉嶆爣鍑嗙殑瀵圭О鍔犲瘑绠楁硶锛屽叾绮惧崕灏辨槸鎶婃槑鏂囩粡杩囦竴绯诲垪鐨勫鏉傚彉鍖栧悗鎼炵殑闈㈢洰鍏ㄩ潪锛屼竴鑸湪涓嶇煡瀵嗙爜鐨勬儏鍐典笅瑕佹妸瀹冪殑鎭㈠寰堥毦銆傜畻娉曞彲浠ョ敱鍥涗釜閮ㄥ垎鎻忚堪锛1.鑾峰彇16涓瓙瀵嗛挜 2.鍒濆缃崲缃崲鍑芥暟ip 3.鍔犲瘑鍑芥暟f 4.鏈疆鎹㈠嚱鏁 涓涓嬫槸鍒嗚В鍔ㄤ綔锛1.鑾峰彇16涓瓙瀵嗛挜锛氬瘑鐮佹槸64浣嶇殑甯冨皵鍊硷紝缁忚繃浠ヤ笅...
  • 瀵圭О鍔犲瘑绠楁硶涔DES浠嬬粛
    绛旓細DES绠楁硶鍒╃敤 澶氭缁勫悎鏇夸唬绠楁硶 鍜 鎹綅绠楁硶 ,鍒嗘暎鍜岄敊涔辩殑鐩镐簰浣滅敤,鎶婃槑鏂囩紪鍒舵垚瀵嗙爜寮哄害寰堥珮鐨勫瘑鏂,瀹冪殑鍔犲瘑鍜瑙e瘑鐢ㄧ殑鏄悓涓绠楁硶銆 DES绠楁硶,鏄竴绉 涔樼Н瀵嗙爜 ,鍏跺湪绠楁硶缁撴瀯涓婁富瑕侀噰鐢ㄤ簡 缃崲 銆 浠f浛 銆 妯′簩鐩稿姞 绛夊嚱鏁,閫氳繃 杞嚱鏁 杩唬鐨勬柟寮忔潵杩涜璁$畻鍜屽伐浣溿 DES绠楁硶涔熶細浣跨敤鍒版暟鎹疆鎹㈡妧鏈,涓昏鏈夊垵濮...
  • 鎺ㄥDES鍔犲瘑绠楁硶鍘熺悊
    绛旓細褰撲娇鐢ㄧ敤鎴蜂笓鐢ㄥ瘑閽鍔 瀵锛岃岀敤璇ョ敤鎴峰叕寮瀵嗛挜瑙e瘑鏃讹紝鍒欏彲瀹炵幇涓涓鍔犲瘑鐨娑堟伅鑳借澶氫釜鐢ㄦ埛瑙h锛涘綋浣跨敤 鐢ㄦ埛鍏紑瀵嗛挜鍔犲瘑锛岃岀敤璇ョ敤鎴蜂笓鐢ㄥ瘑閽ヨВ瀵嗘椂锛屽垯鍙疄鐜颁紶杈撶殑淇℃伅鍙涓涓敤鎴疯В璇汇 鍓嶈呭父琚敤浜庢暟瀛楃鍚嶏紝鍚庤呭父琚敤浜庝繚瀵嗛氫俊銆DES绠楁硶璇﹁堪 DES绠楁硶鎶64浣嶇殑鏄庢枃杈撳叆鍧楀彉涓64浣嶇殑瀵嗘枃杈撳嚭鍧...
  • DES鍔犲瘑绠楁硶C璇█瀹炵幇
    绛旓細int key[8][6];}subkey[16]; //瀹氫箟瀛愬瘑閽ュ璞℃暟缁 class DES{ int encipher_decipher; //鍒ゆ柇鍔犲瘑杩樻槸瑙e瘑 int key_in[8][8]; //鐢ㄦ埛鍘熷杈撳叆鐨64浣嶄簩杩涘埗鏁 int key_out[8][7]; //闄ゅ幓姣忚鐨勬渶鍚庝竴浣嶆牎楠屼綅 int c0_d0[8][7]; //瀛樺偍缁廝C-1杞崲鍚庣殑56浣嶆暟鎹...
  • 扩展阅读:扫一扫题目出答案 ... 加密通道网址获取 ... 10种常用的加密算法 ... des加密算法原理及过程 ... 在线des加密解密工具 ... 3des在线加密解密工具 ... des解密过程图 ... des加密解密流程图 ... 画出des解密算法的流程图 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网