CryptoJS 不正确的 AES 编码
CryptoJS incorrect AES encoding
如果我使用相同的密钥和 ivector,为什么 CryptoJS 的输出与 PHP' openssl_encrypt 中的输出不同?
openssl_encrypt('test' , 'aes-256-cbc', '17cc0ffd728f34c171e06c47df4227a32ee6ef5d6c60398eeab30cf34306c644', 0 , base64_decode('aROnq5DocMLgrlpAF6yjgw=='));
输出:
oIcizpTDCTgtTGu3lO1cJg==
每次输出相同
加密JS:
var encrypted = CryptoJS.AES.encrypt("test", CryptoJS.enc.Hex.parse('UDOuDk5uxceoFWxtrabuEhamMC1T4Abr'), {
iv: CryptoJS.enc.Hex.parse('HLcM0VZYfsgPo2ye')}).toString();
输出:
VTJGc2RHVmtYMTlrVHh4N0F3V2VySWlFcjBGeWlRRkcyMmNabEtjWmpmYz0=
为什么每次 CryptoJS 的输出都不一样?
编辑:
经过您的提示:
var encrypted = CryptoJS.AES.encrypt("test", CryptoJS.enc.Hex.parse('UDOuDk5uxceoFWxtrabuEhamMC1T4Abr'), {
iv: CryptoJS.enc.Hex.parse('HLcM0VZYfsgPo2ye')}).toString();
输出:
CoFpbmd4YzOiVEFzVkeaDQ==
现在每次都一样
但与 PHP 不同:
openssl_encrypt("test" , "aes-256-cbc", "UDOuDk5uxceoFWxtrabuEhamMC1T4Abr", 0 , "HLcM0VZYfsgPo2ye");
输出:
oV9OZVYM80p8mlHH5wnzEg==
CryptoJS.AES.encrypt 将根据您传递的密钥尝试自动使用 AES-128、AES-192 或 AES-256。在你的情况下,你传递一个秘密密码('17cc0f ...')而不是一个密钥,这将导致它生成自己的 AES-256 密钥。
CryptoJS supports AES-128, AES-192, and AES-256. It will pick the
variant by the size of the key you pass in. If you use a passphrase,
then it will generate a 256-bit key.
为了使用密钥,您必须先解析一个十六进制密钥并传递它。
var key = CryptoJS.enc.Hex.parse('000102030405060708090a0b0c0d0e0f');
var encrypted = CryptoJS.AES.encrypt("test", key, { iv: iv });
如果我使用相同的密钥和 ivector,为什么 CryptoJS 的输出与 PHP' openssl_encrypt 中的输出不同?
openssl_encrypt('test' , 'aes-256-cbc', '17cc0ffd728f34c171e06c47df4227a32ee6ef5d6c60398eeab30cf34306c644', 0 , base64_decode('aROnq5DocMLgrlpAF6yjgw=='));
输出:
oIcizpTDCTgtTGu3lO1cJg==
每次输出相同
加密JS:
var encrypted = CryptoJS.AES.encrypt("test", CryptoJS.enc.Hex.parse('UDOuDk5uxceoFWxtrabuEhamMC1T4Abr'), {
iv: CryptoJS.enc.Hex.parse('HLcM0VZYfsgPo2ye')}).toString();
输出:
VTJGc2RHVmtYMTlrVHh4N0F3V2VySWlFcjBGeWlRRkcyMmNabEtjWmpmYz0=
为什么每次 CryptoJS 的输出都不一样?
编辑:
经过您的提示:
var encrypted = CryptoJS.AES.encrypt("test", CryptoJS.enc.Hex.parse('UDOuDk5uxceoFWxtrabuEhamMC1T4Abr'), {
iv: CryptoJS.enc.Hex.parse('HLcM0VZYfsgPo2ye')}).toString();
输出:
CoFpbmd4YzOiVEFzVkeaDQ==
现在每次都一样
但与 PHP 不同:
openssl_encrypt("test" , "aes-256-cbc", "UDOuDk5uxceoFWxtrabuEhamMC1T4Abr", 0 , "HLcM0VZYfsgPo2ye");
输出:
oV9OZVYM80p8mlHH5wnzEg==
CryptoJS.AES.encrypt 将根据您传递的密钥尝试自动使用 AES-128、AES-192 或 AES-256。在你的情况下,你传递一个秘密密码('17cc0f ...')而不是一个密钥,这将导致它生成自己的 AES-256 密钥。
CryptoJS supports AES-128, AES-192, and AES-256. It will pick the variant by the size of the key you pass in. If you use a passphrase, then it will generate a 256-bit key.
为了使用密钥,您必须先解析一个十六进制密钥并传递它。
var key = CryptoJS.enc.Hex.parse('000102030405060708090a0b0c0d0e0f');
var encrypted = CryptoJS.AES.encrypt("test", key, { iv: iv });