文档库 最新最全的文档下载
当前位置:文档库 › DES加密与解密算法的介绍和实现(有程序)

DES加密与解密算法的介绍和实现(有程序)

DES加密与解密算法的介绍和实现(有程序)
DES加密与解密算法的介绍和实现(有程序)

DES算法的介绍和实现

一.DES算法介绍

DES( Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。虽然56位密钥的DES算法已经风光不在,而且常有用Des加密的明文被破译的报道,但是了解一下昔日美国的标准加密算法总是有益的,而且目前DES 算法得到了广泛的应用,在某些场合,她仍然发挥着余热^_^.

1.1 密钥生成

1.1.1 取得密钥

从用户处取得一个64位(本文如未特指,均指二进制位))长的密码key ,

去除64位密码中作为奇偶校验位的第8、16、24、32、40、48、56、64位,剩下的56位作为有效输入密钥.

1.1.2 等分密钥

表1.

57 49 41 33 25 17 9

1 58 50 4

2 34 26 18

10 2 59 51 43 35 27

19 11 3 60 50 44 36

表2.

65 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

把在1.1.1步中生成的56位输入密钥分成均等的A,B两部分,每部分为28位,参照表1和表2把输入密钥的位值填入相应的位置. 按照表1所示A的第一位为输入的64位密钥的第57位,A的第2位为64位密钥的第49位,...,依此类推,A的最后一位最后一位是64位密钥的第36位。

1.1.3 密钥移位

表3.

i 1 2 3 4 5 6 7 8

? 1 1 2 2 2 2 2 2

i 9 10 11 12 13 14 15 16

? 1 2 2 2 2 2 2 1

DES算法的密钥是经过16次迭代得到一组密钥的,把在1.1.2步中生成的A,B视为迭代的起始密钥,表3显示在第i次迭代时密钥循环左移的位数. 比如在第1次迭代时密钥循环左移1位,第3次迭代时密钥循环左移2位.

第9次迭代时密钥循环左移1位,第14次迭代时密钥循环左移2位.

第一次迭代:

A(1) = ?(1) A

B(1) = ?(1) B

第i次迭代:

A(i) = ?(i) A(i-1)

B(i) = ?(i) B(i-1)

1.1.4 密钥的选取

表4.

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

在1.1.3步中第i次迭代生成的两个28位长的密钥为

把合并

按照表4所示k的第一位为56位密钥的第14位,k的第2位为56位密钥的第17位,...,依此类推,k的最后一位最后一位是56位密钥的第32位。生成与进行第i次迭代加密的数据进行按位异或的48位使用密钥:

1.1.5迭代

DES算法密钥生成需要进行16次迭代,在完成16次迭代前,循环执行1.1.3-1.1.4步.

最终形成16套加密密钥:key[0] , key[1] , key[2] ,…. key[14] , key[15] .

1. 2 数据的加密操作

1.2.1 取得数据

把明文数据分成64位的数据块,不够64位的数据块以适当的方式补足。

1.2.2 初始换位

表5.

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

按照表5所示把输入的64位数据的原第58位换到第一位,原第50位换到第二位,...,依此类推,最后的得到新的64位数据.

OldData newData

1.2.3 数据扩展

表6.

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

第一次迭代以1.2.2步中生成的newData作为输入数据,第i (i > 1)次迭代以第i-1次的64位输出数据为输入数据,把64位数据按位置等分成左右两部分:

保持left不变,根据表6把right由32位扩展成48位

把扩展后的48位right与第i次迭代生成的48位加密密钥进行按位异或操作

形成一个新的48位的right.

1.2.4 数据压缩

表7.1

1 2 3 4 5 6 7 8

1-8 0xe 0x0 0x4 0xf 0xd 0x7 0x1 0x4

9-1

0x2 0xe 0xf 0x2 0xb 0xd 0xb 0xe

6

17-

0x3 0xa 0xa 0x6 0x6 0xc 0xc 0xb

24

25-

0x5 0x9 0x9 0x5 0x0 0x3 0x7 0x8

32

33-

0x4 0xf 0x1 0xc 0xe 0x8 0x8 0x2

40

41-

0xd 0x4 0x6 0x9 0x2 0x1 0xb 0x7

48

49-

0xf 0x5 0xc 0xb 0x9 0x3 0x7 0xe

56

57-

0x3 0xa 0xa 0x0 0x5 0x6 0x0 0xd

64

表7.2

1 2 3 4 5 6 7 8

1-8 0xf 0x3 0x1 0xd 0x8 0x4 0xe 0x7

9-1

0x6 0xf 0xb 0x2 0x3 0x8 0x4 0xf

6

0x9 0xc 0x7 0x0 0x2 0x1 0xd 0xa 24

25-

0xc 0x6 0x0 0x9 0x5 0xb 0xa 0x5 32

33-

0x0 0xd 0xe 0x8 0x7 0xa 0xb 0x1 40

41-

0xa 0x3 0x4 0xf 0xd 0x4 0x1 0x2 48

49-

0x5 0xb 0x8 0x6 0xc 0x7 0x6 0xc 56

57-

0x9 0x0 0x3 0x5 0x2 0xe 0xf 0x9 64

表7.3

1 2 3 4 5 6 7 8 1-8 0xa 0xd 0x0 0x7 0x9 0x0 0xe 0x9 9-1

0x6 0x3 0x3 0x4 0xf 0x6 0x5 0xa 6

17-

0x1 0x2 0xd 0x8 0xc 0x5 0x7 0xe 24

25-

0xb 0xc 0x4 0xb 0x2 0xf 0x8 0x1 32

33-

0xd 0x1 0x6 0xa 0x4 0xd 0x9 0x0 40

41-

0x8 0x6 0xf 0x9 0x3 0x8 0x0 0x7 48

49-

0xb 0x4 0x1 0xf 0x2 0xe 0xc 0x3 56

57-

0x5 0xb 0xa 0x5 0xe 0x2 0x7 0xc 64

表7.4

1 2 3 4 5 6 7 8

1-8 0x7 0xd 0xd 0x8 0xe 0xb 0x3 0x5

9-1

0x0 0x6 0x6 0xf 0x9 0x0 0xa 0x3

6

17-

0x1 0x4 0x2 0x7 0x8 0x2 0x5 0xc

24

25-0xb 0x1 0xc 0xa 0x4 0xe 0xf 0x9

33-

0xa 0x3 0x6 0xf 0x9 0x0 0x0 0x6

40

41-

0xc 0xa 0xb 0xa 0x7 0xd 0xd 0x8

48

49-

0xf 0x9 0x1 0x4 0x3 0x5 0xe 0xb

56

57-

0x5 0xc 0x2 0x7 0x8 0x2 0x4 0xe

64

表7.5

1 2 3 4 5 6 7 8

1-8 0x2 0xe 0xc 0xb 0x4 0x2 0x1 0xc

9-1

0x7 0x4 0xa 0x7 0xb 0xd 0x6 0x1 6

17-

