在 Format Preserving Encryption 操作之前拆分文本
如果我在 FPE 加密之前重新排序文本,對格式保留加密安全性有什麼影響?
以加拿大郵政編碼(letter-digit-letter digit-letter-digit)為例:
- 議會:K1A 0A6
- 聖誕老人:H0H 0H0
- 容易記住:A1B 2C3
使用郵政編碼作為基數 36 號碼並應用 FF1(NIST 800-38g 測試向量 AES128 密鑰,無調整)給出以下密文:
$$ E_k(\mathtt{K1A0A6}{36}) ==> U7F8BD{36} $$
但不保留原始格式(最後一個字元不是數字)。
如果我對加密的安全性有什麼不同的影響
- 在加密之前將數字和字元組合在一起
- 將字母和數字的基數分別減少到 26 和 10
- 在兩組上應用FF1
- 重新排序密文以保留格式
像這樣的東西:
$$ \begin{gather} E_k(\mathtt{KAA}{26}) ==> FDE \ E_k(\mathtt{106}{10}) ==> 143 \ \end{gather} $$
最終會得到 FF1 加密的郵政編碼:
F1D 4E3
我會在整個郵政編碼上嚴格執行 FF1。這意味著將程式碼轉換為範圍內的數字 $ \big[0,26\cdot10\cdot26\cdot10\cdot26\cdot10\big) $ 然後加密、解密並取回。這是相對簡單的基本轉換,因此應該使用除法和余數數學輕鬆完成。
顯然,否則您可能會洩漏部分輸入的重複。例如,如果我們分別加密第一和第二部分,你可能還會有噴嚏的郵政編碼, $ \mathtt{H0H\space1H0} $ 在那裡 ( $ \mathtt{H1H\space0H1} $ 已經被邪惡的女巫帶走了)。現在你可以看到 $ \mathtt{H0H} $ 重複,所以任何知道打噴嚏程式碼的人也會指出聖誕老人程式碼的第一部分;不好。
由於有許多已知的郵政編碼——其中許多可能已經知道——這意味著可以很容易地快速猜出所有的郵政編碼。如果一個是相對獨特的,那麼它清楚地表明該國人口相當稀少的部分。
其他方案(例如您提出的方案)可能存在類似問題,這在某種程度上取決於郵政編碼的生成方式。通過將整個郵政編碼轉換為數字,可以避免此類問題。