2013-03-21 38 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