相當接近,已經問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]));
}
如不是這種方法最常用的對稱加密,它有什麼問題?
這實現了[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