我需要使用AES CBC无键盘对JavaScript进行加密,将HTTP和加密数据作为HEX通过HTTP传递,然后在服务器端用JavaScript解密。crypto-js不能解密它加密的东西
解密功能的作品,我能正确解密数据正确使用hurlant AS3库ecrypted。但是,下面的加密不起作用 - 结果不能使用解密功能解密,也不能使用hurant demo解密:http://crypto.hurlant.com/demo/
而不是实际数据,我使用“1234”作为消息在这个例子中。
我已经搜查,发现任何本库或它的功能没有文档,超越快速入门指南其中只有微不足道的情况下,所以一切都是通过试验和错误。我已经尝试了数百种以下的变体。
实例产生IV为十六进制: “15ae89d17f632d21f0cda04734d38694”
例产生encrypte数据作为HEX: “44ddf295”
示例消息: “15ae89d17f632d21f0cda04734d3869444ddf295”
有人能看到什么是错在我的加密()函数?
// 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()
感谢您的答复。我一直使用它没有填充之间Hurlant(加密没有填充)和JavaScript(没有填充解密)没有问题多年,所以它确实工作。 JavaScript到JavaScript应该很容易! Hurlant AS3和crypto js之间没有兼容的填充方案(hurlant只有没有或PKCS#5,cryptojs只有:Pkcs7,Iso97971,AnsiX923,Iso10126,ZeroPadding,NoPadding) – 2013-03-21 12:53:59
不使用填充是不可能的一个合适的CBC算法,有许多方法[CTS](http://en.wikipedia.org/wiki/Ciphertext_stealing)可以使CBC看起来像不使用填充,但它实际上是使用部分密文进行填充。我毫不怀疑,由于这种配置,你遇到了问题,看着即使没有选择也会填充某些东西的hurlant演示,但pkcs5与pkcs7相同,只是一个较小的块大小(这不适用于aes )所以我猜这只是一个错误的命名。因此请填充pkcs5/7或切换到CFB或OFB模式。 – jbtule 2013-03-21 13:15:02