javascript - crypto-js 无法解密它加密的内容

标签 javascript cryptography

我需要使用 AES CBC no pad 使用 javascript 加密字符串,通过 HTTP 将 IV 和加密数据作为 HEX 传递,然后在服务器端使用 javascript 解密。

解密功能有效,因为我可以正确解密使用 hurlant AS3 库加密的数据。但是,下面的加密不起作用 - 结果无法使用 decrypt 函数解密,也无法使用 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()

最佳答案

对于 CBC 模式,需要填充。 CFB 或 OFB 都不需要填充。

CryptoJS supports the following modes:

  • CBC(默认)
  • 循环流化床
  • 点击率
  • OFB
  • 欧洲央行

And CryptoJS supports the following padding schemes:

  • Pkcs7(默认)
  • ISO97971
  • AnsiX923
  • Iso10126
  • 零填充
  • 无填充

关于javascript - crypto-js 无法解密它加密的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15547584/

相关文章:

javascript - AngularFirebase2 : Query list by month

algorithm - 在任何一方都不知道盒子内容的情况下使用密码学随机播放

java - JAVA 中的 PKCS5 或基于密码的加密 (PBE)

ssl - 如何使用 SSL_CTX 传递 EC 点格式列表?

javascript - 未捕获的类型错误 : Cannot read property 'options' of null for HTML select

javascript - 如何使用 WebGl 在 Canvas 上呈现二进制数据?

javascript - 使用 HH :MM:SS 理解 Excel 计算

javascript - VueJS获取Div的宽度

php - 存储phphash密码的数据类型

java - 使用Java对密文进行密码分析