資源簡介
AES的S盒可以用擴展的歐幾里德和費馬定理來寫,這里我采用費馬定理。要注意的是S盒的求逆過程是在加瓦羅域下進行的,所以里面的所有乘法、除法、加法、減法都是在加瓦羅域下進行。
代碼片段和文件信息
#include
#include
#include
#include
using?namespace?std;
#define?DBYTE??short?unsigned?int???/*因為m(x)的最高項是8次方,所以總共有9項,所以就用2個字節來表示?*/
#define?BYTE???unsigned?char
DBYTE??mx=0x011b;??/*?m(x)的那個多項式,表示成16進制?*/
/*********************************確定一個字節的某一位是否為1***********************************/
int?seekat7(BYTE?temp)
{
????if(temp?&??0x80)??return?1;
????else???return?0;
}
int?seekat6(BYTE?temp)
{
????if(temp?&??0x40)??return?1;
????else???return?0;
}
int?seekat5(BYTE?temp)
{
????if(temp?&??0x20)??return?1;
????else???return?0;
}
int?seekat4(BYTE?temp)
{
????if(temp?&??0x10)??return?1;
????else???return?0;
}
int?seekat3(BYTE?temp)
{
????if(temp?&??0x08)??return?1;
????else???return?0;
}
int?seekat2(BYTE?temp)
{
????if(temp?&??0x04)??return?1;
????else???return?0;
}
int?seekat1(BYTE?temp)
{
????if(temp?&??0x02)??return?1;
????else???return?0;
}
int?seekat0(BYTE?temp)
{
????if(temp?&??0x01)??return?1;
????else???return?0;
}
/*******************************************************************************************************/
/*********************************一個用兩個字節表示的數它的最高非0位是第幾位***********************************/
int?length(DBYTE??temp)
{?
??int?i=0;
??while(1)
??{?
???
????if(temp==0)??break;
????temp=temp>>1;
????i++;
??}
??
??return?i;
??
}
/*******************************************************************************************************/
/*一個字節在伽瓦羅域下自乘,返回自乘結果(這個是經過簡化后的結果,有些位直接是等于0,有些位就看原來的那個字節在某一位是否為1.)*/
/*自己可以在草稿子上列一些每一位是等于哪些位的乘,有些項是可以消去的(相同的一項異或的結果為0)。總共有14位,自己列一下就清楚了*/
DBYTE?mul(BYTE?temp)
{
???DBYTE??out=0;
???if(seekat7(temp))??out+=0x4000;
???if(seekat6(temp))??out+=0x1000;
???if(seekat5(temp))??out+=0x0400;
???if(seekat4(temp))??out+=0x0100;
???if(seekat3(temp))??out+=0x0040;
???if(seekat2(temp))??out+=0x0010;
???if(seekat1(temp))??out+=0x0004;
???if(seekat0(temp))??out+=0x0001;
???
???return?out;
???
???
}
/*******************************************************************************************************/
/****兩個字節在伽瓦羅域下的乘積,事實上和上面那個函數是一樣的,只不過上面的那個函數是兩個相同的字節相乘,結果可以簡化********/
/**********************************在這里沒辦法化簡,所以只能老老實實一位一位的列出來****************************/
DBYTE??multwo(BYTE?temp1BYTE?temp2)
{
??DBYTE??out=0;
??if(seekat7(temp1)*seekat7(temp2))?out+=0x4000;
??if(?(seekat7(temp1)*seekat6(temp2))^(seekat6(temp1)*seekat7(temp2)))?out+=0x2000;
??if(?(seekat7(temp1)*seekat5(temp2))^(seekat6(temp1)*seekat6(temp2))^(seekat5(temp1)*seekat7(temp2)))?out+=0x1000;
??if(?(seekat7(temp1)*seekat4(temp2))^(seekat6(temp1)*seekat5(temp2))^(seekat5(temp1)*seekat6(temp2))^(seekat4(temp1)*seekat7(temp2)))?out+=0x0800;
??if(?(seekat7(temp1)*seekat3(temp2))^(seekat6(temp1)*seekat4(temp2))^(seekat5(temp1)*seekat5(temp2))^(seekat4(temp1)*seekat6(temp2))^(seekat3(temp1)*seekat7(temp2)))?out+=0x0400;
???if(?(seekat7(temp1)*seekat2(temp2))^(seekat6(temp1)*seekat3(temp2))^(seekat5(temp1)*seekat4(temp2))^(seekat4(temp1)*seekat5(temp2))^(seekat3(temp1)*seekat6(temp2))^(seekat2(temp1)*seekat7(t
- 上一篇:自己用C++實現的RC4算法
- 下一篇:按優先數調度算法實現處理器調度的程序
評論
共有 條評論