Encryption

對錯誤密碼產生虛擬輸出的加密算法

  • September 29, 2015

背景:我一直在考慮在將文件備份到不受信任的位置的情況下使用加密(以使文件公開並廣泛分發以實現實際故障安全備份)。

問題是,一旦文件公開可用,它將永遠保持不變。再過 20 年,當計算能力出乎意料地快時,AES256 位加密實際上可能毫無用處——而且我的私人備份文件對所有人都可讀。

我在想,作為對加密暴力攻擊的威懾,如果嘗試錯誤的密碼時算法返回的虛擬數據需要人工檢查才能斷言數據不是攻擊者正在尋找的數據。

例子:

我用密碼“pass”加密純文字(比如帳號)“123456789”。

攻擊者試圖暴力破解加密並嘗試密碼“a”。

結果是“987654321”。

現在,攻擊者如何知道這不是我加密的值,而我使用的密碼是“a”?此外,即使攻擊者猜到密碼“pass”,他們怎麼知道“123456789”是正確的值?

這當然是一個簡單的例子,大多數人加密了一些可辨識的工件;人類語言文本、標題可辨識的文件等。因此,這個想法可以擴展到不僅在輸出時打亂數據,還可以包括各種生成的“虛擬”工件(常見文件格式、語言文本樣本等)必須包含在核心算法中(虛擬數據可以是使用者定義的)。錯誤密碼輸出的虛擬數據可能包括有效的 JPEG 文件、WORD 文件、PNG 文件以及來自各種語言的有效文本樣本。

結果將使加密文件很難在沒有大量計算人力或對加密內容的特定知識的情況下被暴力破解。

有沒有像這樣工作的算法?這個想法本身是否有任何缺陷?

是的,這是可能的(有條件的)。聽起來您想要Format Preserving Encryption。FPE 通過從任意域加密來工作 $ X $ 到 $ X $ . 因此,如果明文 $ M \in X $ 被加密為密文 $ C \in X $ ,任何解密 $ C $ - 即使使用錯誤的密鑰 - 也會在 $ X $ . 因此,如果攻擊者只知道有效明文的原始格式,他就不會從解密的密文中知道任何東西。在他看來,所有解密的密文都像是有效的明文。

例如,您的域可能是“所有長度為 7 的 ASCII 字元串”,或“長度小於 10 的以 NULL 結尾的數字字元串”,或某種信用卡號碼格式。所有明文、密文和錯誤密鑰解密的密文都將在該域中。在您的範例中,您可能有一個由 9 個 ASCII 數字組成的域。

(以防不明顯:攻擊通常的工作方式是攻擊者將密文解密到明文消息空間 $ Y $ ,但他們知道一些關於將潛在域限制在某個集合的原始明文 $ Z $ 嚴格包含在 $ Y $ (那是, $ Z \subset Y $ )。在一個典型的密碼中,我們加密 $ {0,1}^n \rightarrow {0,1}^m $ (一個二進製字元串到另一個),但很少有所有明文實際上可以是任何二進制值,通常它們只是輸入域的嚴格子集。所以我們假設攻擊者知道哪些明文格式是有效的,他們只是根據這個較小的域檢查解密的明文。FPE 解決了這個問題,只允許對有效明文的域進行加密和解密。攻擊者將永遠無法查看解密的值並斷定它是無效的明文。例如,如果他們正在解密一個信用卡號,他們知道一個有效的解密 CC 會是什麼樣子,但是使用 FPE 算法,所有解密的消息都會看起來像一個有效的 CC。)

請注意,如果攻擊者知道原始明文的某些部分不適用於所有有效的明文,這不會緩解問題。FPE 緩解了攻擊者只知道所有有效消息的原始消息空間的攻擊,但他們可能知道手頭上的特定消息的某些資訊,而這些資訊不適用於其他消息。(例如,他們可能知道所討論的明文的第 3 個數字是 8,但不一定是所有明文的 8。)在這種情況下,他們將有一個較小的域來檢查解密的消息,並且他們的原始攻擊仍然會在一定程度上幫助他們。

FPE 算法可以從現有的​​分組密碼中實現。將分組密碼轉換為 FPE 有不同的方案,具體取決於您的域大小等。考慮到分組密碼和一個決定原始分組密碼輸出是否在所需域內的函式,一些結構相對簡單。上面連結的維基百科頁麵包含一些描述。

至於您的範例:我認為很少看到 FPE 應用於非常大的域,例如圖像文件。它通常僅適用於小型域,例如數據庫中的信用卡號。我認為我沒有看到它在域大於幾個塊密碼塊的情況下使用。(但是您是否可以在非常大的域上有效地使用 FPE 是一個不同的問題。)

引用自:https://crypto.stackexchange.com/questions/2272