gpt4 book ai didi

javascript - 当没有指定时,CryptoJS 如何获得 IV?

转载 作者:数据小太阳 更新时间:2023-10-29 06:10:36 25 4
gpt4 key购买 nike

当使用 CryptoJS.AES.encrypt 时,如果第三个参数没有传递给函数,它如何产生一个初始化向量?有没有办法把它从加密的字符串中取出来?

我需要这个的原因是我需要解密使用 Lua 返回的 CryptoJS.AES.encrypt 内容,但我只有提供的 key 。

最佳答案

CryptoJS' CryptoJS.<BlockCipher>.encrypt有两种加密模式。

  1. 如果您传入的 key 不是字符串,而是 WordArray(CryptoJS 的二进制数据内部表示格式),则该 key 将按原样使用。此模式需要一个 IV 用于除 ECB 之外的所有操作模式,ECB 不使用 IV,因此您不必指定一个。如果没有传递 IV,它将默认(通过一些 JavaScript 魔法)为零填充 IV(由 0x00 字节的完整 block 组成)。

  2. 如果您传入一个是字符串的“ key ”,它会假定“ key ”是密码。为了从密码中派生 key ,它使用与 OpenSSL 兼容的派生函数 EVP_BytesToKey .此模式生成一个新的 8 字节随机盐并将其与密码一起用于生成 key 和 IV。即使您显式传入 IV,它也不会被使用。

     CryptoJS.AES.encrypt(msg, password).toString()

    生成 Base64 编码的密文,其开头包含字符串“Salted__”,后跟 8 字节盐和实际密文。您可以在使用前明确拆分它:

     var ct = CryptoJS.AES.encrypt(msg, password);
    var saltHex = ct.salt.toString(); // random salt
    var ctHex = ct.ciphertext.toString(); // actual ciphertext
    var ivHex = ct.iv.toString(); // generated IV

    如果您需要重新创建相同的 key 派生。看看the codethe specification .

    key 应该具有高熵并且与随机噪声无法区分,这使得它们很难被暴力破解。上面提到的EVP_BytesToKey不安全,因为 MD5 散列非常快,这使攻击者能够暴力破解密码。您要么需要使用非常长的密码(20-30 个字符),要么使用适当的 key 派生函数,例如 CryptoJS 提供的 PBKDF2。

关于javascript - 当没有指定时,CryptoJS 如何获得 IV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35472396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com