最近做了點東西,爲了防止能夠被簡單的逆向破解通訊協議,所以需要進行簡單的加密操作。於是實現了一個簡單的字符映射的對稱加密。
首先先說一下實現原理吧,其實原理很簡單,對每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;
做一個簡單的加解密演示。加密解密都是一次數組尋址,速度很快。
這是兩次加密的結果,可以看到對應的密文是不同的。
用這種簡單的字符映射來實現加密,只能實現簡單的加密,但是已經足夠做到一定程度的防止破解的作用。而且對於某些應用來說,隨機性的密碼錶同樣是防止破解的手段,比如每臺設備的密碼錶不同,定時更新密碼錶等,這樣就增大了破解的難度。在此僅實現最簡單的加密,滿足需求即可。