2014-02-10 23 views
0

我想用每個HttpResponse發送一個加密文本,當我用加密文本得到下一個HttpRequest時,我解密它並做一些事情:)。Java加密ivSpec是否隨機?

我基於@VoidPointer的在How to encrypt String in Java建議好奇周圍的按鍵和ivSpec的(或隨機數的)一般,但的存儲/ retrievel的最佳實踐專門盯着張貼@sherif代碼,

a)我們是否必須爲每個想要加密的字符串初始化隨機字節的ivSpec?

B)如果是這樣,我們將所生成的ivSpec在一些數據庫,並看它時,我需要使用解密?

c)如果是這樣,我們如何查找它?當一個加密的字符串需要解密時,我們如何從db中選擇正確的ivSpec?

d)一個建議是send ivParameter along with the encrypted string!本身(這可能與@sherif 's implementation發生了什麼!)。如果我們選擇這樣做,那麼如何修改@sherif提供的類來解密和分離iv參數和加密字符串,而不是在初始化解密密碼時提供iv參數?

回答

0

答:如果你不改變的載體,每次加密相同的字符串時,你會得到相同的加密結果。 通過每次更改IV,可以使每個加密輸出看起來不同(即使它是相同的輸入)。 把它看作你在使用密碼散列時使用的「鹽」。

所以一般情況下這將是理想的是使用隨機IV。

乙& C.你需要看的IV起來,是的。但將它存儲到數據庫中並不是很有用。你已經有一段祕密存儲的信息:那就是密碼。 IV只是在這裏增加隨機性,不需要保留它,將它與輸出一起推出。 D.發送它是通常的方式。

一種方式是在輸出中的開頭來連接它。 (輸出= IV +加密數據)。然後在解密之前首先分解輸入(IV = 32個第一字節的輸入)並且解密其餘的(crypt_data_to_decrpt =在字節32之後的輸入)

另一種方式是在開始處具有常數IV和隨機部分: 您只需使用一串NUL字節作爲IV。 然後你加密32個字節的純隨機垃圾 然後你加密你的輸入。 (當使用一種好的加密方法時,這應該總是產生不同的加密輸出,因爲開始是不同的)。 對於解密,您使用相同的空白IV,然後解密所有內容。您在開始時忽略32字節。你分割並且只在第32行之後佔用字節。這是你的解密輸出。