小文 發問時間: 電腦與網際網路程式設計 · 1 0 年前

C++寫AES加密!?

我在寫AES的加密過程

但是因為對C++熟晰度不是很高所以有些地方都卡住

我再寫MixColumns的地方不知道要如何在C++去把兩個陣列作XOR

我也有看過別人的程式當做參考

但是他寫的方法我看不太懂他是什麼原理!?

// xtime macro: (x*{02}) mod {1b}

#define xtime(x) ((x<<1) ^ (((x>>7) & 1) * 0x1b))

// MixColumns() 混合行運算函數

void MixColumns()

{

int i;

unsigned char Tmp,Tm,t;

for(i=0;i<4;i++)

{

t=state[0][i];

Tmp = state[0][i] ^ state[1][i] ^ state[2][i] ^ state[3][i] ;

Tm = state[0][i] ^ state[1][i] ; Tm = xtime(Tm); state[0][i] ^= Tm ^ Tmp ;

Tm = state[1][i] ^ state[2][i] ; Tm = xtime(Tm); state[1][i] ^= Tm ^ Tmp ;

Tm = state[2][i] ^ state[3][i] ; Tm = xtime(Tm); state[2][i] ^= Tm ^ Tmp ;

Tm = state[3][i] ^ t ; Tm = xtime(Tm); state[3][i] ^= Tm ^ Tmp ;

}

}

可以的話請幫我解釋一下他的動作原理

也可以跟我說其他的寫法

已更新項目:

在請問一下MOD的意思是!?

我不太懂~

2 個解答

評分
  • 1 0 年前
    最佳解答

    由於知識 不好打字我把他打成PDF檔,

    建議你可以先去看

    代數-體論

    矩陣乘法

    才有辦法真正了解當初安全性的考量,因為這是由數學去分析它的安全度。

    _

    下載區:

    http://sampage100.googlepages.com/aes.pdf

    _

    注意:

    我公式1中的矩陣是用於加密的過程,而解密時是用另外一組矩陣做乘積。

    2008-09-12 20:39:27 補充:

    mod是取餘數

    在多項式是取->餘式

    2008-09-12 21:23:36 補充:

    做法我補充在這邊

    http://sampage100.googlepages.com/aes2.pdf

    2008-09-16 10:33:59 補充:

    Chen Chien-ning

    你的運算式中:

    應該寫:

    03*a = ({02}‧a)+a會比較正確

    (02*a)a會容易誤會成(02*a)*a

  • 1 0 年前

    從你的發問大概可以了解, 你不懂抽象代數

    MixColumn若不管數學上的意義, 以實作的角度來看, 是兩個4x4的矩陣相乘, 矩陣的內容相信你可以在你的參考書內找到, (由02/03/01組成), 而兩個矩陣內的數字相乘就是在"有限場"上面做運算, 有限場的加法就是XOR, 乘法只會用到下面三種

    01 * a = a

    02 * a 就是上面的 xtime(a)

    03 * a = (02 * a) a = xtime(a) XOR a

    你給的參考程式是最佳化後的結果, 不過耐心的看完程式碼就會懂了

    wiki上也有些MixColumns的說明, 雖然是英文, 但看數學式就夠了

    http://en.wikipedia.org/wiki/Rijndael_mix_columns

    另, MOD運算簡單的說就是除法的餘數, a MOD b就是a除b時的餘數, 但AES中用的MOD運算是多項式的除法, 再說下去就是數學課了

    參考資料: 書: The Design of Rijndael
還有問題?馬上發問,尋求解答。