以AES算法明文128bit、密鑰128bit爲例:
輪密鑰加操作就是將輪密鑰與明文(狀態)按比特異或。輪密鑰通過密鑰擴展得到,初始密鑰與初始明文均是用戶自己設置。簡單來說,密鑰加操作就是逐字節相加,有限域GF(28)上的加法是模2加法,即異或。
附上自己敲的C語言源碼:
#include <iostream>
using namespace std;
void PrintfMatrix(unsigned char m[4][4])
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
printf("%2x",m[i][j]);
if(j%4==3)
puts("");
}
}
}
void AddRoundKey(unsigned char state[4][4],unsigned char key[4][4]) //密鑰加函數
{
int i,j;
for (i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
state[i][j]^=key[i][j]; //明文與密鑰的異或,即密鑰加
}
}
}
int main()
{
unsigned char state[4][4]={
0,4,8,12,
1,5,9,13,
2,6,10,14,
3,7,11,15,
};
unsigned char key[4][4]={
0,1,2,3,
4,5,6,7,
8,9,10,11,
12,13,14,15,
};
printf("明文爲:\n");PrintfMatrix(state);
printf("密鑰爲:\n");PrintfMatrix(key);
AddRoundKey(state,key); //在主函數中調用密鑰加函數
printf("密鑰加結果:\n");PrintfMatrix(state);
return 0;
}
程序運行結果如下: