该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
编程实现AES密码算法中的列混合和逆列混合变换
源码:
#include
#include
#include char xtime(char input);
void mixcolum(char input[16],char output[16]);
void imixcolum(char input[16],char output[16]);
char f1(char input);
char f2(char input);
char f3(char input);
char f4(char input); int main()
{
char in[16]={'2','0','1','0','1','2','2','0','3','7','0','0','0','0','0','0'},out[16];
int i; printf("plaintext:\n"); for (i = 0; i < 16; i++)
{
printf("%c ", in[i]);
}
printf("\n"); mixcolum(in, out);
printf("after mixcolum:\n");
for (i = 0; i < 16; i++)
{
printf("%c ", out[i]);
}
printf("\n");
strcpy(in, out);
imixcolum(in,out);
printf("after imixcolum:\n");
for (i = 0; i < 16; i++)
{
printf("%c ", out[i]);
}
printf("\n"); return 0;
} char xtime(char input)
{
char output=0; output = input<<1; if (input & 0x80)
{
output = output^0x1b;
} return output;
} void mixcolum(char input[16],char output[16])
{
int i, j, k=0;
char in[4][4], out[4][4]; for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
in[i][j] = input[k];
k++;
}
} for (j = 0; j < 4; j++)
{
for (i = 0; i < 4; i++)
{
if (i == 0)
{
out[i][j] = xtime(in[i][j]) ^ (xtime(in[i+1][j]) ^ in[i+1][j]) ^ in[i+2][j] ^ in[i+3][j];
}
else if(i == 1)
{
out[i][j] = in[i-1][j] ^ xtime(in[i][j]) ^ (xtime(in[i+1][j]) ^ in[i+1][j]) ^ in[i+2][j];
}
else if(i == 2)
{
out[i][j] = in[i-2][j] ^ in[i-1][j] ^ xtime(in[i][j]) ^ (xtime(in[i+1][j]) ^ in[i+1][j]);
}
else if(i == 3)
{
out[i][j] = (xtime(in[i-3][j]) ^ in[i-3][j]) ^ in[i-2][j] ^ in[i-1][j] ^ xtime(in[i][j]);
}
} } k = 0;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
output[k] = out[i][j];
k++;
}
}
output[k] = '\0';
} void imixcolum(char input[16],char output[16])
{
int i, j, k=0;
char in[4][4], out[4][4]; for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
in[i][j] = input[k];
k++;
}
} for (j = 0; j < 4; j++)
{
for (i = 0; i < 4; i++)
if (i == 0)
{
out[i][j] = f4(in[i][j]) ^ f2(in[i+1][j]) ^ f3(in[i+2][j]) ^ f1(in[i+3][j]);
}
else if(i == 1)
{
out[i][j] = f1(in[i-1][j]) ^ f4(in[i][j]) ^ f2(in[i+1][j]) ^ f3(in[i+2][j]);
}
else if(i == 2)
{
out[i][j] = f3(in[i-2][j]) ^ f1(in[i-1][j]) ^ f4(in[i][j]) ^ f2(in[i+1][j]);
}
else if(i == 3)
{
out[i][j] = f2(in[i-3][j]) ^ f3(in[i-2][j]) ^ f1(in[i-1][j]) ^ f4(in[i][j]);
}
} k = 0;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
output[k] = out[i][j];
k++;
}
}
output[k] = '\0';
} char f1(char input)//乘09
{
char output;
int i; output = input;
for (i = 0; i < 3; i++)
{
output = xtime(output);
} output = output ^ input; return output;
} char f2(char input)//乘0b
{
char output;
int i; output = f1(input) ^ xtime(input);
/* output = input;
for (i = 0; i < 3; i++)
{
output = xtime(output);
} output = output ^ xtime(input) ^ input;*/ return output;
} char f3(char input)//乘0d
{
char output;
int i; output = f2(input) ^ xtime(input);
/* output = input;
for (i = 0; i < 3; i++)
{
output = xtime(output);
} output = output ^ xtime(xtime(input)) ^ input;*/ return output;
} char f4(char input)//乘0e
{
char output;
int i; output = f3(input) ^ input;
/* output = input;
for (i = 0; i < 3; i++)
{
output = xtime(output);
} output = output ^ xtime(xtime(input)) ^ xtime(input);*/ return output;
}
问题:1.调试到strcpy出现异常
2. f1、f2、f3、f4函数里的注释部分代替前一行代码,出现的结果不一致(我觉得功能是一样,百思不解)