CryptoJS AES。如何重复加密

时间:2014-10-08 14:35:42

标签: encryption aes cryptojs

我遇到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。有可能吗?

1 个答案:

答案 0 :(得分:0)

首先,CryptoJS以不同方式处理密钥和密码。如果你提供一个字符串,它将自动从密码和盐中导出密钥和IV。因此,如果keyString确实是一个字符串,则需要提供相同的盐,如果它是一个键,则需要提供相同的IV。

如果您想稍后检索它,可以将IV(在调用encrypt之前生成)添加到密文前面。如果我没弄错,那么盐已经被密码(OpenSSL)兼容密文了,所以你可以在解码后从字节8..15中检索它。

请注意,重复使用IV或盐对于任何操作模式(在您的示例中为CFB)通常都不安全,但它取决于操作模式如何不安全重复四是。它可以进行比较,但我不会存储多个具有相同IV或盐的密文。

通常有更好的方法可以为上面描述的特殊方案创建相同的功能。