Algorithm-Design
一個簡單的 Vernam 密碼不是和已知的對稱密鑰算法一樣安全嗎?
我剛剛讀到很少關於 Vernam 密碼和實現它的問題。
但是,在實踐中,如果密鑰是由常用的程式語言的
Random()
函式(如 Python 或 Java 標準庫中的隨機函式)生成的,如果密鑰與消息一樣長,則不足以使消息幾乎不可破解,並且關鍵只有文本的作者知道嗎?
Java 或 Python 等語言中的標準隨機數生成器不會生成真正的隨機數,而是生成由初始種子值確定的偽隨機數。如果攻擊者能夠以某種方式猜測或確定這個種子值,他們就可以重建整個偽隨機輸出序列。
此外,大多數語言中的預設偽隨機數生成器在密碼學上並不安全。尤其:
- 可能的種子集通常很小;例如,種子可能是一個 32 位整數,這意味著攻擊者只需測試 2 32 個不同的種子即可找到正確的種子。在現代電腦上,這通常可以在幾秒鐘內完成。
- 更糟糕的是,通常根據一些相當容易猜測的值(例如係統時間)來選擇初始種子。如果使用這樣的種子,並且您大致知道生成密鑰的時間,則可以顯著縮小可能的種子值的範圍。
- 即使從足夠大的集合中安全地(即完全不可預測地)選擇種子以抵抗蠻力猜測,用於從種子生成偽隨機輸出的算法通常也不能承受密碼分析攻擊。因此,對於許多常用算法,種子可以相當有效地從輸出中重建。
上面的前兩種攻擊只要求攻擊者可以訪問一些密文,並且可以嘗試使用基於不同種子的密鑰對其進行解密,並查看生成的解密數據對於哪個種子有意義。最後一種攻擊一般要求多一點,即攻擊者必須至少知道部分密鑰流——但如果攻擊者有密文並且可以猜出部分明文,他們可以很容易地獲得密鑰流的對應部分。
當然,如果您基於沒有任何這些弱點的偽隨機數生成器創建密鑰*,*那麼您描述的方案將是安全的。事實上,這幾乎就是同步流密碼。