当前位置:首页 > DES加密与解密算法的介绍和实现(有程序)
5 2 8 1
1
3 24 3
14 32
27
3 4
9 25
6 22 11
9 3 0
把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 40 39 38 37 36 35 34 33
8 7 6 5 4 3 2 1
48 47 46 45 44 43 42 41
16 56 15 55 14 54 13 53 12 52 11 51 10 50 9
49
24 23 22 21 20 19 18 17
64 63 62 61 60 59 58 57
32 31 30 29 28 27 26 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)形式
共分享92篇相关文档