关于javascript:crypto-js无法解密其加密的内容

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
  • 零填充
  • 无填充