DES算法的介绍和实现

 
::首页 >> 文档中心 >> 在线杂志 >> 加解密[ 在线杂志 第14期 ]

[ 原创文档 本文适合高级读者 已阅读17491次 ]


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.
5749413325179
1585042342618
1025951433527
1911360504436

表2.
65554739312315
7625446383022
1466153453729
211352820124

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


1.1.3 密钥移位

表3.
i12345678
ǿ 11222222
i910111213141516
ǿ12222221

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.
1417112415328
15621102319124
2681672720132
4152313747553040
5145334844493956
3453464250362932

在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.
585042342618102
605244362820124
625446383022146
645648403224168
57494133251791
595143352719113
615345372921135
635547393123157
按照表5所示把输入的64位数据的原第58位换到第一位,原第50位换到第二位,...,依此类推,最后的得到新的64位数据.
OldData newData


1.2.3 数据扩展

表6.
321234545
6789891011
1213121314151617
1617181920212021
2223242524252627
282928293031321
第一次迭代以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
 12345678
1-80xe0x00x40xf0xd0x70x10x4
9-160x20xe0xf0x20xb0xd0xb0xe
17-240x30xa0xa0x60x60xc0xc0xb
25-320x50x90x90x50x00x30x70x8
33-400x40xf0x10xc0xe0x80x80x2
41-480xd0x40x60x90x20x10xb0x7
49-560xf0x50xc0xb0x90x30x70xe
57-640x30xa0xa0x00x50x60x00xd

表7.2
1234 5678
1-80xf0x30x10xd0x80x40xe0x7
9-160x60xf0xb0x20x30x80x40xf
17-240x90xc0x70x00x20x10xd0xa
25-320xc0x60x00x90x50xb0xa0x5
33-400x00xd0xe0x80x70xa0xb0x1
41-480xa0x30x40xf0xd0x40x10x2
49-560x50xb0x80x60xc0x70x60xc
57-640x90x00x30x50x20xe0xf0x9

表7.3

12345678
1-80xa0xd0x00x70x90x00xe0x9
9-160x60x30x30x40xf0x60x50xa
17-240x10x20xd0x80xc0x50x70xe
25-320xb0xc0x40xb0x20xf0x80x1
33-400xd0x10x60xa0x40xd0x90x0
41-480x80x60xf0x90x30x80x00x7
49-560xb0x40x10xf0x20xe0xc0x3
57-640x50xb0xa0x50xe0x20x70xc

表7.4
 12345678
1-80x70xd0xd0x80xe0xb0x30x5
9-160x00x60x60xf0x90x00xa0x3
17-240x10x40x20x70x80x20x50xc
25-320xb0x10xc0xa0x40xe0xf0x9
33-400xa0x30x60xf0x90x00x00x6
41-480xc0xa0xb0xa0x70xd0xd0x8
49-560xf0x90x10x40x30x50xe0xb
57-640x50xc0x20x70x80x20x40xe

表7.5
12345678
1-80x20xe0xc0xb0x40x20x10xc
9-160x70x40xa0x70xb0xd0x60x1
17-240x80x50x50x00x30xf0xf0xa
25-320xd0x30x00x90xe0x80x90x6
33-400x40xb0x20x80x10xc0xb0x7
41-480xa0x10xd0xe0x70x20x80xd
49-560xf0x60x90xf0xc0x00x50x9
57-640x60xa0x30x40x00x50xe0x3

表7.6

12345678
1-80xc0xa0x10xf0xa0x40xf0x2
9-160x90x70x20xc0x60x90x80x5
17-240x00x60xd0x10x30xd0x40xe
25-320xe0x00x70xb0x50x30xb0x8
33-400x90x40xe0x30xf0x20x50xc
41-480x20x90x80x50xc0xf0x30xa
49-560x70xb0x00xe0x40x10xa0x7
57-640x10x60xd0x00xb0x80x60xd

表7.7
 12345678
