2014-10-08 77 views
0

我有一個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中的咒語函數。可能嗎?

+0

你對「Intitialization Vector(IV)」的理解是有缺陷的。 – 2014-10-08 14:43:11

+0

好的,可能你會幫我理解嗎?我試圖解決這個問題好幾天。 – warlight 2014-10-08 15:00:53

回答

0

首先,CryptoJS以不同的方式處理密鑰和密碼。如果你提供一個字符串,它將自動從密碼和鹽中派生出一個密鑰和IV。因此,如果您的keyString確實是一個字符串,您將需要提供相同的鹽;如果它是一個鍵,則需要提供相同的鹽。

如果您想稍後檢索,可以將IV(在致電encrypt之前生成)加前綴到密文。如果我沒有弄錯,salt已經被放入密碼(OpenSSL)兼容的密文中,所以你可以在解碼後從字節8..15中檢索它。

請注意,對於任何操作模式(在本例中爲CFB),重複使用IV或鹽通常不安全,儘管取決於操作模式如何不安全地重複IV。做一個比較沒問題,但我不會儲存多個相同IV或鹽的密文。

通常有更好的方法爲上述的特殊方案創建相同的功能。

+0

你喜歡這個問題的方式是什麼?如果我理解正確,關鍵是一個對象,並且密碼 - 字符串,是嗎?如果我有一個對象鍵 - 我可以設置IV。但是如果我有字符串 - 在加密時它會隨機生成。我不明白你的建議前綴IV密文。你可以在JS上寫樣本嗎? – warlight 2014-10-09 10:02:17

+0

沒有。我不明白,如果我使用PBKDF,我應該使用什麼鹽? – warlight 2014-10-13 13:45:52

+0

'var keyString ='b46393431e8dfaa3feec333b6ba02d0b277b8552f092e49e3a2e9b9739ac23ea'; var message =「要加密的消息」; var encrypted = CryptoJS.AES.encrypt(message,keyString); var iv = encrypted.iv; var key = CryptoJS.PBKDF2(keyString,encrypted.salt); var encrypted1 = CryptoJS.AES.encrypt(message,key,{iv:iv});' 怎麼了? – warlight 2014-10-13 14:18:22