【问题标题】:How can I decrypt AES CBC Mode in Hex String?如何解密十六进制字符串中的 AES CBC 模式?
【发布时间】:2013-02-11 14:42:14
【问题描述】:

我的任务是在 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));
}

我得到的结果只是一个空白单词数组(在“解密”中),谁能指出我在哪里做错了吗?

我是否需要其他信息,例如 iv、salt 或不需要?

【问题讨论】:

  • 您的数据和密钥来自哪里?密钥对我来说看起来不是很真实,它不是只有 64 位而不是必要的 128 位吗?我相信,算法本身应该可以工作,输入可能是您的问题。
  • 对不起,我复制了错误的密钥,它有 128 位:11112222333344445555666677778888

标签: javascript aes cryptojs


【解决方案1】:

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

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

当你得到这些答案后,你就可以想出如何用 CryptoJS 来实现它。

【讨论】:

  • 你还需要知道填充方案。
  • +1,但是:AES-128 在 FIPS 197 中被定义为具有 128 位密钥的 AES(并且 AES 始终具有 128 位的块大小,即使 Rijndael 没有)。 IV 在 CBC 模式下永远不能为 NULL 并且必须存在;它可以由 16 个字节组成,AES 值为 0(异或零的影响很小)。
  • 虽然 AES 始终是 128 位块,但对于任何密钥大小,您经常会看到它被称为 AES-128。有关示例,请参阅 OSX 上的 CommonCryptor。一些框架使用“NULL”的 IV 来表示全零,这就是您在代码中看到的内容。
猜你喜欢
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 2014-03-20
  • 2020-11-11
  • 1970-01-01
相关资源
最近更新 更多