如何檢查我的 CFB TEA 加密算法的輸出是否正確?
我有一個關於 CFB 模式下的 TEA 密碼的作業問題。經過一番艱辛和研究,我設法製作了一個 8 位 TEA / CFB 加密算法。我的輸入應該是字元串格式的數字;例如; “12345678”。
這是加密的結果
但是,我沒有任何方法可以檢查加密消息是否確實正確。
我確實理解一種確定它是否正確的方法是通過程式 CFB 模式解密。不幸的是,我生成的密文的解密與最初的明文不同。
因此,我有點困惑是我的加密不正確還是我的解密不正確。
有沒有辦法驗證加密的消息輸出是否正確?還是CFB模式解密方法是唯一的驗證方式?
不,當然還有其他方法可以驗證您的實現。
請注意,可以區分幾個單獨的步驟:
- TEA 分組密碼;
- CFB 模式(使用正確的位數進行轉發);
- 消息和密文的編碼。
首先,針對任何可用的測試向量測試您的分組密碼(沒有 CFB 操作模式)。似乎有幾個可用。
其次,使用眾所周知的分組密碼測試您的 CFB 加密模式,例如 DES、Triple-DES 或河豚(都帶有 64 位塊大小,就像 TEA)。您將需要建立在 CFB 模式加密(CFB-8 或 CFB-64?)中轉發的密鑰、IV 和位數。
第三,測試你的編碼/解碼。您應該將 TEA 的輸出視為二進制,而不是文本。對於輸入消息,您需要一種描述良好、規範的使用數字創建消息的方法。當然,這種編碼/解碼必須是可逆的。編解碼器應首先單獨測試。
最後,嘗試查看所有三個組合是否按預期工作。如果您無法直接找到文本向量,請嘗試使用不同的實現(並首先針對文本向量進行測試)。
您還可以使用第三方實現來創建中間值,這樣您就可以驗證實現的正確性。
這是一個使用 Bouncy Castle (Java, v1.57) 創建的測試向量,當然還有十六進制來表示字節:
TEA in CFB-8 mode K : 2c1003d83c3c3707a92a10f45a3bd72f IV: 681574192889be9d M : 3132333435363738 C : d2751754c6699453
這是您需要測試的表示形式。請注意,輸入消息 M 由字元串“12345678”的 ASCII 編碼組成。128 位密鑰和完整的 64 位 IV 已隨機化。
我建議將實現模組化為這些組件:
- 抽象分組密碼概念的通用介面。
- 一個通用的 CFB 模式實現,而不是對分組密碼實現的硬編碼呼叫,它通過 #1 間接實現。
- 實例化#1 中的介面的 TEA 分組密碼的實現。
- 一個虛擬的“身份”分組密碼,它也實例化#1,但不是實際加密任何東西,只是輸出與提供的完全相同的輸入。
您的測試策略將是測試:
- 您自己的 TEA 分組密碼實現。
- 您的 CFB 實現,但使用身份塊密碼而不是 TEA 進行實例化。
要驗證您的 TEA 實現,您確實需要從其他實現中獲取一些測試向量,例如 Maarten 提供的。這沒有捷徑可走。
為了在恆等密碼上建構一組 CFB 測試案例,我們從 CFB 模式的方程開始:
$$ \begin{align} C_0 & = IV \ C_1 &= E_k(C_0) \oplus P_1 \ & \vdots \ C_i &= E_k(C_{i-1}) \oplus P_i \ \end{align} $$ 現在我們觀察到,由於我們使用的是身份密碼, $ E_k(m) = m $ 對所有人 $ m $ ,因此我們可以將這些方程簡化為:
$$ \begin{align} C_0 & = IV \ C_1 &= C_0 \oplus P_1 \ & \vdots \ C_i &= C_{i-1} \oplus P_i \ \end{align} $$ …並且這些條件很容易測試——您只需編寫一些範例明文,用虛擬密碼對其進行加密,並檢查每個密文塊是否是相應明文塊和前一個密文塊的異或。基本上,身份塊密碼技巧允許您自行測試 CFB 實現的邏輯,而無需考慮 TEA 的功能。