2013-03-21 80 views
3

我需要使用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() 

回答

1

使用CBC模式填充是必需的。 CFB或OFB都不需要填充。

CryptoJS supports the following modes:

  • CBC(缺省值)
  • CFB
  • CTR
  • OFB
  • ECB

And CryptoJS supports the following padding schemes:

  • PKCS7(默认)
  • Iso97971
  • AnsiX923
  • Iso10126
  • ZeroPadding
  • NoPadding
+0

感谢您的答复。我一直使用它没有填充之间Hurlant(加密没有填充)和JavaScript(没有填充解密)没有问题多年,所以它确实工作。 JavaScript到JavaScript应该很容易! Hurlant AS3和crypto js之间没有兼容的填充方案(hurlant只有没有或PKCS#5,cryptojs只有:Pkcs7,Iso97971,AnsiX923,Iso10126,ZeroPadding,NoPadding) – 2013-03-21 12:53:59

+0

不使用填充是不可能的一个合适的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