0x8 0x5 0x5 0x0 0x3 0xf 0xf 0xa 24

25-

0xd 0x3 0x0 0x9 0xe 0x8 0x9 0x6 32

33-

0x4 0xb 0x2 0x8 0x1 0xc 0xb 0x7 40

41-

0xa 0x1 0xd 0xe 0x7 0x2 0x8 0xd 48

49-

0xf 0x6 0x9 0xf 0xc 0x0 0x5 0x9 56

57-

0x6 0xa 0x3 0x4 0x0 0x5 0xe 0x3 64

表7.6

1 2 3 4 5 6 7 8 1-8 0xc 0xa 0x1 0xf 0xa 0x4 0xf 0x2

9-1

0x9 0x7 0x2 0xc 0x6 0x9 0x8 0x5 6

17-

0x0 0x6 0xd 0x1 0x3 0xd 0x4 0xe 24

25-

0xe 0x0 0x7 0xb 0x5 0x3 0xb 0x8 32

33-

0x9 0x4 0xe 0x3 0xf 0x2 0x5 0xc 40

0x2 0x9 0x8 0x5 0xc 0xf 0x3 0xa 48

49-

0x7 0xb 0x0 0xe 0x4 0x1 0xa 0x7 56

57-

0x1 0x6 0xd 0x0 0xb 0x8 0x6 0xd 64

表7.7

1 2 3 4 5 6 7 8

1-8 0x4 0xd 0xb 0x0 0x2 0xb 0xe 0x7

9-1

0xf 0x4 0x0 0x9 0x8 0x1 0xd 0xa

6

17-

0x3 0xe 0xc 0x3 0x9 0x5 0x7 0xc

24

25-

0x5 0x2 0xa 0xf 0x6 0x8 0x1 0x6

32

33-

0x1 0x6 0x4 0xb 0xb 0xd 0xd 0x8

40

41-

0xc 0x1 0x3 0x4 0x7 0xa 0xe 0x7

48

49-

0xa 0x9 0xf 0x5 0x6 0x0 0x8 0xf

56

57-

0x0 0xe 0x5 0x2 0x9 0x3 0x2 0xc

64

表7.8

1 2 3 4 5 6 7 8

1-8 0xd 0x1 0x2 0xf 0x8 0xd 0x4 0x8

9-1

0x6 0xa 0xf 0x3 0xb 0x7 0x1 0x4

6

17-

0xa 0xc 0x9 0x5 0x3 0x6 0xe 0xb

24

25-

0x5 0x0 0x0 0xe 0xc 0x9 0x7 0x2

32

33-

0x7 0x2 0xb 0x1 0x4 0xe 0x1 0x7

40

41-

0x9 0x4 0xc 0xa 0xe 0x8 0x2 0xd

48

49-0x0 0xf 0x6 0xc 0xa 0x9 0xd 0x0

57-

64

0xf 0x3 0x3 0x5 0x5 0x6 0x8 0xb

在1.2.3步中形成了48位的right值,

需要把48位的right值转换成32位的right值.把right视为由8个6位二进制块组成,

a,b….h都是6位,强制转换成10进制整数的值都不大于64 ,a,b…h转成10进制整数后,在对应的表中根据转换后整数值取得对应位置的替代值,

a对应表7.1

b对应表7.2

c对应表7.3

d对应表7.4

e对应表7.5

f对应表7.6

g对应表7.7

h对应表7.8

比如:

a = 32 ,那么到表7.1中找到32的位置,把对应的替代值0x8赋给a;

d = 53 ,那么到表7.4中找到的位置,把对应的替代值0x3赋给d ;

g = 16, 那么到表7.7中找到16的位置,把对应的替代值0xa赋给g;

每6位用一个4位替换这样就完成了从48位向32位数据的转换.

有些资料中介绍6位转4位的实现方法与本文所采用的不同,但殊途同归,最终的结果是相同的.

1.2.5 数据换位

表8

1 6 7

2

21 29 12 28 17

1 1226 5 18 31 10

5 3

2 8 2

4

14 32 27 3 9

1 9 1

3

3

6 22 11 4 25

把1.2.4步形成的32位right

根据表8进行转换:

数据的原第16位换到第一位,原第7位换到第二位,...,依此类推,最后得到新的32位数据.

1.2.6 交换数据

把right 和left按位异或后的值赋给right,然后将本轮输入的原始right值赋给left.

1.2.7 迭代

DES算法需要进行16次迭代,在完成16次迭代前,把第i-1次得到的的left和right的值作为第i次的输入数据,重复1.2.3~1.2.6的步骤,但是有一点要记住:在步骤1.2.3中第i次迭代要选择第i次迭代生成的密钥与数据进行按位异或.

1.2.8 数据整理

表9

4 0 8

4

8

16 56 24 64 32

3 9 7

4

7

15 55 23 63 31

3 8 6

4

6

14 54 22 62 30

3 7 5

4

5

13 53 21 61 29

3 6 4

4

4

12 52 20 60 28

3 5 3

4

3

11 51 19 59 27

3 4 2

4

2

10 50 18 58 26

3 3 1

4

1

9 49 17 57 25

为保证加密和解密的对称性,DES算法的前15次迭代每完成一次迭代都要交换left和right 的值,第16次迭代不交换两者的数值. 到此把32位的left和right合并成64位的Data

根据表9重新调整Data的位值

数据的原第40位换到第一位,原第8位换到第二位,...,依此类推,最后的得到新的64位.

Data即为密文.

1.3 数据的解密

数据解密的算法与加密算法相同,区别在于1.2.3步中和数据进行按位异或的密钥的使用顺序不同,在加密中是按照第i次迭代就采用第i次迭代生成的密钥进行异或,而解密时第i次迭代就采用第17-i次迭代生成的密钥和数据进行异或.

二.算法实现

笔者用c语言编写了的基于DES算法的核心加密解密程序并针对不同的加密解密需求封装了6个接口函数.

2. 1 算法实现接口函数的介绍

2.1.1 int des(char *data, char *key,int readlen)

参数:

