Encryption

你能幫我理解格式保留加密嗎?

  • August 16, 2019

我遇到了Black 和 Rogaway在一篇開創性論文中首次定義的格式保留加密 (FPE) 的定義。根據他們的論文,FPE(或前綴密碼)定義如下(引自維基百科):

創建 FPE 算法的一種簡單方法 $ {0,…,N-1} $ 就是給每個整數分配一個偽隨機權重,然後按權重排序。通過將現有的分組密碼應用於每個整數來定義權重。

您能幫我理解這種替換和單字母替換之間的區別,以及 FPE 提供什麼安全性嗎?

我不明白單字母替換有什麼區別以及提供的安全性是什麼。

單字母密碼適用於明文的各個符號。但是 FPE 方案將整個消息視為一個單元。在您提到的集合 {0,…,N-1} 中,N 是消息空間的大小——不同消息的數量,而不是不同符號的數量;每個數字代表不同的消息,而不是消息的符號。例如:

  1. 對於 9 位的美國社會安全號碼,N 是十億,並且集合 {0,…,N-1} 中的每個數字代表一個不同的 SSN。
  2. 信用卡號有 16 位,但一般前 6 位和後 4 位必須保持明文,所以中間 6 位是加密的,N = 100 萬。
  • 但是,明文中留下的 10 位數字被用作加密的“調整”,因此中間 6 位的 123456 針對不同的信用卡號加密為不同的值。

FPE 的工作方式是(忽略我上面提到的“調整”概念):

  1. 您在消息空間和集合 {0,…,N-1} 之間定義了一個雙射函式。對於 SSN,N = 1,000,000,000,雙射函式只是將 9 位序列視為十進制數字,其最高有效位用零填充。
  2. FPE 方案為您提供了一個雙射加密函式,它接受一個密鑰和一個介於 {0,…,N-1} 之間的數字,並輸出另一個介於 {0,…,N-1} 之間的數字。(這也需要一些調整,但為了簡單起見,我忽略了這一點。)

因此,要加密 SSN,您可以使用 (1) 中的函式將 SSN 轉換為數字,使用 FPE 方案加密該數字,然後使用 (1) 中的函式的逆函式將加密的數字轉換為加密的 SSN。要解密,請使用函式的倒數。


FPE 方案根據使用者選擇的 N 值的集合 {0,…,N-1} 定義的原因之一是為了靈活性;只要您可以在您的消息空間和這樣的集合之間定義一個雙射,您就可以使用 FPE 來加密這些值。例如,如果您想將 FPE 應用於數據庫日期欄位,則不能僅將日期的數字序列讀取為數字,因為某些此類數字序列不是有效日期(例如,2014-54-35) ,但加密可以很好地輸出數字 20,145,435。但是您可以使用日期算術將日期表示為自參考“時間開始”以來的天數,然後使用此雙射應用 FPE。


提供的安全性有點複雜,但在最基本的層面上,FPE 是集合 {0,…,N-1} 上的偽隨機排列。想像一個解決方案,您有一個大型數據庫,而不是使用密碼,在該數據庫中,對於每個明文社會安全號碼,您都儲存了一個唯一的、隨機選擇的九位數字序列。加密操作有點像這樣。給定一個明文 P:

  1. 在數據庫中搜尋以 P 作為其明文的條目。
  2. 如果 P 已經與密文 C 關聯,則返回 C;
  3. 否則,將 C 設置為隨機選擇的一些消息(使用真正的隨機數生成器)。
  4. 在數據庫中搜尋以 C 作為其密文的條目。
  5. 如果C已經在數據庫中,執行3。
  6. 否則,將條目 (P, C) 儲存在數據庫中,並返回 C。

從沒有加密密鑰但可能已經看到明文/密文對子集的攻擊者的角度來看,FPE 的基本安全目標,簡而言之,是不比實際情況差。

另請注意,存在類似於我描述的六步草圖的*令牌庫解決方案——一個將純文字與唯一隨機值相關聯的數據庫。*所以從另一個意義上說,FPE 的安全目標是提供可比的實際安全性,但成本更低,可靠性和性能更好。

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