AES 有三种算法 , 主要是对数据块的大小存在区别:
AES-128:需要提供 16 位的密钥 key
AES-192:需要提供 24 位的密钥 key
AES-256:需要提供 32 位的密钥 key
AES 是按数据块大?。?28/192/256)对待加密内容进行分块处理的,会经常出现最后一段数据长度不足的场景 , 这时就需要填充数据长度到加密算法对应的数据块大小 。
主要的填充算法有填充 NUL("0") 和 PKCS7,Mcrypt 默认使用的 NUL("0") 填充算法,当前已不被推荐,OpenSSL 则默认模式使用 PKCS7 对数据进行填充并对加密后的数据进行了 base64encode 编码 , 所以建议开发中使用 PKCS7 对待加密数据进行填充,已保证通用性(alipay sdk 中虽然使用了 Mcrypt 加密簇,但使用 PKCS7 算法对数据进行了填充,这样在一定程度上亲和了 OpenSSL 加密算法) 。
Mcrypt 的默认填充算法 。NUL 即为 Ascii 表的编号为 0 的元素,即空元素,转移字符是 "\0",PHP 的 pack 打包函数在 'a' 模式下就是以 NUL 字符对内容进行填充的,当然 , 使用 "\0" 手动拼接也是可以的 。
OpenSSL的默认填充算法 。下面我们给出 PKCS7 填充算法 PHP 的实现:
默认使用 NUL("\0") 自动对待加密数据进行填充以对齐加密算法数据块长度 。
获取 mcrypt 支持的算法 , 这里我们只关注 AES 算法 。
注意:mcrypt 虽然支持 AES 三种算法,但除MCRYPT_RIJNDAEL_128外,MCRYPT_RIJNDAEL_192/256并未遵循AES-192/256标准进行加解密的算法 , 即如果你同其php数据加密密钥他系统通信(java/.net),使用MCRYPT_RIJNDAEL_192/256可能无法被其他严格按照AES-192/256标准的系统正确的数据解密 。官方文档页面中也有人在 User Contributed Notes 中提及 。这里给出如何使用 mcrpyt 做标注的AES-128/192/256加解密
即算法统一使用MCRYPT_RIJNDAEL_128,并通过 key 的位数 来选定是以何种 AES 标准做的加密,iv 是建议添加且建议固定为16位(OpenSSL的 AES加密 iv 始终为 16 位 , 便于统一对齐),mode 选用的 CBC 模式 。
mcrypt 在对数据进行加密处理时,如果发现数据长度与使用的加密算法的数据块长度未对齐,则会自动使用 "\0" 对待加密数据进行填充,但 "\0" 填充模式已不再被推荐 , 为了与其他系统有更好的兼容性,建议大家手动对数据进行 PKCS7 填充 。
openssl 簇加密方法更为简单明确 , mcrypt 还要将加密算法分为 cipher + mode 去指定,openssl 则只需要直接指定 method 为AES-128-CBC,AES-192-CBC,AES-256-CBC即可 。且提供了三种数据处理模式,即默认模式 0 /OPENSSL_RAW_DATA /OPENSSL_ZERO_PADDING。
openssl 默认的数据填充方式是 PKCS7,为兼容 mcrpty 也提供处理 "0" 填充的数据的模式,具体为下:
options参数即为重要,它是兼容 mcrpty 算法的关键:
options = 0 : 默认模式 , 自动对明文进行 pkcs7 padding,且数据做 base64 编码处理 。
options = 1 : OPENSSL_RAW_DATA,自动对明文进行 pkcs7 padding,且数据未经 base64 编码处理 。
options = 2 : OPENSSL_ZERO_PADDING,要求待加密的数据长度已按 "0" 填充与加密算法数据块长度对齐 , 即同 mcrpty 默认填充的方式一致,且对数据做 base64 编码处理 。注意,此模式下 openssl 要求待加密数据已按 "0" 填充好 , 其并不会自动帮你填充数据,如果未填充对齐,则会报错 。
故可以得出 mcrpty簇 与 openssl簇 的兼容条件如下:
建议将源码复制到本地运行 , 根据运行结果更好理解 。
1.二者使用的何种填充算法 。
2.二者对数据是否有 base64 编码要求 。
3.mcrypt 需固定使用 MCRYPT_RIJNDAEL_128,并通过调整 key 的长度 16, 24,32 来实现 ase-128/192/256 加密算法 。
推荐阅读
- 营销中如何吸引客户需求,营销怎么吸引客户
- 小程序的图片怎么处理,小程序里面的图片怎么保存到手机
- gis专题制图,gis专题地图制作步骤
- .net免费框架,net框架20下载
- java人机黑白棋代码 黑白棋源代码
- 叽里呱啦安卓系统免费,叽里呱啦旧版
- 命令查看linux内存,linux命令行查看内存
- 用钉钉直播上课效果怎么样,钉钉直播上课教程
- c语言有删除指针的函数吗 c语言有删除指针的函数吗为什么