如何選擇 FE1 模式格式保留加密中使用的“調整”?
我正在試驗這個庫Botan ,它包括一個基於 FE1 模式的格式保留加密模組。
Encrypt方法的參數如下
/// <summary> /// Generic Z_n FPE encryption, FE1 scheme /// </summary> /// <param name="modulus">Use to determine the range of the numbers. Example, if the /// numbers range from 0 to 999, use "1000" here.</param> /// <param name="plaintext">The number to encrypt.</param> /// <param name="key">Secret key</param> /// <param name="tweak">Non-secret parameter, think of it as an IV</param> /// <returns>The encrypted number.</returns> public static BigInteger Encrypt(BigInteger modulus, BigInteger plaintext, byte[] key, byte[] tweak)
我理解模數,明文和密鑰,但在調整上不清楚。你如何決定它是什麼,你能否對所有明文輸入使用相同的值。可以是任何數字嗎?
調整是加密方法為您提供的一項服務。它允許您做的是使用相同的密鑰為各種加密提供上下文分離。
這是它試圖解決的問題:假設您使用相同的密鑰來加密許多項目;例如,假設您正在使用此密鑰加密數據庫一列中的所有項目。
這導致了一個問題:如果與 Alice 對應的數據記錄在該欄位中有 5,而與 Bob 對應的數據記錄在該欄位中也有 5,那麼這兩條記錄將具有相同的加密值。查看加密記錄的人將無法分辨出該共同值是什麼,但他們知道它們是相同的。而且,如果 Bob 知道他的價值是什麼,那麼他就知道 Alice 的價值是什麼。
一種明顯的處理方法是對每條記錄使用不同的鍵。那行得通,但是要處理和儲存很多密鑰。
該調整提供了另一種處理方式;它改變了明文和密文之間的映射;但是(與密鑰不同)我們不假設攻擊者不知道它是什麼。在我們的數據庫範例中,我們可能會調整使用者名(“Alice”和“Bob”);那麼,即使 Alice 和 Bob 的加密記錄碰巧有相同的加密值,也沒有人可以從中推斷出任何東西(因為從密文到明文的映射是獨立的;它們可能映射到相同的值,也可能不映射) .
這對你意味著什麼?好吧,這取決於您使用 FE1 的目的。如果您實際上是用密鑰加密一個值,那麼您真的不需要它 - 您可以將其設置為固定值(例如,空字元串)。但是,如果您使用相同的密鑰加密多個值,您也許可以利用它。
最後一點:為什麼這個調整對格式保留加密特別重要?好吧,使用標準加密模式,我們在加密期間添加了一個隨機因子 (IV)(這樣,即使您對相同的值加密兩次,我們也會選擇不同的 IV),因此加密的文本看起來會有所不同。然而,這種隨機化必然使密文大於明文。使用 Format Preserving Encryption,我們沒有那個選項;因此我們需要另一種方法來解決這個問題。