1.存放待加密明文的内存指针(长度为readlen,可能经过填充;

2.存放用户输入的密钥内存的指针

3.待加密明文的长度(8字节的倍数)

功能:

生成加密密钥,把待加密的明文数据分割成64位的块,逐块完成16次迭代加密,密文存放在data所指向的内存中.

2.1.2 int Ddes(char *data, char *key,int readlen)

参数:

1.存放待解密文的内存指针(长度为readlen,可能经过填充;

2.存放用户输入的密钥内存的指针

3.待解密文的长度( 8字节的倍数)

功能:

生成解密密钥,把待解密文分割成64位的块,逐块完成16次迭代解密,解密后的明文存放在data所指向的内存中.

2.1.3 int des3(char *data, char *key, int n ,int readlen)

参数:

1.存放待加密明文的内存指针(长度为readlen,可能经过填充;

2.存放用户输入的密钥内存的指针

3.用户指定进行多少层加密

4.待加密明文的长度(8字节的倍数)

功能:

生成加密密钥,把待加密的明文分割成64位的块,把第i-1层加密后的密文作为第i 层加密的明文输入,根据用户指定的加密层数进行n层加密,最终生成的密文存放在data所指向的内存中.

说明:

用户仅仅输入一条密钥,所有的加密密钥都是由这条密钥生成.

2.1.4 int Ddes3(char *data, char*key, int n ,int readlen)

参数:

1.存放待解密文的内存指针(长度为readlen,可能经过填充;

2.存放用户输入的密钥内存的指针

3.用户指定进行多少层解密

4.待解密文的长度(8字节的倍数)

功能:

生成解密密钥,把待解密文分割成64位的块,把第i-1层解密后的"明文"作为第i层解密的密文输入,根据用户指定的解密层数进行n层解密,最终生成的明文存放在data所指向的内存中.

说明:

用户仅仅输入一条密钥,所有的解密密钥都是由这条密钥生成.

2.1.5 int desN(char*data,char**key,int n_key,int readlen)

参数:

1.存放待加密明文的内存指针(长度为readlen,可能经过填充;

2.存放用户输入的密钥内存的指针

3.用户指定了多少条密钥

4.待加密明文的长度(8字节的倍数)

功能:

生成加密密钥,把待加密的明文分割成64位的块,把第i-1层加密后的密文作为第i

层加密的明文输入,根据用户指定的加密层数进行n层加密,最终生成的密文存放在data所指向的内存中.

说明:

这里用户通过输入的密钥条数决定加密的层数,每轮16次迭代加密所使用的加密密钥是由用户自定的对应密钥生成.

2.1.6 int DdesN(char*data,char**key,intn_key,int readlen)

参数:

1.存放待解密文的内存指针(长度为readlen,可能经过填充;

2.存放用户输入的密钥内存的指针

3.用户指定了多少条密钥

4.待解密文的长度(8字节的倍数)

功能:

生成解密密钥,把待解密文分割成64位的块,把第i-1层解密后的”明文”作为第i层解密的密文输入,根据用户指定的解密层数进行n层解密,最终生成的明文存放在data所指向的内存中.

说明:

这里用户通过输入的密钥条数决定解密的层数,每轮16次迭代加密所使用的解密密钥是由用户自定的对应密钥生成.

源代码说明:

这是一个有关DES算法实现文件加密工具的代码,我把算法实现的代码封装在了一个DLL中.工程中已经把环境设置好了,无论选择Debug版本还是Release版本只需直接编译就行了.使用时把.exe文件和.dll文件拷贝到同一个目录中即可.

三.文件加密解密工具

3.1 实现的介绍

利用算法核心代码封装的接口函数笔者编写了一个针对文本文件的加密解密工具.下文叙述了在实践时的一些心得体会,希望能对读者有所裨益.

笔者选择把密文以16进制的形式写入文件的方法.当然也可以直接写入文件. 例:

密文为:12345678

在内存中显示为:

31 32 33 34 35 36 37 38

那么就把以3132333435363738的形式写入文件.

为了解密的方便,密文中的每个字节用两个字节表示,也即在内存中显示为0x9A 的内容,就以9A的形式写入文件中.当内存中显示的内容为0x0?(?代表0~F)形式

时,需要以0?的形式写入文件.

这样可以避开前面提及的问题,只是在解密时先按照两两组合的原则,顺序把从文件中读取的数据转换成待解的密文.

例:

读出的数据是:

3132333435363738

那么复原的过程:

31->1

32->2

33->3

….

38->8

最终得真正的密文12345678,这样就可以调用DES算法解密函数从密文得到明文.

DES算法是对固定大小(64位)的数据块进行加密解密操作的,对于那些不够64位的数据块需要采用填充机制补位到64位长,为了方便使用,数据位的填充是对用户而言是透明的,利用该工具进行加密解密操作时,用户只需输入操作的类型、读取数据的文件名、写入操作结果的文件名、密钥等信息.

操作思路:

#def ine READFILESIZE 512

步骤:

1.从文件中读取READFILESIZE个字节的数据

2.,如果从文件中读出的数据少于READFILESIZE个,以0补足,然后根据用户指定的类型对这READFILESIZE个字节的数据进行操作.

3.判断文件是否结束,没有则执行步骤1

4.把加密后的文件实际长度添加到密文的末尾

5.结束

采用一次只从文件读取READFILESIZE个字节是在为了防止由于需要加密或解密的文件太大导致内存不够的情况出现.

3.2 注意事项

DES算法的加密密钥是根据用户输入的密码生成的,该算法把64位密码中的第8位、第16位、第24位、第32位、第40位、第48位、第56位、第64位作为奇偶校验位,在计算密钥时要忽略这8位.如果输入的密码只是在这8位上有区别的话,那么操作后的结果将是一样的.

例:

输入的密码为wuzhenll,密钥的16进制表示为77 75 7A 68 65 6E 6C 6C

任意改变这64位数据的奇偶校验位,可以得到16个不同的密码,

把8个奇偶检验位全取反后:

w->v

u->t

z->{

h->i

e->d

n->o

l->m

形成新密码:vt{idomm

表面上新密码和原密码迥然不同,但是由于他们仅在奇偶校验位上有区别,所以用这两个密码进行加密解密操作得到的结果是一样的.

笔者建议使用安全系数较高的多密钥加密解密方案.

此外用户输入的密码的长度不受限制,当输入的密码长度为0时,使用缺省64位密码;当输入的密码长度大于8字节时,输入密码的前8个字节为有效密码.

该工具提供6种不同的操作类型:

1:一层加密;

2:一层解密;

3:N层单密钥加密;

4:N层单密钥解密;

5:N层多密钥加密;

6:N层多密钥解密;

这六种操作是对称使用的,例如:加密明文时选择一层加密,解密时对密文使用一层解密.

3.3 实现源码

笔者在此提供自编的DES算法的实现源码,读者可以直接使用接口函数实现加密解密操作,有兴趣自己动手实现的读者也可以把她作为一份参考..如发现问题请E-Mail给我.ok, Let’s go…

/*略去信息头,#include文件和函数申明*/

ULONG32 g_outkey[16][2] = { 0};/*输出的key*/

ULONG32 g_bufkey[2] = { 0};/*形成起始密钥*/

/*实现时多采用查表方式,下面是定义的供查找用的表*/

static ULONG8 wz_lefttable[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; static ULONG32 wz_leftandtab[3] = {0x0 , 0x80000000 , 0xc0000000 } ; static ULONG8 wz_keyleft[28] =

{

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

};

static ULONG8 wz_keyright[28] = {

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

};

static ULONG8 wz_keychoose[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

};

static ULONG8 wz_pc4[64] = { /*最后一次调整*/

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

};

static ULONG8 wz_pc1[64] = {/*第一次转换时用*/

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

} ;

static ULONG8 wz_pc3[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

} ;

static ULONG32 wz_pc2[64] = {

0x80000000L,0x40000000L,0x20000000L,0x10000000L,

0x8000000L,

0x4000000L, 0x2000000L, 0x1000000L, 0x800000L, 0x400000L,

0x200000L, 0x100000L, 0x80000L, 0x40000L, 0x20000L,0x10000L,

0x8000L, 0x4000L, 0x2000L, 0x1000L, 0x800L, 0x400L, 0x200L,

0x100L, 0x80L,0x40L,0x20L, 0x10L, 0x8L, 0x4L, 0x2L, 0x1L,

0x80000000L,0x40000000L,0x20000000L,0x10000000L, 0x8000000L,

0x4000000L, 0x2000000L, 0x1000000L, 0x800000L, 0x400000L,

0x200000L, 0x100000L, 0x80000L, 0x40000L, 0x20000L, 0x10000L,

0x8000L, 0x4000L, 0x2000L, 0x1000L, 0x800L, 0x400L, 0x200L,

0x100L, 0x80L, 0x40L,0x20L, 0x10L, 0x8L, 0x4L, 0x2L, 0x1L,

};

static ULONG8 exptab3[48] = {

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

};

static ULONG8 SP[8][64] =

{

{

0xe,0x0,0x4,0xf,0xd,0x7,0x1,0x4,0x2,0xe,0xf,0x2,0xb,

0xd,0x8,0x1,0x3,0xa,0xa,0x6,0x6,0xc,0xc,0xb,0x5,0x9,

0x9,0x5,0x0,0x3,0x7,0x8,0x4,0xf,0x1,0xc,0xe,0x8,0x8,

0x2,0xd,0x4,0x6,0x9,0x2,0x1,0xb,0x7,0xf,0x5,0xc,0xb,

0x9,0x3,0x7,0xe,0x3,0xa,0xa,0x0,0x5,0x6,0x0,0xd },

{

0xf,0x3,0x1,0xd,0x8,0x4,0xe,0x7,0x6,0xf,0xb,0x2,0x3,

0x8,0x4,0xf,0x9,0xc,0x7,0x0,0x2,0x1,0xd,0xa,0xc,0x6,

0x0,0x9,0x5,0xb,0xa,0x5,0x0,0xd,0xe,0x8,0x7,0xa,0xb,

0x1,0xa,0x3,0x4,0xf,0xd,0x4,0x1,0x2,0x5,0xb,0x8,0x6,

0xc,0x7,0x6,0xc,0x9,0x0,0x3,0x5,0x2,0xe,0xf,0x9

},

{

0xa,0xd,0x0,0x7,0x9,0x0,0xe,0x9,0x6,0x3,0x3,0x4,0xf,

0x6,0x5,0xa,0x1,0x2,0xd,0x8,0xc,0x5,0x7,0xe,0xb,0xc,

0x4,0xb,0x2,0xf,0x8,0x1,0xd,0x1,0x6,0xa,0x4,0xd,0x9,

0x0,0x8,0x6,0xf,0x9,0x3,0x8,0x0,0x7,0xb,0x4,0x1,0xf,

0x2,0xe,0xc,0x3,0x5,0xb,0xa,0x5,0xe,0x2,0x7,0xc

},

{

0x7,0xd,0xd,0x8,0xe,0xb,0x3,0x5,0x0,0x6,0x6,0xf,0x9,

0x0,0xa,0x3,0x1,0x4,0x2,0x7,0x8,0x2,0x5,0xc,0xb,0x1,

0xc,0xa,0x4,0xe,0xf,0x9,0xa,0x3,0x6,0xf,0x9,0x0,0x0,

0x6,0xc,0xa,0xb,0xa,0x7,0xd,0xd,0x8,0xf,0x9,0x1,0x4,

0x3,0x5,0xe,0xb,0x5,0xc,0x2,0x7,0x8,0x2,0x4,0xe

},

{

0x2,0xe,0xc,0xb,0x4,0x2,0x1,0xc,0x7,0x4,0xa,0x7,0xb,

0xd,0x6,0x1,0x8,0x5,0x5,0x0,0x3,0xf,0xf,0xa,0xd,0x3,

0x0,0x9,0xe,0x8,0x9,0x6,0x4,0xb,0x2,0x8,0x1,0xc,0xb,

0x7,0xa,0x1,0xd,0xe,0x7,0x2,0x8,0xd,0xf,0x6,0x9,0xf,

0xc,0x0,0x5,0x9,0x6,0xa,0x3,0x4,0x0,0x5,0xe,0x3

},

{

0xc,0xa,0x1,0xf,0xa,0x4,0xf,0x2,0x9,0x7,0x2,0xc,0x6,

0x9,0x8,0x5,0x0,0x6,0xd,0x1,0x3,0xd,0x4,0xe,0xe,0x0,

0x7,0xb,0x5,0x3,0xb,0x8,0x9,0x4,0xe,0x3,0xf,0x2,0x5,

0xc,0x2,0x9,0x8,0x5,0xc,0xf,0x3,0xa,0x7,0xb,0x0,0xe,

0x4,0x1,0xa,0x7,0x1,0x6,0xd,0x0,0xb,0x8,0x6,0xd

},

{

0x4,0xd,0xb,0x0,0x2,0xb,0xe,0x7,0xf,0x4,0x0,0x9,0x8,

0x1,0xd,0xa,0x3,0xe,0xc,0x3,0x9,0x5,0x7,0xc,0x5,0x2,

0xa,0xf,0x6,0x8,0x1,0x6,0x1,0x6,0x4,0xb,0xb,0xd,0xd,

0x8,0xc,0x1,0x3,0x4,0x7,0xa,0xe,0x7,0xa,0x9,0xf,0x5,

0x6,0x0,0x8,0xf,0x0,0xe,0x5,0x2,0x9,0x3,0x2,0xc

},

{

0xd,0x1,0x2,0xf,0x8,0xd,0x4,0x8,0x6,0xa,0xf,0x3,0x b,

0x7,0x1,0x4,0xa,0xc,0x9,0x5,0x3,0x6,0xe,0xb,0x5,0x0,

0x0,0xe,0xc,0x9,0x7,0x2,0x7,0x2,0xb,0x1,0x4,0xe,0x1,

0x7,0x9,0x4,0xc,0xa,0xe,0x8,0x2,0xd,0x0,0xf,0x6,0xc,

0xa,0x9,0xd,0x0,0xf,0x3,0x3,0x5,0x5,0x6,0x8,0xb }

};

/*函数实现*/

INT32 DdesN(ULONG8 *data, ULONG8 **key, ULONG32 n_key,ULONG32 readlen)

{

INT32 i ;

for ( i = n_key ; i > 0 ; i--)

{

Ddes(data,key[i-1],readlen);

}

return SUCCESS;

}

INT32 desN(ULONG8 *data, ULONG8 **key, ULONG32 n_key,ULONG32 readlen)

{

ULONG32 i = 0;

for ( i = 0 ; i < n_key ; i++)

{

des(data,key[i],readlen);

}

return SUCCESS;

}

INT32 des3(ULONG8 *data, ULONG8 *key,ULONG32 n ,ULONG32 readlen) {

ULONG32 i = 0 , j = 0 ;

makef irstkey((ULONG32*)key) ; /*产生密钥*/

for ( i = 0 ; i < n ; i++)

{

for ( j = 0 ; j < readlen ; j += 8)

{

handle_data( (ULONG32*)&data[j], DESENCRY );

}

}

return SUCCESS;

}

INT32 Ddes3(ULONG8 *data,ULONG8 *key,ULONG32 n ,ULONG32 readlen) {

ULONG32 i = 0 , j = 0 ;

makef irstkey((ULONG32*)key) ; /*产生密钥*/

for ( i = 0 ; i < n ; i++)

{

for ( j = 0 ; j < readlen ; j += 8)

{

handle_data( (ULONG32*)&data[j], DESDECRY );

}

}

return SUCCESS;

}

INT32 des(ULONG8 *data, ULONG8 *key,INT32 readlen)

{

INT32 i = 0;

makef irstkey((ULONG32*)key) ; /*产生密钥*/

for ( i = 0 ; i < readlen ; i += 8)

{

handle_data( (ULONG32*)&data[i], DESENCRY );

}

return SUCCESS;

}

INT32 Ddes(ULONG8 *data,ULONG8 *key,INT32 readlen)

{

INT32 i = 0;

makef irstkey((ULONG32*)key) ;

for ( i = 0 ; i < readlen ; i += 8)

{

handle_data( (ULONG32*)&data[i] ,DESDECRY);

}

return SUCCESS;

}

INT32 handle_data(ULONG32 *left , ULONG8 choice)

{

INT32 number = 0 ,j = 0;

ULONG32 *right = &left[1] ;

ULONG32 tmp = 0;

ULONG32 tmpbuf[2] = { 0 };

/*第一次调整wz_pc1[64]*/

for ( j = 0 ; j < 64 ; j++)

{

if (j < 32 )

{

if ( wz_pc1[j] > 32)/*属于right*/

{

if ( *right&wz_pc2[wz_pc1[j]-1] )

{

tmpbuf[0] |= wz_pc2[j] ;

}

}

else

{

if ( *left&wz_pc2[wz_pc1[j]-1] )

{

tmpbuf[0] |= wz_pc2[j] ;

}

}

}

else

{

if ( wz_pc1[j] > 32)/*属于right*/

{

DES算法Java实现源代码

package des; /** * 加密过程: * 1.初始置换IP:将明文顺序打乱重新排列,置换输出为64位。 * 2.将置换输出的64位明文分成左右凉拌,左一半为L0,右一半称为R0,各32位。 * 3。计算函数的16轮迭代。 * a)第一轮加密迭代:左半边输入L0,右半边输入R0:由轮函数f实现子密钥K1对R0的加密, * 结果为32位数据组f(R0,K1), * b)第二轮加密迭代:左半边输入L1=R0,右半边输入R1=L0⊕f(R0,K1),由轮函数f实现子密钥 * K2对R1的加密,结果为32位数据组f(R1,K2),f(R1,K2)与L1模2相加,得到一个32为数据组L1⊕f(R1,K2). * c)第3到16轮迭代分别用密钥K3,K4……K16进行。4.再经过逆初始置换IP-1,将数据打乱重排,生成64位密文。 * * 子密钥生成过程: * 1.将64位的密钥经过PC-1置换生成56位密钥。 * 2.将56位的密钥分成左右两部分,分别进行移位操作(一共进行16轮),产生16个56位长度的子密钥。 * 3.将16个56位的子密钥分别进行PC-2置换生成16个48位的子密钥。 * * 轮函数f的工作过程: * 1.在第i次加密迭代过程中,扩展置换E对32位的Ri-1的各位通过置换表置换为48位的输出。 * 2.将该48位的输出与子密钥Ki进行异或操作,运算结果经过S盒代换运算,得到一个32位比特的输出。 * 3。该32位比特输出再经过P置换表进行P运算,将其各位打乱重排,生成32位的输出。 * * author Ouyang * */ public class Des { int[] byteKey; public Des(int[] byteKey) { this.byteKey = byteKey; } private static final int[] 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,

简化DES加密算法

数据加密标准DES(Data Encryption Standard)算法是由美国IBM公司研制的一种分组密码算法,一种迭代分组密码。 DES是一种使用最为广泛的加密算法,虽然DES出现后又产生了许多常规加密算法,但DES仍是此类算法中最重要的一种。 在正式讨论DES算法之前,为了更好的理解算法的实际工作过程,我们先来看一个简化的DES算法,以此加深对DES算法的理解。 一、简化的DES加密算法 简化的DES加密算法是以8bit的明文分组和10bit密钥作为输入,产生8bit 密文分组作为输出。 1、加密流程 简化的DES算法基本加密流程如图6.9所示 图6.9 简化的DES的加密过程

2、加密算法构成: 函数、SW置换函简单DES的加密算法包括4个基本函数:初始置换函数IP、f k 数、逆置换函数IP-1。 (1)初始置换函数IP 初始置换IP是将明文中数据的排列顺序按一定的规则重新排列,而生成新的数据序列的过程。如图6.10所示: 8bit原数据位置 1 2 3 4 5 6 7 8 【IP置换】 经IP置换后的数据位置 2 6 3 1 4 8 5 7 图6.10 简单DES的初始置换 例:设8bit数据为11110011 ,则初始置换后的结果为: 函数f k函数是多个置换函数和替代函数的组合函数。f k函数首先将输(2) f k 入它的8bit数据进行分组,分成左4位和右4位,然后对右组的4位数据进行E/P扩展置换运算,接着将扩展置换所得的8bit数据与子密钥进行异或运算,再将异或运算所得结果通过S盒输出,再将通过S盒输出的数据进行P4置换,最后将经过P4置换后的数据与输入f 函数经分组的左4位数据进行异或运算。 k F(R,SK)函数是f k函数的核心函数,其中SK是子密钥。F(R,SK)函数的运算方法如下:f k(L,R)=(L⊕F(R,SK),R)L:输入的左边4位分组 R:输入的右边4位分组⊕:逐位异或 ①扩展/置换是将4bit输入数据经过置换和扩展而产生8bit数据的算法。 如图6.11所示: E/P扩展置换前 1 2 3 4 E/P扩展置换 E/P扩展置换后 4 1 2 3 2 3 4 1

DES加密算法的实现

常州工学院 计算机信息工程学院 《数据结构》课程设计报告 题目 DES加密算法的实现 班级 14软一 学号姓名王磊(组长) 学号姓名王凯旋 学号姓名陶伟 2016年01月06日

一,实验名称: DES加密算法的实现 二,实验内容: a)熟悉DES算法的基本原理; b)依据所算则的算法,编程实现该该算法; c)执行程序并分析结果; 三,实验原理 1,概述 DES是一种分组加密算法,他以64位为分组对数据加密。64位一组的明文从算法的一端输入,64位的密文从另一端输出。DES是一个对称算法:加密和解密用的是同一个算法(除密钥编排不同以外)。密钥的长度为56位(密钥通常表示为64位的数,但每个第8位都用作奇偶检验,可以忽略)。密钥可以是任意的56位数,且可以在任意的时候改变。 DES算法的入口参数有3个:Key,Data,Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或解密的数据:Mode为DES的工作方式,有两种:加密或解密。 DES算法的工作过程:若Mode为加密,则用Key对数据Data进行加密,生成Data的密码形式(64位)作为DES的输出结果;若Mode 为解密,则用Key对密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。

2,DES算法详述 DES算法把64位的明文输入块变为64位的密文输出块,他所使用的密钥也是64位,DES对64 位的明文分组进行操作。通过一个初始置换,将明文分组分成左半部分和右半部分,各32位长。然后进行16轮相同的运算,这些相同的运算被称为函数f,在运算过程中数据和密钥相结合。经过16轮运算后左、右部分在一起经过一个置换(初始置换的逆置换),这样算法就完成了。 (1)初始置换 其功能是把输入的64位数据块按位重新组合,并把输出分为L0,R0两部分,每部分各长32位, 即将输入的第58位换到第1位,第50位换到第2位,…,依次类推,最后一位是原来的第7位,L0,R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位。。 (2)逆置换 经过16次迭代运算后,得到L16,R16,将此作为输入进行逆置换,即得到密文输出。逆置换正好是初始置换的逆运算。例如,第1位经过初始置换后,处于第40位,而通过逆置换,又将第40位换回到第1位。 (3)函数f(Ri,Ki)的计算 “扩展置换”是将32位放大成48位,“P盒置换”是32位到32位换位, 在(Ri,Ki)算法描述图中,选择函数功能是把6 b数据变为4 b数

DES加密算法的JAVA实现

目录 摘要 (3) 一、目的与意义 (4) 二、DES概述 (5) 三、DES加解密算法原理 (7) 1.加密 (6) 2.子密钥生成 (11) 3.解密 (13) 四、加解密算法的实现 (14) 1.软件版本 (14) 2.平台 (14) 3.源代码 (14) 4.运行结果 (24) 五、总结 (25)

【摘要】1973年5月15 日,美国国家标准局(现在的美国国家标准就是研究所,即NIST)在联邦记录中公开征集密码体制,这一举措最终导致了数据加密标准(DES)的出现,它曾经成为世界上最广泛使用的密码体制。DES由IBM开发,它是早期被称为Lucifer体制的改进。DES在1975年3月17日首次在联邦记录中公布,在经过大量的公开讨论后,1977年2月15日DES被采纳为“非密级”应用的一个标准。最初预期DES作为标准只能使用10~15年;然而,事实证明DES要长寿得多。被采纳后,大约每隔5年就被评审一次。DES的最后一次评审是在1999年1月。 本文阐述了DES发展现状及对网络安全的重要意义,并在此基础上对DES算法原理进行详细的介绍和分析。通过应用DES算法加解密的具体实现,进一步加深对DES算法的理解,论证了DES算法具有加密快速且强壮的优点,适合对含有大量信息的文件进行加密,同时分析了DES算法密钥过短(56位)所带来的安全隐患。 【关键词】DES 加密解密明文密文

一、目的与意义 随着计算机和通信网络的广泛应用,信息的安全性已经受到人们的普遍重视。信息安全已不仅仅局限于政治,军事以及外交领域,而且现在也与人们的日常生活息息相关。现在,密码学理论和技术已得到了迅速的发展,它是信息科学和技术中的一个重要研究领域。在近代密码学上值得一提的大事有两件:一是1977年美国国家标准局正式公布实施了美国的数据加密标准(DES),公开它的加密算法,并批准用于非机密单位及商业上的保密通信。密码学的神秘面纱从此被揭开。二是Diffie和Hellman联合写的一篇文章“密码学的新方向”,提出了适应网络上保密通信的公钥密码思想,拉开了公钥密码研究的序幕。 DES(Data Encryption Standard)是IBM公司于上世纪1977年提出的一种数据加密算法。在过去近三十年的应用中,还无法将这种加密算法完全、彻底地破解掉。而且这种算法的加解密过程非常快,至今仍被广泛应用,被公认为安全的。虽然近年来由于硬件技术的飞速发展,破解DES已经不是一件难事,但学者们似乎不甘心让这样一个优秀的加密算法从此废弃不用,于是在DES的基础上有开发了双重DES(DoubleDES,DDES)和三重DES(Triple DES,TDES)。 在国内,随着三金工程尤其是金卡工程的启动,DES 算法在POS、ATM、磁卡及智能卡(IC 卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN 码加密传输,IC 卡与POS 间的双向认证、金融交易数据包的MAC 校验等,均用到DES 算法。DES加密体制是ISO颁布的数据加密标准。 因此研究DES还是有非常重要的意义。

DES算法及其程序实现

DES算法及其程序实现 一.D ES算法概述 ①DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。 ②DES算法的特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。 ③DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,整个算法的主流程图如下: 二.D ES算法的编程实现 #include #include using namespace std;

const static char 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 }; const static char fp[] = { //最终置换 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 }; const static char sbox[8][64] = { //s_box /* S1 */ 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, /* S2 */ 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, /* S3 */ 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, /* S4 */ 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,

DES加密算法实验报告

苏州科技学院 实验报告 学生姓名:杨刘涛学号:1220126117 指导教师:陶滔 刘学书1220126114 实验地点:计算机学院大楼东309 实验时间:2015-04-20 一、实验室名称:软件实验室 二、实验项目名称:DES加解密算法实现 三、实验学时:4学时 四、实验原理: DES算法由加密、子密钥和解密的生成三部分组成。现将DES算法介绍如下。1.加密 DES算法处理的数据对象是一组64比特的明文串。设该明文串为m=m1m2…m64 (mi=0或1)。明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。其加密过程图示如下:

图2-1:DES算法加密过程 对DES算法加密过程图示的说明如下: 待加密的64比特明文串m,经过IP置换(初始置换)后,得到的比特串的下标列表如下: 表2-1:得到的比特串的下标列表

该比特串被分为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(终结置换)后所得比特串的下标列表如下: 表2-2:置换后所得比特串的下标列表 经过置换IP-1后生成的比特串就是密文e。 变换f(Ri-1,Ki): 它的功能是将32比特的输入再转化为32比特的输出。其过程如图2-2所示:

DES加密算法设计(含程序)

DES加密算法分析 [摘要]DES数据加密算法是使用最广的分组加密算法,它作为最著名的保密密钥或对称密钥加密算法,在计算机密码学及计算机数据通信的发展过程中起了重要作用。本次学年论文是主要是学习介绍DES对 称密钥数据加密算法,并用c++实现。DES算法具有较高的安全性,为我们进行一般的计算机数据传输活 动提供了安全保障。 [关键词] 加密与解密,DES算法,S-盒 引言 密码学是伴随着战争发展起来的一门科学,其历史可以追溯到古代,并且还有过辉煌的经历。但成为一门学科则是近20年来受计算机科学蓬勃发展的刺激结果。今天在计算机被广泛应用的信息时代,信息本身就是时间,就是财富。如何保护信息的安全(即密码学的应用)已不再局限于军事、政治和外交,而是扩大到商务、金融和社会的各个领域。特别是在网络化的今天,大量敏感信息(如考试成绩、个人简历、体检结果、实验数据等)常常要通过互联网进行交换。(现代电子商务也是以互联网为基础的。)由于互联网的开放性,任何人都可以自由地接入互联网,使得有些不诚实者就有可能采用各种非法手段进行破坏。因此人们十分关心在网络上交换信息的安全性。普遍认为密码学方法是解决信息安全保护的一个最有效和可行的方法。有效是指密码能做到使信息不被非法窃取,不被篡改或破坏,可行是说它需要付出的代价是可以接受的。 密码是形成一门新的学科是在20世纪70年代。它的理论基础之一应该首推1949年Shannon的一篇文章“保密系统的通信理论”,该文章用信息论的观点对信息保密问题作了全面的阐述。这篇文章过了30年后才显示出它的价值。1976年,Diffie和Hellman发表了论文《密码学的新方向》,提出了公钥密码体制的新思想,这一思想引发了科技界对研究密码学的极大兴趣,大量密码学论文开始公开发表,改变了过去只是少数人关起门来研究密码学的状况。同时为了适应计算机通信和电子商务迅速发展的需要,密码学的研究领域逐渐从消息加密扩大到数字签名、消息认证、身份识别、抗欺骗协议等新课题[1]。 美国国家标准局(NBS)1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,并批准用于非机密单位及商业上的保密通信。于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告。1977年1月,美国政府颁布:采用IBM公司1971年设计出的一个加密算法作为非机密数据的正式数据加密标准(DES : Data Encryption Standard)。DES广泛应用于商用数据加密,算法完全公开,这在密码学史上是一个创举[2]。 在密码学的发展过程中,DES算法起了非常重要的作用。本次学年论文介绍的就是分组加密技术中最典型的加密算法——DES算法。 1概述 1.1加密与解密 加密技术是基于密码学原理来实现计算机、网络乃至一切信息系统安全的理论与技术基础。简单的说,加密的基本意思是改变信息的排列形式,使得只有合法的接受才能读懂,任何他人即使截取了该加密信息也无法使用现有的手段来解读。解密是我们将密文转换成能够直接阅读的文字(即明文)的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密

DES算法源代码

#include #include void main() { //声明变量 char MingWen[104]; //存放原始的明文 char target[8]; //将明文断成8个字符的一个分组 char InputKey[8]; //存放字符型的八位密钥 int text[64]; //存放一个分组转成二进制后的数据 int text_ip[64]; //存放第一次初始换位的结果 int L0[32],Li[32]; //将64位分成左右各32位进行迭代 int R0[32],Ri[32]; int RE0[48]; //存放右半部分经过E表扩展换位后的48位数据 int key[64]; //存放密钥的二进制形式 int keyPC1[56]; //存放密钥key经过PC1换位表后变成的56位二进制 int A[28]; //将keyPC1分成左右两部分,左部A,右部B,各28位,以便进行循环左移 int B[28]; int keyAB[56]; //将循环左移后两部分的结果合并起来 int K[16][48]; //存放16次循环左移产生的子密钥 int RK[48]; //存放RE和K异或运算后的结果 int RKS[8]; //存放经过查找8个S表后得到的8个十进制结果 int SP[32]; //将RKS表中的十进制数化成二进制 int RKSP[32]; //存放SP表经过P盒换位后的结果 int text_end[64]; //存放经过左右32位换位后的结果 int text_out[14][64]; //存放初始化向量和所有经过DES的分组的二进制

des加密算法的实现及应用

DES加密算法的实现及应用 学生姓名:梁帅指导老师:熊兵 摘要随着信息与通信技术的迅猛发展和广泛应用,人们通过互联网进行信息交流,难免涉及到密码保护问题,这就需要使用DES加密技术来对数据进行加密保护。本课程设计介绍了DES加密的基本原理以及简单的实现方法。本课程设计基于C语言,采用DES算法技术,设计了DES加密程序,实现了DES加密解密功能。经测试,程序能正常运行,实现了设计目标。 关键词DES加密,C语言,信息交流

1 引言 1.1本文主要内容 DES是一个分组密码算法,使用64位密钥(除去8位奇偶校验,实际密钥长度为56位)对64比特的数据分组(二进制数据)加密,产生64位密文数据。DES是一个对称密码体制,加密和解密使用同意密钥,解密和加密使用同一算法(这样,在硬件与软件设计时有利于加密单元的重用)。DES的所有的保密性均依赖于密钥。 DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。 DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密,生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性 DES的加密过程: 第一阶段:初始置换IP。在第一轮迭代之前,需要加密的64位明文首先通过初始置换IP 的作用,对输入分组实施置换。最后,按照置换顺序,DES将64位的置换结果分为左右两部分,第1位到第32位记为L0,第33位到第64位记为R0。 第二阶段:16次迭代变换。DES采用了典型的Feistel结构,是一个乘积结构的迭代密码算法。其算法的核心是算法所规定的16次迭代变换。DES算法的16才迭代变换具有相同的结构,每一次迭代变换都以前一次迭代变换的结果和用户密钥扩展得到的子密钥Ki作为输入;每一次迭代变换只变换了一半数据,它们将输入数据的右半部分经过函数f后将其输出,与输入数据的左半部分进行

DES算法源代码

void main() { //声明变量 char MingWen[104]; //存放原始的明文 char target[8]; //将明文断成8个字符的一个分组 char InputKey[8]; //存放字符型的八位密钥 int text[64]; //存放一个分组转成二进制后的数据 int text_ip[64]; //存放第一次初始换位的结果 int L0[32],Li[32]; //将64位分成左右各32位进行迭代 int R0[32],Ri[32]; int RE0[48]; //存放右半部分经过E表扩展换位后的48位数据 int key[64]; //存放密钥的二进制形式 int keyPC1[56]; //存放密钥key经过PC1换位表后变成的56位二进制 int A[28]; //将keyPC1分成左右两部分,左部A,右部B,各28位,以便进行循环左移 int B[28]; int keyAB[56]; //将循环左移后两部分的结果合并起来 int K[16][48]; //存放16次循环左移产生的子密钥 int RK[48]; //存放RE和K异或运算后的结果 int RKS[8]; //存放经过查找8个S表后得到的8个十进制结果 int SP[32]; //将RKS表中的十进制数化成二进制 int RKSP[32]; //存放SP表经过P盒换位后的结果 int text_end[64]; //存放经过左右32位换位后的结果 int text_out[14][64]; //存放初始化向量和所有经过DES的分组的二进制 char init[9]={"HTmadeit"}; //设置初始化向量为“HTmadeit” int CBC[64]; int result[13][64];

DES算法实现过程分析

DES算法实现过程分析 来源:中国论文下载中心 [ 03-03-18 14:30:00 ] 作者:本站会员编辑:丢oO丢oO 1. 处理密钥: 1.1 从用户处获得64位密钥.(每第8位为校验位,为使密钥有正确的奇偶校验,每个密钥要有奇数个”1”位.(本文如未特指,均指二进制位) 1.2 具体过程: 1.2.1 对密钥实施变换,使得变换以后的密钥的各个位与原密钥位对应关系如下表所示: 表一为忽略校验位以后情况 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 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 1.2.2 把变换后的密钥等分成两部分,前28位记为C[0], 后28位记为D[0]. 1.2.3 计算子密钥(共16个),从i=1开始。 1.2.3.1 分别对C[i-1],D[i-1]作循环左移来生成C[i],D[i].(共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 1.2.3.2 串联C[i],D[i],得到一个56位数,然后对此数作如下变换以产生48位子密钥K[i]。变换过程如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 14 17 11 24 1 5 3 28 15 6 21 10 23 19 12 4 26 8 16 7 27 20 13 2 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 41 52 31 37 47 55 30 40 51 45 33 48 44 49 39 56 34 53 46 42 50 36 29 32 1.2.3.3 按以上方法计算出16个子密钥。 2.对64位数据块的处理: 2.1 把数据分成64位的数据块,不够64位的以适当的方式填补。 2.2对数据块作变换。 bit goes to bit bit goes to bit 58 1 57 33 50 2 49 34

DES算法的简介及编程实现

实验一DES算法 实验目的: 1.深入了解DES算法的原理、特点、密钥及输入输出 2.通过编程来模拟DES算法的加密及解密过程 实验内容: 一.D ES算法概述 ①DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。 ②DES算法的特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。 ③DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,整个算法的主流程图如下:

二.D ES算法的编程实现 #include #include using namespace std; const static char 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 }; const static char fp[] = { //最终置换 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 }; const static char sbox[8][64] = { //s_box /* S1 */ 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, /* S2 */ 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, /* S3 */ 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, /* S4 */

DES加密算法详解

DES加密算法详解- - 对加密解密一直挺喜欢的,可还是没有怎么好好学习过,希望这是一个好的开始。 在网上搜了一下关于DES的说明,发现有些杂乱,所以还是有必要整合一下。 写了一点代码,还没有完成,不过,还不能编译通过,^_^ 刚看了一下,发现还是说得够模糊的,有机会再整理一下。 昏倒,一直运行不对,今天才仔细查出来,原来问题是出在Des_Data_P(const _b32& input, _b32 output), 我的output用了传值调用,失败呀。应该是Des_Data_P(const _b32& input, _b32 & output) DES算法的入口参数有三个: Key, Data, Mode Key 为64bit密钥,Data为64bit数据,Mode为加密还是解密。 DES算法的过程: 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位,...... 以此类推。变换后得到56b it数据,将它分成两部分,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, 1 6, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 4 6, 42, 50, 36, 29, 32, 表的意思是第14位移到第1位,第17位移到第2位,以此类推。在此过程中,发现第9,18,22,25,35,38,43,54位丢弃。 4. 对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]。 5. 加密过程,对R[i][32]进行扩展变换成48位数,方法如下,记为E(R[i][32]) 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,

DES算法实现 课程设计

通达学院课程设计Ⅱ报告( 2016/ 2017学年第 1 学期) 题目: DES算法实现 专业计算机科学与技术(信息安全) 学生姓名 班级学号 指导教师王波 指导单位计算机学院信息安全系 日期

DES算法的实现 一、课题内容和要求 对称加密就是加密和解密所用的密钥是一样的,加密的强度很大程度上在于密钥的强度以及加密算法的保密,最常见的对称加密算法有DES、IDEA、RC4、RC5等。本设计题要求实现DES加密和解密算法,能对文件实现加解密。 二、对设计要求的理解 DES是一个分组密码算法,使用64位密钥(除去8位奇偶校验,实际密钥长度为56位)对64比特的数据分组(二进制数据)加密,产生64位密文数据。DES是一个对称密码体制,加密和解密使用同意密钥,解密和加密使用同一算法(这样,在硬件与软件设计时有利于加密单元的重用)。DES的所有的保密性均依赖于密钥。 程序主要采取对数据的位操作的形式,把明密文文件中的内容以字节为单位读取,每次读取8个byte共65bits,然后使用标准DES的算法依次对读取的64bits明密文进出加解密处理。文件的路径的输入有比较严格的格式约束。如:盘符名:\\文件名.txt 格式错误则会导致文件打开失败,不能进行加解密操作。 三、概要设计 这个程序主要是 DES算法部分的加密和解密,还有后面对文件的操作。 程序主要流程图如下: 图-1 程序流程图

这个程序的关键在DES算法的操作,主要有下的主要步骤: 1.初始置换 IP; 2.子密钥 Ki 的获取; 3.密码函数 f ; 4.尾置换 IP-1 ; 下面是具体的几个过程: 1)初始置换IP 这一部分很简单,IP(initial permutation)是一个 8x8 的置换表: int 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 }; 根据表中的规定,将输入的 64 位明文重新进行排序,即将第 58 位放到第 1 位,第 50 位放到第 2 位……以此类推。初始置换以后得到的是一个 64 位的输出。 2)子密钥 Ki 的获取 用户输出的密钥是 64 位的,根据密钥置换表PC-1,将 64 位变成 56 位密钥。(去掉了奇偶校验位)将 PC-1 置换得到的 56 位密钥,分为前28位 C0 和后28位 D0,分别对它们进行循环左移,C0左移得到 C1,D0 左移得到 D1。将 C1 和 D1 合并成 56 位,然后通过PC-2表进行压缩置换,得到当前这一轮的 48 位子密钥 K1 。然后对 C1 和 D1 进行左移和压缩置换,获取下一轮的子密钥……一共进行16轮,得到 16 个 48 位的子密钥。 3)密码函数 f ●密码函数f(R, K)接受两个输入:32 位的数据和 48 位的子密钥。然后: ●通过表 E 进行扩展置换,将输入的 32 位数据扩展为 48 位; ●将扩展后的 48 位数据与 48 位的子密钥进行异或运算; ●将异或得到的 48 位数据分成 8 个 6 位的块,每一个块通过对应的一个 S 表产 生一个 4 位的输出。 其中,每个 S 表都是 4 行 16 列。具体的置换过程如下:把 6 位输入中的第 1 位和第 6 位取出来行成一个两位的二进制数 x ,作为 Si 表中的行数(0~3);把 6 位

DES加密算法与解密(带流程图)

一、DES加密及解密算法程序源代码: #include using namespace std; const static char IP_Table[] = { //IP_Table置换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 }; const static char Final_Table[] = { //最终置换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 }; const static char S_Box[8][64] = { //s_box /* S1 */ {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}, /* S2 */ {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}, /* S3 */ {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},

相关文档
相关文档 最新文档