您的位置 首页 php

PHP之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

CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法。目前已支持的算法包括:

  • MD5

  • SHA-1

  • SHA-256

  • AES

  • Rabbit

  • MARC4

  • HMAC

    • HMAC-MD5

    • HMAC- SHA1

    • HMAC-SHA256

  • PBKDF2

PyCrypto

PyCrypto是使用Python编写的加密工具包。支持所有主流算法。

hashlib

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

Crypt_DES.php

通过纯PHP实现的DES加密。示例:

在线工具

1、在线加密解密(也可自行百度,网上工具很多)

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

文章标题:PHP之AES加密算法

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

关于作者: 智云科技

热门文章

网站地图