AES加密算法
S盒变化采用有限域的方式来进行操作
密匙也是简单生成的密匙,这里并没有采用随机密匙生成的方式
只是对AES加密的过程的一个简单的实现以及解密过程
可以作为理解AES加密过程的一个参考
pch.h是在Visual Studio 2017中的一个空的头文件,如果使用VS直接创建文件会自动生成这个头文件
pch.h可以直接删除然后运行程序
后继会完善 此代码直到实现AES 128 196 256三个密码的实现,并且在此页面附加更新后的网址
暂时会用ECB模式后面会采用其他更复杂的加密模式
ECB模式实现较为简单,加密安全性并不高,请不要参考此方式进行数据加密。
#include "pch.h"
#include <iostream>
void S_Box(char(*pa)[4]);
void S_BoxInverse(char(*pa)[4]);
void AesInput(char(*pa)[4]); //输入需要加密的内容
void AesOutput(char(*pa)[4]);//输出AES内容
void KeyAssign(int(*pk)[4]); //Key初始化
void KeyColMove(int(*pk)[4], int i, int j); //Key 行移位
void KeyOutput(int(*pk)[4]); //输出当前Key结果
void KeyRowMix(int(*pk)[4], int(*pkm)[4]); //Key列变化
void XorKeyAES(int(*pk)[4], char(*pa)[4]); //轮密钥异或操作
int main()
{
char aes[4][4]; //需要加密密的内容
int key[4][4]; //加密密钥
int keyMix[4][4] = { { 2,3,1,1 }, { 1,2,3,1 }, {1,1,2,3},{3,1,1,2} }; //混叠所需内容
//参数传递所需指针
char(*pa)[4];
int(*pk)[4];
int(*pkm)[4];
pa = aes;
pk = key;
pkm = keyMix;
AesInput(pa);//初始化加密
KeyAssign(pk);//Key初始化
KeyOutput(pk);
//Key 行移位
KeyColMove(pk, 1, 1);
KeyColMove(pk, 2, 2);
KeyColMove(pk, 3, 3);
KeyOutput(pk);
//Key 列混淆
KeyRowMix(pk, pkm);
KeyOutput(pk);
//AES S盒映射 选择 3 171
S_Box(pa);
AesOutput(pa);
//与密匙XOR
XorKeyAES(pk, pa);
AesOutput(pa);
//解密与当前密匙XOR
XorKeyAES(pk, pa);
AesOutput(pa);
//S盒逆变化完成解密过程
S_BoxInverse(pa);
AesOutput(pa);
}
void S_Box(char(*pa)[4])
{
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
pa[i][j] *= 3;
}
}
}
void S_BoxInverse(char(*pa)[4])
{
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
pa[i][j] *= 171;
}
}
}
void AesInput(char(*pa)[4])
{
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
//std::cin >> pa[i][j];
pa[i][j] = 'a' + j;
}
}
}
void AesOutput(char(*pa)[4])
{
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
std::cout << pa[i][j] << " ";
}
std::cout << "\n";
}
}
void KeyAssign(int(*pk)[4])
{
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
pk[i][j] = i * 4 + j;
}
}
}
void KeyColMove(int(*pk)[4], int i, int j)
{
int k = 0;
int temKey[4];
for (k = 0; k < 4; k++)
temKey[k] = pk[i][(j + k) % 4];
for (k = 0; k < 4; k++)
pk[i][k] = temKey[k];
}
void KeyOutput(int(*pk)[4])
{
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
std::cout << pk[i][j] << " ";
}
std::cout << "\n";
}
std::cout << "\n";
}
void KeyRowMix(int(*pk)[4], int(*pkm)[4])
{
int i, j, k;
int keyTem[4];
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
for (k = 0; k < 4; k++)
{
keyTem[k] = pkm[j][k] * pk[k][i];
}
pk[i][j] = (keyTem[0] ^ keyTem[1] ^ keyTem[2] ^ keyTem[3]) % 256;
}
}
}
void XorKeyAES(int(*pk)[4], char(*pa)[4])
{
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
pa[i][j] = pa[i][j] ^ pk[i][j];
}
}
}