crypto-js cant decrypt what it encrypted
我需要使用AES CBC no pad用javascript加密字符串,将IV和加密的数据作为HEX通过HTTP传递,然后在服务器端使用javascript解密。
解密功能有效,因为我可以正确解密使用hurlant AS3库加密的数据。但是,以下加密无法正常工作-无法使用解密功能解密结果,也无法使用hurant演示进行解密:http://crypto.hurlant.com/demo/
在此示例中,我使用" 1234"作为消息,而不是实际数据。
除了快速入门指南(只包含很少的案例)之外,我没有找到任何关于此库或其功能的文档,因此所有内容都是反复试验的。我已经尝试了以下数百种变体。
以十六进制形式生成IV的示例:" 15ae89d17f632d21f0cda04734d38694"
示例以十六进制形式生成加密数据:" 44ddf295"
示例消息:" 15ae89d17f632d21f0cda04734d3869444ddf295"
谁能看到我的crypto()函数出了什么问题?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | // this function doesnt work - the resultant message (which is // IV+Ecypted text all as HEX cannot be decrypted. function encrypt() { var key = CryptoJS.enc.Hex.parse('48656c6c6f2c20576f726c6421888888'); var IVLEN = 16; // Im guessing this is 16 bytes. var iv= CryptoJS.lib.WordArray.random(IVLEN); var encrypted; var message; encrypted = CryptoJS.AES.encrypt("1234", key, { iv: iv, padding: CryptoJS.pad.NoPadding, mode: CryptoJS.mode.CBC }); message = CryptoJS.enc.Hex.stringify(iv) + CryptoJS.enc.Hex.stringify(encrypted.ciphertext); var test = decrypt(message); // throws a malformed UTF-8 exception alert (test); // should alert"1234" return message; } // this function works perfectly with data generated using HURLANT crypto libs. function decrypt(data) { var key = CryptoJS.enc.Hex.parse('48656c6c6f2c20576f726c6421888888'); var ivHexStr, iv; var encMessageHexStr; var IVLEN = 32; // This is 16 bytes, as one byte is 2 Hex chars. var encrypted = {}; var decrypted; var result; ivHexStr = data.substring(0,IVLEN); encMessageHexStr = data.substring(IVLEN); iv = CryptoJS.enc.Hex.parse(ivHexStr); encrypted.key = key; encrypted.iv = iv; encrypted.ciphertext = CryptoJS.enc.Hex.parse(encMessageHexStr); decrypted = CryptoJS.AES.decrypt(encrypted, key, { iv: iv, padding: CryptoJS.pad.NoPadding, mode: CryptoJS.mode.CBC }); result = CryptoJS.enc.Utf8.stringify(decrypted); return(result); }; //decrypt() |
对于CBC模式,需要填充。 CFB或OFB都不需要填充。
CryptoJS支持以下模式:
- CBC(默认)
- 循环流化床
- 点击率
- 银行
- 欧洲央行
并且CryptoJS支持以下填充方案:
- PKCS7(默认)
- Iso97971
- 安西X923
- Iso10126
- 零填充
- 无填充