#include
using namespace std;
int columns[4][4]={
02,03,01,01,
01,02,03,01,
01,01,02,03,
03,01,01,02
};//固定矩阵
void MixColumns(int set[][4])
{
int list ,line ;
int add;
int half[4]={0};
int result[4][4];
printf("Output:\n");
for(line=0; line<4 ; line++)
{
for(list =0; list <4 ;list++)
{
for(add = 0; add <4 ;add++)//开始列混合计算
{
if (columns[line][add] == 01)
half[add]=set[add][list];
else if (columns[line][add] == 02)
{
if( set[add][list] >= 128 )
half[add]=(( set[add][list]-128) << 1 ) ^ (27);
else
half[add]=( set[add][list] << 1 );
}
else
{
if( set[add][list] >= 128 )
half[add]=(( set[add][list]-128) << 1 )^( 27 ) ^set[add][list];
else
half[add]=( set[add][list] << 1 )^set[add][list];
}
}
printf("%X ",half[0]^half[1]^half[2]^half[3]);
if(list == 3)
printf("\n");
}
}
}//功能函数
void main( )
{
int set[4][4]={0};
int reset[4][4]={0};
int i,j;
cout<<"input columns 4*4:"<<endl;
for(j=0;j<4;j++)
{
for(i=0;i<4;i++)
cin>>hex>>set[i][j];
}//输入矩阵
MixColumns(set);
}// 主函数