使用字符映射完成简单的对称加密

最近做了点东西,为了防止能够被简单的逆向破解通讯协议,所以需要进行简单的加密操作。于是实现了一个简单的字符映射的对称加密。

首先先说一下实现原理吧,其实原理很简单,对每byte数据进行重新映射,比如明文1映射到9,那么解密的时候9对应的就是1。原理并不复杂。但是由于需要完成1对1 的映射,不能出现1映射到了9,同时2也映射到了9,那么将无法完成解密。由于每byte是8 bit,那么需要的映射表就是256个u8。我们要做的就是把0到255打乱顺序,从而完成映射。说到这里已经很明了了,那就是这个加密表的求取就是把0到255乱序的过程。乱序种子我们可以用伪随机数求取的随机种子来承担。

下面开始贴代码:

int key_buff[256];
int lock_buff[256];
int i=0,loc,temp;
for(i=0;i<256;i++)								//生成顺序表 
	lock_buff[i]=i;
先声明两个buff用来存储加密和解密表,实际上映射表只有一个,但是为了运算速度更快,我们选用两个表。然后把其中一个表初始化为顺序表。
srand((unsigned)time(NULL));							//生成随机种子 
for(i=0;i<255;i++)								//生成加密表 
{
	loc=rand()%(255-i);
	temp=lock_buff[255-i];
	lock_buff[255-i]=lock_buff[loc];
	lock_buff[loc]=temp;
}
这个就是核心了,生成乱序表,原理很简单,很容易看明白。

for(i=0;i<256;i++)								//生成解密表			
{
	loc=0;
	while(lock_buff[loc]!=i)
		loc++;
	key_buff[i]=loc;
}
下面生成解密表。这个为了更快的解密。

int test[10]={1,4,6,34,67,93,45,12,5,35}; 
int buff[10];
	
for(i=0;i<10;i++)
	cout<<test[i]<<",";
cout<<"原文"<<endl; 	
for(i=0;i<10;i++)
	buff[i]=lock_buff[test[i]];
for(i=0;i<10;i++)
	cout<<buff[i]<<",";
cout<<"密文"<<endl;
for(i=0;i<10;i++)
	test[i]=key_buff[buff[i]];
for(i=0;i<10;i++)
	cout<<test[i]<<",";
cout<<"解密"<<endl;
做一个简单的加解密演示。加密解密都是一次数组寻址,速度很快。

这是两次加密的结果,可以看到对应的密文是不同的。
用这种简单的字符映射来实现加密,只能实现简单的加密,但是已经足够做到一定程度的防止破解的作用。而且对于某些应用来说,随机性的密码表同样是防止破解的手段,比如每台设备的密码表不同,定时更新密码表等,这样就增大了破解的难度。在此仅实现最简单的加密,满足需求即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值