Encryption
如何在 IDEA 中實現“乘法模”和“加法模”運算?
我目前正在研究 IDEA(國際數據加密算法),我不知道如何執行乘法模和加法模。
IDEA 使用 128 位密鑰對 64 位塊進行操作,由一系列八個相同的轉換(一輪,見插圖)和一個輸出轉換(半輪)組成。加密和解密的過程是相似的。IDEA 的大部分安全性是通過交錯來自不同組的操作——模加法和乘法,以及按位異或(XOR)——在某種意義上在代數上“不兼容”。
- 按位異或(用帶圓圈的加號 ⊕ 表示)。
- 加法模 $ 2^{16} $ (用加框的加號 ⊞ 表示)。
- 乘法模 $ 2^{16}+1 $ ,其中全零字 (0x0000) 被解釋為 $ 2^{16} $ (用帶圓圈的點⊙表示)。
加法模 $ 2^{16} $ 只是意味著,像往常一樣將兩個數字相加,然後減去 $ 2^{16} $ 從結果直到總和小於 $ 2^{16} $ . 所以假設你想添加,比如說,51995 和 29291 模 $ 2^{16} $ :
51995 + 29291 = 81286 Subtract 2^16 = 65536, you get 81286 - 65536 = 15750 This is less than 65536, so 51995 + 29291 = 15750 modulo 2^16.
乘法模 $ 2^{16} + 1 $ 完全一樣,除了你將兩個數字相乘而不是相加和相減 $ 2^{16} + 1 = 65537 $ 反复代替 $ 2^{16} $ . 並註意 IDEA 為防止熵破壞而要求的額外條件,即如果操作數之一為零,則將其替換為 $ 2^{16} $ (這不是模乘定義的一部分,但需要確保可逆性 - 你明白為什麼嗎?)。
這有點囉嗦,幸運的是在大多數程式語言中都有一個模運算,通常稱為“mod”或“%”,您可以使用它們。有限數據類型也有一個隱式 $ 2^n $ 模運算 $ n $ 是數據類型的位寬,通過溢出(例如,如果您將一個 1 字節的變數設置為 255,並將其增加一,它將變為零),除非它們被明確設計為飽和。由於乘法很慢,您還可以為 IDEA 使用按位快捷方式來使其更快,但我想您並不真的需要這些。
有關更詳細的說明,請參閱此連結。