最近做了点东西,为了防止能够被简单的逆向破解通讯协议,所以需要进行简单的加密操作。于是实现了一个简单的字符映射的对称加密。
首先先说一下实现原理吧,其实原理很简单,对每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;
做一个简单的加解密演示。加密解密都是一次数组寻址,速度很快。
这是两次加密的结果,可以看到对应的密文是不同的。
用这种简单的字符映射来实现加密,只能实现简单的加密,但是已经足够做到一定程度的防止破解的作用。而且对于某些应用来说,随机性的密码表同样是防止破解的手段,比如每台设备的密码表不同,定时更新密码表等,这样就增大了破解的难度。在此仅实现最简单的加密,满足需求即可。