修改 vigenere 密碼加密安全?
在網上尋找了 Vigenere 密碼的 python 實現的年齡後,發現很少,我決定自己實現它。在消除所有缺陷之後,它現在是 Vigenere 密碼的有效(和安全)實現。但我有一個想法。
如果你增加它使用的字母的大小怎麼辦?例如:
字母表的大小為
1114111
,並且字母表中的所有字母都已轉換為它們的 ASCII 表示 (a = 97
):加密:
$ c^i = (m^i + k^i) \bmod 1114111 $
解密:
$ m^i = (c^i + k^i + 1114111) \bmod 1114111 $
這會是加密安全的嗎?我假設它會比傳統的 Vigenere 更安全?
維吉尼亞密碼
讓我們看看對 Vigenère 密碼的一些不同攻擊,並確定字母大小的作用有多大。
來自維基百科:
Vigenère 密碼的主要弱點是其密鑰的重複性。如果密碼分析者正確猜出密鑰的長度,則密文可以被視為交織在一起的凱撒密碼,可以很容易地單獨破解。
對於像 1114111 這樣的數字,通過暴力破解單個凱撒密碼仍然很容易。也許如果您進一步增加大小(128 位或更高?)。但是,考慮到密碼的性質,可能會有比暴力破解更好的攻擊。
Kasiski 考試:分析可能對應於密鑰的重複密文組。擴展字母大小不會影響此方法,對此最好的防禦措施是擴展密鑰(理想情況下到明文的長度,稍後會詳細介紹)。
密鑰消除:我們可以猜測密鑰長度(或以某種方式計算出來,如 Kasiski 方法)並從密文中刪除密鑰。這使得字母大小變得多餘(即使它遠高於 1114111),因為無論如何密鑰都會從密文中刪除。為了阻止這種情況,我們的密鑰必須和我們的明文一樣長(見下面的一次性密碼)。
頻率分析和弗里德曼測試:這些依賴於事先獲得有關明文的資訊。根據實現,您的方法可能會破壞這些分析技術(或至少使它們更難以實現)。
這些只是 Wikipedia 上概述的破解 Vigenère 密碼的方法(您當然可以更深入地研究其他方法)。很明顯,現代世界中的 Vigenère 可以被認為是損壞的,即使您使用字母長度並稍微調整密碼也是如此。
一次性密碼 (OTP)
你的問題被標記為一次性填充,所以我想我也應該解決這個問題。一次性密碼可以實現為 Vigenère 密碼,其密鑰長度與明文相同。
一次性墊非常安全,但它有一些規定和缺點。
- 密鑰必須是真正隨機的,並且至少與明文一樣長。
- 這意味著它不應由使用者輸入、重複以適合明文長度或使用任何偽隨機數生成器生成
- 生成真正的隨機數很困難,而且通常不切實際*
- 實際上,您可以使用 CSPRNG,但您的 OTP 僅與您的 CSPRNG 一樣強大(即不是真正的 OTP)
- 不得重複使用密鑰。密鑰使用一次加密,然後一次解密,然後丟棄。使用相同的密鑰加密多個明文可能會使您受到攻擊(例如上面提到的密鑰消除)。
如果這些條件成立,那麼 OTP 是完全隨機的,因為任何一個密鑰都與任何其他密鑰一樣可能。這意味著任何明文都與對手的任何其他明文一樣可能。因此,即使有無限的時間和資源,對手也永遠無法逆轉密碼(沒有密鑰)。
- 可以使用TRNG生成真正的隨機數,通常作為外部硬體設備實現。您可以購買這些作為 USB 輸入設備或製作自己的電路。
這實際上比具有小模數的普通 Vigenère 加密稍微不安全*。*特別是,所有破解 Vigenère 加密的傳統方法在使用大模數的情況下同樣有效(或更好):
- 密鑰長度仍然可以通過計算重合指數和/或通過Kasiski 檢查來確定。
- 如果密鑰明顯短於明文,密碼仍然可以使用頻率分析一次破解一個密鑰值。(如果只是稍微短一點,我們仍然可以得到每次重複密鑰加密的明文段的差異,並嘗試手動解決它。反過來,就像普通的維吉尼亞一樣,如果密鑰至少與消息,從不重複使用並且完全隨機,那麼它在理論上是牢不可破的。)
它不太安全的原因是因為增加模數而不增加可能的明文值的範圍會給攻擊者一些額外的資訊。
例如,假設我們已確定密鑰長度為 $ \ell $ ,並且我們觀察到兩個密文值 $ \ell $ 分開(因此使用相同的密鑰值加密)以具有值 1106983 和 1107073 模 1114111。因此它們的差異為 1107073 - 1106983 = 90。如果我們知道(或可以非常自信地猜測)明文是可列印的ASCII文本,這並沒有留下很多可能的選擇,因為可列印的 ASCII 字元範圍(不包括換行符和製表符)只有 95 個字元(從空格 = 32 到波浪號
~
= 126)。事實上,假設兩個純文字字元都是可列印的 ASCII,它們都不是非常罕見的標點符號,並且都不是換行符或製表符,唯一剩下的可能解決方案是 1106983 編碼一個空格,1107073 編碼z
和鍵值為 1106951。所有可以從只有兩個密文值!另一方面,如果模數只有 128,那麼兩個密文值之間的差 90也可能表示 90 - 128 = -38 的差,這提供了更多的可能性(例如
h
+A
或i
+B
或j
+C
等)當然,即使模數很小,使用重複短密鑰的 Vigenère 加密仍然很弱,通常很容易破解。使模量不必要地變大隻會使它更容易。