//描述 AES 之Mixcolumn Transformation 為在GF(28)下一個如下之轉換動作
//按照这个应该比较容易理解其中的GF(28)运算
#include <iostream>
using namespace std;
/*
AES 之Mixcolumn Transformation
*/
void main()
{
const int xi=4,xj=4,yi=4,yj=4;
int x[xi][xj],y[yi][yj];
int i,j;
// cout << "输入X矩阵数据:" << xi << "x" << xj << '\n';
for (i=0;i<xi;i++)
{
for (j=0;j<xj;j++)
{
// cout << "第" << i+1 << "行,第" << j+1 << "列:";
scanf("%x",&x[i][j]);
}
}
// cout << "输入Y矩阵数据:" << yi << "x" << yj << '\n';
for (i=0;i<yi;i++)
{
for (j=0;j<yj;j++)
{
// cout << "第" << i+1 << "行,第" << j+1 << "列:";
scanf("%x",&y[i][j]);
}
}
int k,sum;
// cout << "计算结果\n";
int a,b;
int temp;
int ans;
for (i=0;i<xi;i++)
{
for (j=0;j<yj;j++)
{
sum = 0;
for (k=0;k<xj;k++)
{
a = x[i][k];
b = y[k][j];
ans = 0;
if(b&1)
ans = a;
for(int j = 1;j<8;j++)
{
int flat = (a >> 7);
a=a<<1;
a%=256;
if(flat&1)//b7==1
a^=0x1B;
b=b>>1;
if((b&1) == 1)
ans^=a;
ans%=256;
}
if(k==0)
sum=ans;
else
sum = sum^ans;
}
printf("\t");
printf("%d:",i*yj+j+1);
printf("%02x",sum);
}
printf("\n");
}
}