如何在十六进制字符串中解密AES CBC模式?

时间:2013-02-11 14:42:14

标签: javascript aes cryptojs

我的任务是在CBC模式下解密AES-128,因为我已经加密了十六进制字符串和密钥(也是十六进制)。 我尝试了一个简单的代码,如:

function doDecrypt(){
    var encryptedData = "1d4c76364618b6efce62258353f89810"
    var key = "11112222333344445555666677778888"; 

    encryptedData = CryptoJS.enc.Hex.parse(encryptedData);
    key = CryptoJS.enc.Hex.parse(key);

        var decrypted = CryptoJS.AES.decrypt(encryptedData, key);
    alert(CryptoJS.enc.Hex.stringify(decrypted));
}

我得到的结果只是一个空白的单词数组(在“decrpyted”中),任何人都可以指出我在哪里做错了吗?

我是否需要其他信息,例如静脉注射,不加盐?

1 个答案:

答案 0 :(得分:3)

“CBC模式下的AES-128”不是数据格式。没有通用的方法来编写加密数据以及所需的元数据。你需要知道你被交给了什么以及它是如何产生的。然后,您可以在大多数情况下了解如何使用CryptoJS实现相同的功能。特别是,您需要了解以下内容:

  • 什么算法? “AES-128”含糊不清。它可能意味着“具有128位密钥大小的AES”,或者它可能意味着“具有128个块大小和其他密钥大小的AES。”
  • 什么密钥大小(见上文)
  • 什么模式? (你已经回答了这个问题:这是CBC。)
  • 什么是填充物?最常见的是PKCS#7,但可能没有填充。 (对于CBC模式,几乎可以肯定是PKCS#7。)
  • IV是什么? 始终是CBC的IV。有时,IV被错误地设置为NULL(这使得CBC不太安全)。 IV可能是以某种方式从密码生成的(这就是OpenSSL的工作原理)。
  • 您是否有好钥匙,不安全钥匙或密码?一个好的密钥是一系列随机字节大小的密钥。不安全的密钥是将密码视为密钥(通过将人类输入的字母复制到密钥缓冲区中)。这是疯狂的不安全,但很常见。
  • 如果您有正确的密码,那么使用什么KDF和参数将其转换为密钥?例如,他们使用的是OpenSSL KDF或PBKDF2还是bcrypt或scrypt?
  • 是否还有其他元数据,例如HMAC? (HMAC需要保护AES-CBC。如果没有它,攻击者有时可以修改密文以解密为所需的明文。)

当您有这些答案时,您可以了解如何使用CryptoJS实现它。