CryptoJS中作为AES密钥的WordArray(MD5结果)实际值及加密不一致问题
AES加密密钥疑惑及复现问题解答
原加密代码
var CryptoJS = require("crypto-js"); let key = "nfu-eca-EBLrKCb3AUu*X%3+lh7=o2jUmhp1(z&6"; let username = "01032219"; let result = CryptoJS.AES.encrypt(username, CryptoJS.MD5(key), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7, }); console.log(result.toString()); // output: 1oIadjvmeIeH/UGd5QPCvg==
我的疑惑与问题
我用上述代码对用户名做AES加密,现在搞不懂CryptoJS.MD5(key)作为密钥传入CryptoJS.AES.encrypt()时的实际值是什么?
我尝试用在线AES加密工具复现流程:
- 待加密明文:"01032219"
- 加密模式:ECB
- 填充方式:PKCS7
我填入同一key字符串的MD5值(16/32位大小写都试过)作为密钥,但加密结果和代码输出的1oIadjvmeIeH/UGd5QPCvg==不一致。
问题解析
1. CryptoJS.MD5(key)作为密钥的实际值
CryptoJS的MD5()方法返回的WordArray对象,本质是MD5哈希生成的16字节原始二进制序列(MD5哈希固定128位=16字节),这才是AES加密真正使用的密钥。
你之前在在线工具里填的16/32位16进制字符串,是把这16字节二进制转成了可读的字符形式——如果直接把这个字符串当密钥传入工具,工具会把它当成UTF-8编码的字节序列来用,和原代码的原始二进制密钥完全不是一回事,结果自然对不上。
2. 在线工具复现正确结果的方法
要复现代码的加密结果,你需要让在线工具使用和原代码一致的二进制密钥,具体操作:
- 先把
CryptoJS.MD5(key)的原始二进制转成Base64格式(用代码可以输出CryptoJS.MD5(key).toString(CryptoJS.enc.Base64)),把这个Base64字符串作为密钥填入工具,并设置密钥编码为Base64; - 或者如果工具支持16进制密钥,就用MD5哈希的16进制字符串(比如
CryptoJS.MD5(key).toString()的结果),但必须让工具把这个16进制字符串解析成二进制密钥,而不是当成普通字符串处理; - 同时要确认工具的AES密钥长度是128位(因为MD5是128位哈希),部分工具默认是256位,这也会导致结果偏差。
内容的提问来源于stack exchange,提问作者bqliang
相关产品推荐
相关产品推荐

