您的位置:首页 > 其它

AES加密算法之列混合变换

2015-11-17 22:22 309 查看
在AES算法中,需要模多项式m(x)=x^8+x^4+x^3+x+1。列混合即是用一个常矩阵乘以第二步变换后的矩阵,以达到矩阵中每一个元素都是该元素原所在列所有元素的加权和。



例题:





附上自己敲的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("%4x",m[i][j]);
if(j%4==3)
puts("");
}

}
}
unsigned char xtime(unsigned char st)
{
return (st<<1)^((st&0x80)?0x1b:0x00);     //x乘法   二进制串左移一位,判断最高位是否溢出,溢出要异或0x1b
}
void mixcolumns(unsigned char state[4][4],unsigned char cipher[4][4])
{
for(int j=0;j<4;j++)
{
for(int i=0;i<4;i++)
{
cipher[i][j]=xtime(state[i%4][j])      //0x02乘法
^(state[(i+1)%4][j])^xtime(state[(i+1)%4][j])//0x03乘法
^state[(i+2)%4][j]      //0x01乘法
// ^state[(i+2)%4][j];     //0x01乘法   这句写错了,so结果不对,应该是i+3
^state[(i+3)%4][j];     //0x01乘法
}
}
}
int main()
{
unsigned char state[4][4]={
/*0,4,8,12,
1,5,9,13,
2,6,10,14,
3,7,11,15,*/
0x87,0xF2,0x4D,0x97,
0x6E,0x4C,0x90,0xEC,
0x46,0xE7,0x4A,0xC3,
0xA6,0x8C,0xD8,0x95,
};
unsigned char cipher[4][4];
printf("明文为:\n");PrintfMatrix(state);
mixcolumns(state,cipher);
printf("列混合结果:\n");PrintfMatrix(cipher);
return 0;
}
编译结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  AES算法 列混合