Aes

實現 AES 的不同方式/算法

  • April 10, 2017

我見過一些高級加密標準的軟體實現。它們非常簡單,即它們的實現方式與描述的 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

資源

五、更多閱讀:

實施 AES 2000-2010:Emilia Käsper 的性能和安全挑戰

當混合列在密碼中時,位切片如何保持恆定時間

是否使用以及如何使用查找表主要存在差異。這主要是在防止定時攻擊、性能和程式碼大小之間的平衡行為:

例如,Bouncy Castle 有三個引擎:

它們都基於 Brian Gladman 的 Rijndael 實現 - 現在託管在 GitHub 上 ( https://github.com/BrianGladman/AES/blob/master/aes.txt )。AES 是該密碼的一個子集。


當然還有 GPU、協處理器、處理器(英特爾的 AES-NI)、FPGA 等的實現,但以上是您將看到的在軟體中實現密碼的主要配置選項。

引用自:https://crypto.stackexchange.com/questions/44672