2009-11-23 94 views
14

我確定這個問題沒有一個答案,只是試圖找出一個通用的方法。我應該如何生成一個初始化向量?

使用Java 1.4.2,我需要生成用於對稱算法的密鑰和IV。這些值將通過安全通道與收件人預先共享。

我可以KeyGenerator.keyGenerate生成密鑰()。但是,除非我錯過了它,否則不會生成隨機IV。

我應該做的事情完全是任意像記憶拉16個隨機字節?還是有一種生成足夠隨機的初始化向量的首選方法?

任何指導讚賞。

回答

7

對於一些具體實施中,SecureRandom類會幫助你通過產生真正的隨機數:

許多SecureRandom實現是僞隨機數 生成器(PRNG)的形式,這意味着它們 使用 確定性算法來產生來自真實 隨機種子的僞隨機序列。其他實現可以產生真正的隨機數,而其他實現可以使用兩種技術的組合。

它有兩種方法,getProvider()getAlgorithm(),它應該給你一些關於使用哪種實現的信息。從this page看來,僞隨機生成器SHA1PRNG(它是真正的隨機數據種子)是其中之一,甚至是目前唯一可用的。

+1

@schnaader - nit-pick - SHA1PRNG不是真正的RNG。這是一個PRNG(根據您鏈接的頁面)一個真正的隨機種子。 – 2009-11-24 01:53:24

+0

你是對的,編輯答案。 – schnaader 2009-11-24 06:45:31

13

這取決於您使用密碼的模式。如果你使用的是CBC,只要你的RNG是好的,SecureRandom的字節是最簡單的,也可能是最安全的。

大多數Java提供商將自動生成所需的參數,但爲了你找出選擇什麼,你需要了解加密和模式。例如,如果您正在使用需要一個IV的模式,你會做這樣的事情:

cipher.init(Cipher.ENCRYPT_MODE, secret); 
IvParameterSpec spec = 
    cipher.getParameters().getParameterSpec(IvParameterSpec.class); 
byte[] iv = spec.getIV(); 

這使得供應商選擇生成IV本身就是一個合適的方法。但是如果你在ECB模式下使用相同的密碼方法,它會失敗。

使用顯然是一個計數器模式需要非常謹慎,以避免重複使用計數器。

6

正如其他答案暗示的,使用安全的隨機數生成器來創建IV。

正如旁白雖然,你並不需要通過安全通道來發送IV - 它通常只是它,預先準備的消息。請記住,它是遠遠更重要的是,您使用每個消息新鮮的IV,比你保持IVs祕密。同時預先共享IV,因爲密鑰意味着要麼重複使用IV(壞),要麼限制您可以發送的消息數量。

1

如果使用GUI或可以訪問系統調用用戶數據輸入硬件(小鼠優選的)可以創建對鼠標指針的向量座標作爲用戶移動它。將它們添加到一些字符串。比使用你最喜歡的哈希函數的字符串來創建完全隨機的IV與高熵。