您的位置 首页 php

PHP之DES算法小技巧

DES

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

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

文章来源:智云一二三科技

文章标题:PHP之DES算法小技巧

文章地址:https://www.zhihuclub.com/76630.shtml

关于作者: 智云科技

热门文章

网站地图