和矩阵乘法差不多,只是乘法改成了异或,然后按要求模拟就行了。
#include <stdio.h>
#include <iostream>
#include <algorithm>
#define M 0xFF
#define N 0x1B
using namespace std;
int c[4][4],b[4][4];
int a[4][4]=
{
{2,3,1,1},
{1,2,3,1},
{1,1,2,3},
{3,1,1,2}
};
void matrixmul()
{
int i,j,k;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
c[i][j]=0;
for(k=0;k<4;k++)
{
if(a[i][k]==1)
c[i][j]^=(b[k][j]);
else if(a[i][k]==2)
{
int q=b[k][j]*2;
if(q>M)
q^=N;
c[i][j]^=(q);
}
else
{
int q=b[k][j]*2;
if((b[k][j]*2)>M)
q^=N;
c[i][j]^=(q^(b[k][j]));
}
}
c[i][j]%=256;
}
}
}
int main()
{
int t,i,j;
scanf("%d",&t);
for(int k=0;k<t;k++)
{
if(k!=0)
printf("\n");
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
scanf("%X",&b[i][j]);
}
matrixmul();
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
printf("%02X",c[i][j]);
if(j!=3)
printf(" ");
else
printf("\n");
}
}
}
return 0;
}