2016-08-30 16 views
3

相當接近,已經問XOR Encryption in Java: losing data after decryption什麼是與SecureRandom的字節流異或的弱點

與播種的SecureRandom產生的字節流進行異或看起來簡單,快捷,例如:

byte[] data = <data to encrypt> 
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN"); 
random.setSeed("myPassword".getBytes(Charset.forName("UTF-8"))); 
byte[] mask = new byte[1]; 
for(int ii = 0; ii < len; ii++) { 
    sr.nextBytes(mask); 
    data[ii] = (byte)(0xFF & (data[ii]^mask[0])); 
} 

如不是這種方法最常用的對稱加密,它有什麼問題?

+0

這實現了[one time pad](https://en.wikipedia.org/wiki/One-time_pad),它的目的是通過密碼分析是不可能的。如果滿足以下約束條件。 1)密鑰與輸入消息具有相同的長度(生成的隨機字節數)2)從不再使用相同的密鑰(意味着生成的隨機字節永遠不會以相同的順序)。在你的例子中,你永遠不應該爲'setSeed()'使用相同的字節數組。對於爲什麼保存的例子,請看[密碼分析嘗試](https://en.wikipedia.org/wiki/One-time_pad#Attempt_at_cryptanalysis)。 – SubOptimal

回答

1

幾個問題,但主要的問題是,如果你只有 -randomness,那麼你有 - 安全。另一方面,真正的隨機不會給出基於種子的相同字節,所以你必須保持整個密鑰流的方便。

不要讓SecureRandom在這個例子中欺騙你。攻擊SHA1PRNG算法比攻擊真實加密如AES容易得多。

+0

謝謝。 如果我可以提出幾個關於你的解釋的問題:當然, ,僞隨機性殺死了一次性pad的想法。然而,填充流仍然完全基於提供的種子和隨機分佈,所以異或消息也將隨機分佈,對吧?如果攻擊者擁有原始的和加密的消息,那麼可以複製該墊 - 另一個更好的僞隨機secureRandom實現是否可以解決這個問題? – JabberW

+0

不是,雖然隨機性的好來源是必不可少的,但這還不夠。這就是流密碼的工作方式,所以如果你在'CTR'模式下使用'AES',你將使用'AES'作爲'securerandom'的數據流。然而,密鑰重用和消息完整性等問題使得理論上的好主意在實踐中不太有用。 – Kayaman

+0

[Here](http://crypto.stackexchange.com/questions/10422/why-not-the-one-time-pad-with-pseudo-number-generator),你不是第一個想知道的人那(你也不會是最後一個)。 – Kayaman