我遇到AES加密问题。 我有任何加密文本。
var keyString = 'b46393431e8dfaa3feec333b6ba02d0b277b8552f092e49e3a2e9b9739ac23ea';
var message1 = "message to encrypt";
var encrypted = CryptoJS.AES.encrypt(message1, keyString, {mode: CryptoJS.mode.CFB});
console.log(encrypted); //U2FsdGVkX1862TrLeAHJssPnGWVfQ9AzPtF64560nerd1xOM+72ad+ZdyXMl5sLF
现在,我想检查一下,下次我会加密相同的文字。我没有可变信息,但我有加密文字。
var message2 = "message to encrypt";
var iv = CryptoJS.enc.Hex.parse(encrypted.iv.toString());
var key = CryptoJS.enc.Hex.parse(keyString);
var encrypted1 = CryptoJS.AES.encrypt(message2, key, {iv: iv, mode: CryptoJS.mode.CFB});
console.log(encrypted1); //xbPp9LFwl12hkLKwlvjpMaVj5Rss7YUbR0fP61wFXw8=
但是如果变量message1 == message2,我想获得相同的加密文本。 如果我第二次设置iv和key - 我下次会得到相同的结果。但是,作为第一次,我想在随机编辑函数中生成IV。有可能吗?
答案 0 :(得分:0)
首先,CryptoJS以不同方式处理密钥和密码。如果你提供一个字符串,它将自动从密码和盐中导出密钥和IV。因此,如果keyString
确实是一个字符串,则需要提供相同的盐,如果它是一个键,则需要提供相同的IV。
如果您想稍后检索它,可以将IV(在调用encrypt
之前生成)添加到密文前面。如果我没弄错,那么盐已经被密码(OpenSSL)兼容密文了,所以你可以在解码后从字节8..15中检索它。
请注意,重复使用IV或盐对于任何操作模式(在您的示例中为CFB)通常都不安全,但它取决于操作模式如何不安全重复四是。它可以进行比较,但我不会存储多个具有相同IV或盐的密文。
通常有更好的方法可以为上面描述的特殊方案创建相同的功能。