使用字符映射完成簡單的對稱加密

最近做了點東西,爲了防止能夠被簡單的逆向破解通訊協議,所以需要進行簡單的加密操作。於是實現了一個簡單的字符映射的對稱加密。

首先先說一下實現原理吧,其實原理很簡單,對每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;
做一個簡單的加解密演示。加密解密都是一次數組尋址,速度很快。

這是兩次加密的結果,可以看到對應的密文是不同的。
用這種簡單的字符映射來實現加密,只能實現簡單的加密,但是已經足夠做到一定程度的防止破解的作用。而且對於某些應用來說,隨機性的密碼錶同樣是防止破解的手段,比如每臺設備的密碼錶不同,定時更新密碼錶等,這樣就增大了破解的難度。在此僅實現最簡單的加密,滿足需求即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章