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

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

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

解决方法:

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

>如果传入的字符串不是字符串,而是传入WordArray(CryptoJS的二进制数据的内部表示格式),则按键原样.此模式期望除ECB之外的所有操作模式的IV,其不使用IV,因此您不必指定一个.如果没有传递IV,它将默认(通过一些JavaScript魔法)到零填充IV(由完整的0x00字节块组成).
>如果传入一个字符串“key”,它将假定“key”是一个密码.为了从密码导出密钥,它使用OpenSSL兼容的派生函数EVP_BytesToKey.该模式生成一个新的8字节随机盐,并将其与密码一起使用以生成密钥和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

如果需要重新创建相同的密钥派生.看看the codethe specification.

键应具有高熵并且与随机噪声无法区分,这使得它们难以被强制强制.上面提到的EVP_BytesToKey不安全,因为MD5哈希非常快,这使攻击者能够强制密码.您需要使用非常长的密码(20-30个字符)或使用适当的密钥派生函数,例如CryptoJS提供的PBKDF2.

上一篇:javascript – 通过Crypto.js获取文件的md5sum


下一篇:PHP的openssl_encrypt方法的JAVA和JS的实现