1. 程式人生 > >檔案加密(一) 凱撒加密(Caesar cipher)

檔案加密(一) 凱撒加密(Caesar cipher)

演算法一 : 凱撒加密  (只能對英文的txt)   將每個字元的ASCII碼相對於設定的偏移量偏移

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
	ifstream iFile("D:\\測試1.txt");   //建立輸入檔案流物件
	iFile.seekg(0, ios::end);		
	int nFileLen = iFile.tellg();
	iFile.seekg(0, ios::beg);
	char *str = new char[nFileLen + 1];
	iFile.read(str, nFileLen);
	iFile.close();
	str[nFileLen] = 0;
	int nCaesar = 5;   //設定偏移量
	int n = 0;         //記錄回車數目
	for (int i = 0; i < nFileLen; i++)
	{
		if ((str[i] >= 'a') && (str[i] <= 'z'))
		{
			str[i] += nCaesar;
			if (str[i] > 'z')
				str[i] -= 26;
		}
		else if ((str[i] >= 'A') && (str[i] <= 'Z'))
		{
			str[i] += nCaesar;
			if (str[i] > 'Z')
				str[i] -= 26;
		}
		else if (str[i] == '\n')
			n++;
	}
	ofstream oFile("D:\\測試2.txt");
	oFile.write(str, nFileLen - n);
	oFile.close();
	delete[] str;
	str = nullptr;
	return 0;
} 

語文學的不好,演算法原理就百度copy一下。

在密碼學中,愷撒密碼是一種最簡單且最廣為人知的加密技術。它是一種替換加密的技術,明文中的所有字母都在字母表上向後(或向前)按照一個固定數目進行偏移後被替換成密文。例,當偏移量是3的時候,所有的字母A將被替換成D,B變成E,以此類推。這個加密方法是以愷撒的名字命名的,當年愷撒曾用此方法與其將軍們進行聯絡。 愷撒密碼通常被作為其他更復雜的加密方法中的一個步驟。愷撒密碼還在現代的ROT13系統中被應用。但是和所有的利用字母表進行替換的加密技術一樣,愷撒密碼非常容易被破解,而且在實際應用中也無法保證通訊安全。

重點解釋一下程式碼中的 

<span style="white-space:pre">	</span>str[i] += nCaesar;
	if (str[i] > 'z')
            str[i] -= 26;
如果加密字元的ASCII碼值加上偏移量的值大於z的話,只需要將該值減去26。

 

為什麼要減去26?

可以這麼理解,如果我們要加密字元x,偏移量為3,x的ASCII碼值等於120,加密後為123對應的是符號{ ,加密後的字元不是字母,不便於使用。

因此我們將其減去26等於97,對應字元a,我們把a到z看作一個週期的話,x向後偏移3最終得到的就是字元a。

	else if (str[i] == '\n')
		n++; 
         oFile.write(str, nFileLen);

此處的n為回車的數目,記錄回車的數目,最後寫入檔案要減去回車的數目。

我們先把它在程式碼中註釋掉,也就是不減去回車數目n。


測試1為原始檔,測試2為加密後的檔案。

原始檔中只有ab回車c,回車對應的兩個字元 \n\r,那麼原始檔中記憶體排布就是 ab\n\rc 五個字元,當編譯器讀入原始檔時會自動忽略掉\r,也就變成了 ab\nc 四個字元,nFIleLen = 5,在寫入檔案的時候實際上只有4個字元。所以寫入的時候如果不把回車數減掉,那麼就會出現這樣的錯誤。寫入fg\nh? 五個字元。

oFile.write(str, nFileLen - n);

如果將回車數減掉的話,結果會變成這樣。



結果正確。