特点
分组比较短、密钥太短、密码生命周期短、运算速度较慢。
编辑本段基本原理
入口参数有三个:key、data、mode。 key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。 DES( Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。虽然56位密钥的DES算法已经风光不在,而且常有用Des加密的明文被破译的报道,但是了解一下昔日美国的标准加密算法总是有益的,而且目前DES算法得到了广泛的应用,在某些场合,仍然发挥着余热。
编辑本段密钥生成
取得密钥
从用户处取得一个64位(本文如未特指,均指二进制位))长的密码key ,去除64位密码中作为奇偶校验位的第8、16、24、32、40、48、56、64位,剩下的56位作为有效输入密钥.
等分密钥
表1. DES加密算法
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 50 44 36 表2. 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步中生成的56位输入密钥分成均等的A,B两部分,每部分为28位,参照表1和表2把输入密钥的位值填入相应的位置. 按照表1所示A的第一位为输入的64位密钥的第57位,A的第2位为64位密钥的第49位,...,依此类推,A的最后一位最后一位是64位密钥的第36位。
密钥移位
表3. i 1 2 3 4 5 6 7 8 DES加密算法
ǿ 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 DES加密算法
第i次迭代: A(i) = ǿ(i) A(i-1) B(i) = ǿ(i) B(i-1)
实现接口函数的介绍
1 int des(char *data, char *key,int readlen) 参数: 1.存放待加密明文的内存指针(长度为readlen,可能经过填充; 2.存放用户输入的密钥内存的指针 3.待加密明文的长度(8字节的倍数) 功能: 生成加密密钥,把待加密的明文数据分割成64位的块,逐块完成16次迭代加密,密文存放在data所指向的内存中. 2 int Ddes(char *data, char *key,int readlen) 参数: 1.存放待解密文的内存指针(长度为readlen,可能经过填充; 2.存放用户输入的密钥内存的指针 3.待解密文的长度( 8字节的倍数) 功能: 生成解密密钥,把待解密文分割成64位的块,逐块完成16次迭代解密,解密后的明文存放在data所指向的内存中. 3 int des3(char *data, char *key, int n ,int readlen) 参数: 1.存放待加密明文的内存指针(长度为readlen,可能经过填充; 2.存放用户输入的密钥内存的指针 DES加密算法
3.用户指定进行多少层加密 4.待加密明文的长度(8字节的倍数) 功能: 生成加密密钥,把待加密的明文分割成64位的块,把第i-1层加密后的密文作为第i层加密的明文输入,根据用户指定的加密层数进行n层加密,最终生成的密文存放在data所指向的内存中. 说明: 用户仅仅输入一条密钥,所有的加密密钥都是由这条密钥生成. 4 int Ddes3(char *data, char*key, int n ,int readlen) 参数: 1.存放待解密文的内存指针(长度为readlen,可能经过填充; 2.存放用户输入的密钥内存的指针 3.用户指定进行多少层解密 4.待解密文的长度(8字节的倍数) 功能: 生成解密密钥,把待解密文分割成64位的块,把第i-1层解密后的"明文"作为第i层解密的密文输入,根据用户指定的解密层数进行n层解密,最终生成的明文存放在data所指向的内存中. 说明: 用户仅仅输入一条密钥,所有的解密密钥都是由这条密钥生成. 5 int desN(char*data,char**key,int n_key,int readlen) 参数: 1.存放待加密明文的内存指针(长度为readlen,可能经过填充; 2.存放用户输入的密钥内存的指针 3.用户指定了多少条密钥 4.待加密明文的长度(8字节的倍数) 功能: DES加密算法生成加密密钥,把待加密的明文分割成64位的块,把第i-1层加密后的密文作为第i层加密的明文输入,根据用户指定的加密层数进行n层加密,最终生成的密文存放在data所指向的内存中. 说明: 这里用户通过输入的密钥条数决定加密的层数,每轮16次迭代加密所使用的加密密钥是由用户自定的对应密钥生成. 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加密算法-实现的介绍 利用算法核心代码封装的接口函数编写了一个针对文本文件的加密解密工具。选择把密文以16进制的形式写入文件的方法.当然也可以直接写入文件. 例: DES加密算法
密文为: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位长,为了方便使用,数据位的填充是对用户而言是透明的,利用该工具进行加密解密操作时,用户只需输入操作的类型、读取数据的文件名、写入操作结果的文件名、密钥等信息.
编辑本段操作思路
#define READFILESIZE 512 步骤: 1.从文件中读取READFILESIZE个字节的数据 2.,如果从文件中读出的数据少于READFILESIZE个,以0补足,然后根据用户指定的类型对这READFILESIZE个字节的数据进行操作. 3.判断文件是否结束,没有则执行步骤1 4.把加密后的文件实际长度添加到密文的末尾 5.结束 采用一次只从文件读取READFILESIZE个字节是在为了防止由于需要加密或解密的文件太大导致内存不够的情况出现。 DES加密算法-注意事项 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层多密钥解密; 这六种操作是对称使用的,例如:加密明文时选择一层加密,解密时对密文使用一层解密