文档介绍:AES加密算法实验报告
四 川 大 学 计 算 机 学 院、软 件 学 院
实 验 报 告
学号:姓名:专业: 班级: 第 10 周
课程名称
密码学与网络平安
实验课时
2
实验工程
AES加密算法
void plaintext::MatrixToByte(unsigned char e[])//列混合变换函数
{
unsigned char t[4];
int r, c;
for (c = 0; c< 4; c++)
{
for (r = 0; r<4; r++)
{
t[r] = e[r * 4 + c];
}
for (r = 0; r<4; r++)
{
e[r * 4 + c] = FFmul(0x02, t[r])
^ FFmul(0x03, t[(r + 1) % 4])
^ FFmul(0x01, t[(r + 2) % 4])
^ FFmul(0x01, t[(r + 3) % 4]);
}
}
}
void plaintext::inMatrixToByte(unsigned char e[])//逆列混合变换函数
{
unsigned char t[4];
int r, c;
for (c = 0; c< 4; c++)
{
for (r = 0; r<4; r++)
{
t[r] = e[r * 4 + c];
}
for (r = 0; r<4; r++)
{
e[r * 4 + c] = FFmul(0x0e, t[r])
^ FFmul(0x0b, t[(r + 1) % 4])
^ FFmul(0x0d, t[(r + 2) % 4])
^ FFmul(0x09, t[(r + 3) % 4]);
}
}
}
unsigned char plaintext::FFmul(unsigned char a, unsigned char b)
{
unsigned char bw[4];
unsigned char res = 0;
int i;
bw[0] = b;
for (i = 1; i<4; i++)
{
bw[i] = bw[i - 1] << 1;
if (bw[i - 1] & 0x80)
{
bw[i] ^= 0x1b;
}
}
for (i = 0; i<4; i++)
{
if ((a >> i) & 0x01)
{
res ^= bw[i];
}
}
return res;
}
void plaintext::KeyAdding(unsigned char state[16], unsigned char k[][4])//轮密钥加
{
int r, c;
for (c = 0; c<4; c++)
{
for (r = 0; r<4; r++)
{
state[r + c * 4] ^= k[r][c];
}
}
}
void plaintext::KeyExpansion(unsigned char* key, unsigned char w[][4][4])//密钥扩展
{
int i, j, r, c;
unsigned char rc[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 };
for (r = 0; r<4; r++)
{
for (c = 0; c<4; c++)
{
w[0][r][c] = key[r + c * 4];
}
}
for (i = 1; i <= 10; i++)
{
for (j = 0; j<4; j++)
{
unsigned char t[4];
for (r = 0; r<4; r++)
{
t[r] = j ? w[i][r][j - 1] : w[i - 1][r][3];
}
if (j == 0)
{
unsigned char temp = t[0];
for (r = 0; r<3; r++)
{
t[r] = sBox[t[(r + 1) %