int a[4][4]={{0x87,0xF2,0x4D,0x97},{0xEC,0x6E,0x4C,0x90},{0x4A,0xC3,0x46,0xE7},{0x8C,0xD8,0x95,0xA6}};
int b[4][4];//行移位后的矩陣
int main(){//行移位for(int i=0;i<=3;i++)for(int j=0;j<=3;j++)
b[i][j]= a[i][(i+j)%4];for(int i=0;i<=3;i++){for(int j=0;j<=3;j++){
cout<<hex<<b[i][j]<<" ";}
cout<<endl;}}
列混淆:一般是將兩個不同的矩陣相乘來實現列混淆,代碼如下;
int mul_mat(int x,int y){if(x ==0x01){return y;}elseif(x ==0x02){if((y&128)!=128){//二進制首位為0return y<<1;}else{
int temp =((y<<1)&((1<<8)-1));//向左移一位,刪掉最高位(保留8位)return temp^(0x1b);}}elseif(x ==0x03){returnmul_mat(0x02,y)^y;}}
輪密鑰加:用輪密鑰矩陣的第 i 列,與上面得到的列混淆矩陣的第 i 列進行異或運算,得到最后的矩陣就是輪密鑰加,代碼如下。
AES結構由以下4個不同模塊組成:
字節代替:使用一個表(被稱為S盒)對分組進行逐一字節替換。S盒是AES算法定義的矩陣,把State中每個字節的高4位作為行值,低4位作為列值,然后取出S一盒中對應行列的元素作為輸出。這個步驟提供了AES算法加密的非線性變換能力。S盒與有限域乘法逆元有關,具有良好的非線性特性。為了避免簡單代數攻擊,S盒結合了乘法逆元及可逆的仿射變換矩陣建構而成。
行移位:行移位變換完成基于行的循環移位操作,變換方法為第0行不變,第1行循環左移1個字節,第2行循環左移兩個字節,第3行循環左移3個字節,代碼如下;
回答所涉及的環境:聯想天逸510S、Windows 10。