實現 AES 的不同方式/算法
我見過一些高級加密標準的軟體實現。它們非常簡單,即它們的實現方式與描述的 AES 完全相同。這使得 AES 的實現非常容易實現。不過我想知道是否還有其他方法可以實現它?實現更快或更安全實施的其他算法?
例如,對於 ECC,我知道有不同的算法可以實現點乘法(雙加法、雙加法、蒙哥馬利算法)。
那麼,是否有不同的算法來實現 AES?
據我所知,至少有 4 種方法可以實現 AES。
一、查表
對於簡單的塊,查找表很快,但它們對時間攻擊很敏感。
這是查找表實現的範例:
b0 = T0[ a0 >> 24 ] ^ T1[(a1 >> 16) & 0xff] ^ T2[(a2 >> 8) & 0xff] ^ T3[ a3 & 0xff] ^ rk[4]; b1 = T0[ a1 >> 24 ] ^ T1[(a2 >> 16) & 0xff] ^ T2[(a3 >> 8) & 0xff] ^ T3[ a0 & 0xff] ^ rk[5]; b2 = T0[ a2 >> 24 ] ^ T1[(a3 >> 16) & 0xff] ^ T2[(a0 >> 8) & 0xff] ^ T3[ a1 & 0xff] ^ rk[6]; b3 = T0[ a3 >> 24 ] ^ T1[(a0 >> 16) & 0xff] ^ T2[(a1 >> 8) & 0xff] ^ T3[ a2 & 0xff] ^ rk[7];
二、帶反轉 $ GF(2)[X] $
一個可以表示 7 次多項式 $ GF(2)[X] $ 通過一個數字 $ GF(2^8) $ . (2.1.4 域上的多項式,第 13 頁,Rinjdael 的設計)或換句話說一個字節。
通過回到最初的定義,人們可以實現
subBytes
這種方式,並有可能保護它免受定時攻擊。三、位切片
等待!這慢得要命!
為了加快速度,我們可以看一下切片版本。位切片基本上是在軟體中編寫硬體實現,考慮到每個位是不同的輸入,並且作為門同時應用的操作。
2007 年,Matsui 和 Nakajima 提出了 AES-CTR 的位切片實現,比表查找版本快 30%。它使用 128 位向量寄存器並同時計算 128 個 AES 塊。唯一的缺點是您需要 2kB 的數據來加密才能從加速中受益。但這在硬碟加密的情況下仍然有用……
兩年後,P. Schwabe 和 E. Käsper 實現了另一個版本,速度提高了 20%,並且沒有這個 2kB 要求。
四。但我需要更多的速度!
2010年,英特爾提供了硬體AES指令。
aesenc xmm1, xmm3 % xmm1 - data, xmm3 - key
這導致:
# Encrypt the block. pxor %xmm5, %xmm0 aesenc %xmm6, %xmm0 aesenc %xmm7, %xmm0 aesenc %xmm8, %xmm0 aesenc %xmm9, %xmm0 aesenc %xmm10, %xmm0 aesenc %xmm11, %xmm0 aesenc %xmm12, %xmm0 aesenc %xmm13, %xmm0 aesenc %xmm14, %xmm0 aesenclast %xmm15, %xmm0
五、更多閱讀:
是否使用以及如何使用查找表主要存在差異。這主要是在防止定時攻擊、性能和程式碼大小之間的平衡行為:
例如,Bouncy Castle 有三個引擎:
- 使用包含 256 個條目的表的“普通”引擎
- 一個帶有 8K 桌子的快速桌子,最後
- 一個沒有表的,不易受到定時攻擊並且程式碼量小)
它們都基於 Brian Gladman 的 Rijndael 實現 - 現在託管在 GitHub 上 ( https://github.com/BrianGladman/AES/blob/master/aes.txt )。AES 是該密碼的一個子集。
當然還有 GPU、協處理器、處理器(英特爾的 AES-NI)、FPGA 等的實現,但以上是您將看到的在軟體中實現密碼的主要配置選項。