我需要使用AES CBC no pad加密stavascript,将IV和加密数据作为HEX通过HTTP传递,然后在服务器端使用javascript解密。
解密功能起作用,因为我可以正确地使用hurlant AS3库正确地解密数据。但是,以下加密不起作用 - 结果无法使用解密函数解密,也无法使用hurant演示解密:http://crypto.hurlant.com/demo/
我使用“1234”作为此示例中的消息,而不是实际数据。
我已经搜索过,找不到任何这个库或其功能的文档,除了快速入门指南之外只有一些小问题,所以一切都是经过反复试验。我已经尝试了下面的数百种变体。
示例生成IV为十六进制:“15ae89d17f632d21f0cda04734d38694”
示例生成的加密数据为HEX:“44ddf295”
示例消息:“15ae89d17f632d21f0cda04734d3869444ddf295”
有人能看到我的encrypt()函数有什么问题吗?
// 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()
答案 0 :(得分:1)
使用CBC模式填充是必需的。 CFB或OFB都不需要填充。
CryptoJS supports the following modes:
And CryptoJS supports the following padding schemes: