AES加密一轮的C语言实现——Rev3

本文深入探讨了AES加密算法的工作原理,包括S盒变化、密钥生成及加密解密过程。通过具体的代码示例,展示了AES算法在Visual Studio 2017中的实现,特别关注了ECB模式的简单应用及其局限性。
摘要由CSDN通过智能技术生成

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];
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值