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

原文发布于微信公众号 - 风帆(wdswhf)

原文发表时间:2019-03-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券