PHP之AES加密算法
AES简介
AES(Advanced Encryption Standard),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。ECB模式是将明文按照固定大小的块进行加密的,块大小不足则进行填充。ECB模式没有用到向量。
使用AES需要注意下面几点:
1) 确保都使用MCRYPT_MODE_CBC;
2) 确保明文填充都使用的是Pkcs5
;
3) 加密key在AES_128长度必须是16, 24, 或者 32 字节(bytes);如果不够长必须填充,过长必须截取,建议直接md5;
4) 加密向量iv与加密key有同样的约定,但在ECB
可以忽略该值(用不到)。
5) 注意加密结果建议都使用base64编码。
只有以上都保持一样,各个语言里最终加密的密文才能保持一致,否则会出现:
1) 每次加密的密文不一样,但是能解密;(iv随机生成导致的)
2) 不同语言加密出来的密文不一致。
各种语言实现示例
PHP
示例:
PHP使用Mcrypt扩展
这里还是使用上文的Crypt类。
使用ECB
+ Pkcs7
。和其它语言联调的时候需要注意加密key已经过处理、加密向量默认值的设置。
输出结果:
3+WQyhMavuxzPzy40PZhJg==123456--------------mdSm0RmB+xAKrTah3DG31A==123456
本例里当key长度不够时,封装的类已经自动帮我们填充好了足够长度;当key长度等于16时,key的值不会改变。
PHP版的SDK
只要把DES改为AES即可,ECB改为CBC,块大小改为16。
ECB模式没有用到向量。本例为CBC,加密结果不变。但是加密向量则不一样了。
最终的一点是偏移量的问题,一定要调用pkcs5_unpad方法去除因为偏移量请求后,返回的前后都有乱码的问题,重点是调试去除返回数值{}前后的代码,一定记住你传递的偏移量和这个方法里的偏移量要一致,不然会有乱码去除不完整
Python
环境:Python 2.7.5,Linux CentOS7
需要先安装:
输出:
mdSm0RmB+xAKrTah3DG31A==123456
这里使用了AES
+ECB
+PKCS7Padding
方法。加密结果和PHP是一致的。

DES/CBC/PKCS7Padding
此时加密块大小都是8字节,PKCS5和PKCS7效果一样。各端实现的时候需要注意:
1) 使用相同的加密key,注意长度必须是8字节;
2) 使用相同的向量iv,建议设置成""
;
3) 必须实现相同的PKCS7填充算法和反填充算法;
4) 加密结果都使用base64编码。
AES/ECB/PKCS7Padding
使用AES_128
加密块大小都是16字节,PKCS5无法使用,请使用PKCS7。各端实现的时候需要注意:
1) 使用相同的加密key,注意长度必须是16, 24, 或者 32 字节(bytes);如果不够长必须填充,过长必须截取,建议直接md5;
2) 使用相同的向量iv,建议设置成""
;可以和加密key一样使用md5后的值;ECB
模式下可以忽略该项;
3) 必须实现相同的PKCS7填充算法和反填充算法;
4) 加密结果都使用base64编码。
AES/CBC/PKCS7Padding
和AES/ECB/PKCS7Padding
基本一致,但由于CBC模式用到向量,注意向量长度最少16字节。如果长度不够,请填充""。建议随机生成,然后base64后传给前端。

Mcrypt
Mcrypt 是一个功能强大的加密算法扩展库。
Mcrypt 库提供了对多种块算法的支持, 包括:DES,TripleDES,Blowfish (默认), 3-WAY,SAFER-SK64,SAFER-SK128,TWOFISH,TEA,RC2 以及 GOST,并且支持 CBC,OFB,CFB 和 ECB 密码模式。
PHP里通过启用 Mcrypt 扩展即可使用(mcrypt_
开头的系列函数)。注意的是,要使用该扩展,必须首先安装mcrypt标准类库,而 mcrypt 标准类库依赖 libmcrypt 和 mhash 两个库。从 PHP 5.0.0 开始,需要使用 libcrypt 2.5.6 或更高版本。
Crypto-JS
https://github.com/brix/crypto-js
CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法。目前已支持的算法包括:
MD5
SHA-1
SHA-256
AES
Rabbit
MARC4
HMAC
HMAC-MD5
HMAC-SHA1
HMAC-SHA256
PBKDF2
PyCrypto
https://github.com/dlitz/pycrypto
PyCrypto是使用Python编写的加密工具包。支持所有主流算法。
hashlib
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
Crypt_DES.php
https://my.oschina.net/u/995648/blog/113390
通过纯PHP实现的DES加密。示例:

1、在线加密解密(也可自行百度,网上工具很多)
http://tool.oschina.net/encrypt?type=2