1-80x40xd0xb0x00x20xb0xe0x7
9-160xf0x40x00x90x80x10xd0xa
17-240x30xe0xc0x30x90x50x70xc
25-320x50x20xa0xf0x60x80x10x6
33-400x10x60x40xb0xb0xd0xd0x8
41-480xc0x10x30x40x70xa0xe0x7
49-560xa0x90xf0x50x60x00x80xf
57-640x00xe0x50x20x90x30x20xc

表7.8
 12345678
1-80xd0x10x20xf0x80xd0x40x8
9-160x60xa0xf0x30xb0x70x10x4
17-240xa0xc0x90x50x30x60xe0xb
25-320x50x00x00xe0xc0x90x70x2
33-400x70x20xb0x10x40xe0x10x7
41-480x90x40xc0xa0xe0x80x20xd
49-560x00xf0x60xc0xa0x90xd0x0
57-640xf0x30x30x50x50x60x80xb

在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
167202129122817
11523265183110
282414322739
19133062211425

把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
408481656246432
397471555236331
386461454226230
375451353216129
364441252206028
353431151195927
342421050185826
33141949175725

为保证加密和解密的对称性,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文件拷贝到同一个目录中即可

DES算法的介绍和实现(下)

作者信息:
地址:西安沣惠南路8号西安大唐电信数据通信部(邮编 710075)
电话:029-8379381
E-Mail:hitwz@163.com




最新评论 [发表评论] [文章投稿] 查看所有评论 推荐给好友 打印

fgh ( yasi_520 发表于 2003-8-13 9:52:00)
 
.......................................................
More...


版权所有 © 2004 VC知识库 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Electronic Codebook Mode (ECB),Cipher Block Chaining Mode (CBC).Cipher Feedback Mode (CFB) Only blocks of j <= 64 bits are enciphered at a time. A small j requires more cycles through the encipherment algorithm per unit of plaintext and thus greater processing overhead. A plaintext block always produces the same ciphertext block for the same key and starting variable. Blocks cannot be rearranged. Each ciphertext block depends on the current and all preceding plaintext blocks. Different starting variables are used to prevent the same plaintext enciphering to the same ciphertext. The strength of this mode depends on the size of the key k (best if j == k). An error will affect the current and the following ciphertext blocks. Output Feedback Mode (OFB) Only blocks of j <= 64 bits are enciphered at a time. A small j requires more cycles through the encipherment algorithm per unit of plaintext and thus greater processing overhead. A plaintext block always produces the same ciphertext block for the same key and starting variable. Different starting variables are used to prevent the same plaintext enciphering to the same ciphertext. Absence of chaining makes this mode vulnerable to specific attacks. Different start variable values prevent the same plaintext enciphering to the same ciphertext, by producing different key streams. An error bit in the ciphertext causes only one bit to be in error in the deciphered plaintext. It is not self-synchronizing. Triple-DES ECB Mode Encrypt with key1, decrypt with key2 and encrypt with key3 again. As for ECB encryption but increases the key length to 168 bits. If all keys are the same it is equivalent to encrypting once with just one key. If the first and last key are the same, the key length is 112 bits. If all 3 keys are the same, this is effectively the same as normal ECB mode. Triple-DES CBC Mode Encrypt with key1, decrypt with key2 and then encrypt with key3. As for CBC encryption but increases the key length to 168 bits with the same restrictions as the Triple-DES ESB mode Our first example shows how to use the basic DES encryption routine, DES_ecb_encrypt(), to encrypt or decrypt a single 64-bit block of plaintext to electronic code book (ECB) mode. If the encrypt argument is DES_ENCRYPT, the input (plaintext) is encrypted into the output (ciphertext) using the specified key_schedule. If the encrypt argument is DES_DECRYPT, the input (ciphertext) is decrypted into the output (plaintext). Note that input and output may overlap. Read more: http://blog.fpmurphy.com/2010/04/openssl-des-api.html#ixzz1n2Qte3UG
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值