龙空技术网

PHP之DES算法小技巧

toujun007 156

前言:

目前看官们对“des算法是哪种算法”可能比较讲究,小伙伴们都需要了解一些“des算法是哪种算法”的相关内容。那么小编在网摘上收集了一些对于“des算法是哪种算法””的相关文章,希望小伙伴们能喜欢,小伙伴们一起来了解一下吧!

DES

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。

DES使用简介

使用DES需要设置加密内容、加密key、加密混淆向量iv、分组密码模式、填充模式。

加密内容:

给定的加密的数据。如果数据长度不是 n*分组大小,则在其后使用 '' 补齐。

加密Key:

加密密钥。 如果密钥长度不是该算法所能够支持的有效长度,需要填充。如果密钥长度过长,需要截取。

加密iv:

用于CBC, CFB, OFB模式,在ECB模式里不是必须的。

分组密码模式:

常见的分组密码模式有:CBC, OFB,CFB 和 ECB。

填充模式:

Pkcs5、Pkcs7。

填充算法(Pkcs5、Pkcs7)

PKCS5Padding与PKCS7Padding基本上是可以通用的。在PKCS5Padding中,明确定义Block的大小是8位,而在PKCS7Padding定义中,对于块的大小是不确定的,可以在1-255之间(块长度超出255的尚待研究),填充值的算法都是一样的:

pad = k - (l mod k) //k=块大小,l=数据长度,如果k=8, l=9,则需要填充额外的7个byte的7

可以得出:Pkcs5是Pkcs7的特例(Block的大小始终是8位)。当Block的大小始终是8位的时候,Pkcs5和Pkcs7是一样的。(参考)

填充算法实现:

PHP

反填充(去掉填充的字符)只需要根据解密后内容最后一个字符,就知道填充了什么、填充了几个,然后截取掉即可:

Python

加密解密步骤

加密步骤(以PHP的扩展mcrypt为例):

1、获得加密算法的分组大小(mcrypt_get_block_size);

2、被加密的明文使用Pkcs5或Pkcs7填充;

3、加密密钥key截取或填充至8位;

4、加密向量iv设置;

5、打开指定算法和模式对应的模块,返回加密描述符td(mcrypt_module_open);

6、使用td、key、iv初始化加密所需的缓冲区 (mcrypt_generic_init);

7、加密数据(mcrypt_generic);

8、清理的加密描述符td的缓冲区(mcrypt_generic_deinit);

9、释放加密描述符td(mcrypt_module_close);

10、返回base64_encode的加密结果,可选。

解密步骤(以PHP的扩展mcrypt为例):

1、base64_decode解码,如果加密使用了base64_encode;

2、加密密钥key截取或填充至8位;

3、加密向量iv设置;

4、打开指定算法和模式对应的模块,返回加密描述符td(mcrypt_module_open);

5、使用td、key、iv初始化加密所需的缓冲区 (mcrypt_generic_init);

6、解密数据(mdecrypt_generic);

7、清理的加密描述符td的缓冲区(mcrypt_generic_deinit);

8、释放加密描述符td(mcrypt_module_close);

9、使用Pkcs5去掉填充的内容,返回解密后的结果。

使用DES需要注意下面几点:

1) 确保都使用DES + ECB;

2) 确保明文填充都使用的是Pkcs5或者Pkcs7,此时两者效果一致;

3) 加密key在DES长度必须是8字节(bytes);如果不够长必须填充,过长必须截取;

4) 加密向量iv与加密key有同样的约定;

5) 注意加密结果建议都使用base64编码。

只有以上都保持一样,各个语言里最终加密的密文才能保持一致,否则会出现:

1) 每次加密的密文不一样,但是能解密;(iv随机生成导致的)

2) 不同语言加密出来的密文不一致。

各种语言实现示例

PHP

示例:

Crypt_DES.php

注意:Crypt_DES类里默认是MCRYPT_MODE_CBC模式,且默认会把加密向量截取或填充至8位:

str_pad(substr($key, 0, 8), 8, chr(0))

也就是如果加密向量大于8位,只会截取前8位;少于则补0。

另外加密向量iv会被设置成,CRYPT_DES_MODE_ECB模式该变量则不是必须的。所以,如果使用了其它语言需要注意到这点。加密结果请务必base64_decode。

输出:

pQSWMWLBGQg=123456

PHP使用Mcrypt扩展

使用MCRYPT_MODE_CBC + Pkcs7。注意和其它语言联调的时候需要注意加密key已经过处理、加密向量默认值的设置。

输出:

pQSWMWLBGQg=123456

JS

CryptoJS

总结:在解析过程中,遇到很多坑,因为返回数据前后都有未知的乱码,不得不采取特别的截取部分数据的办法,最后分析出原因,才解决掉,

标签: #des算法是哪种算法