AES明文在加密过程中涉及到字节代换、行移位、列混合、轮密钥加等过程。这里对列混合的算法做出一些浅显的解释。
列混合其实就是对一个状态的每一列去乘一个矩阵,其中乘法是在有限域GF(2^8)内进行的,不可约多项式为x^8+x^4+x^2+x+1如图:

先把算法代码列出来:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | void AES::MixColumns(unsigned char state[][4]) // 列混合
{
unsigned char t[4];
int r,c;
for (c=0; c< 4; c++) // 按列处理
{
for (r=0; r<4; r++)
{
t[r] = state[r][c]; // 每一列中的每一个字节拷贝到t[r]中
}
for (r=0; r<4; r++)
{
state[r][c] = FFmul(0x02, t[r]) // 矩阵计算,其中加法为异或
^ FFmul(0x03, t[(r+1)%4])
^ FFmul(0x01, t[(r+2)%4])
^ FFmul(0x01, t[(r+3)%4]);
}
}
}
unsigned char AES::FFmul(unsigned char a, unsigned char b) // 有限域GF(2^8)上的乘法
{
unsigned char bw[4];
unsigned char res=0;
int i;
bw[0] = b;
for (i=1; i<4; i++)
{
bw[i] = bw[i-1]<<1;
if (bw[i-1]&0x80)
{
bw[i]^=0x1b;
}
}
for (i=0; i<4; i++)
{
if ((a>>i)&0x01)
{
res ^= bw[i];
}
}
return res;
}
|
这里重点是有限域GF(2^8)上的乘法。采用的算法的原理如下:
1、 GF(2^8)中任何数乘0x01都不变
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课