密碼的原理與實現
一、 基礎知識介紹
凱撒密碼的歷史
凱撒密碼(caeser)是羅馬擴張時期朱利斯•凱撒(Julius Caesar)創造的,用於加密通過信使傳遞的作戰命令。它將字母表中的字母移動一定位置而實現加密。
古羅馬隨筆作家修托尼厄斯在他的作品中披露,凱撒常用一種“密表”給他的朋友寫信。這裡所說的密表,在密碼學上稱為“凱撒密表”。用現代的眼光看,凱撒密表是一種相當簡單的加密變換,就是把明文中的每一個字母用它在字母表上位置後面的第三個字母代替。古羅馬文字就是現在所稱的拉丁文,其字母就是我們從英語中熟知的那26個拉丁字母。因此,凱撒密表就是用d代a,用e代b,……,用z代w。這些代替規則也可用一張表格來表示,所以叫“密表”。
當偏移量是3的時候,所有的字母A將被替換成D,B變成E,以此類推。
基本原理
在密碼學中存在著各種各樣的置換方式,但所有不同的置換方式都包含2個相同的元素。密鑰和協議(算法)。凱撒密碼的密鑰是3,算法是將普通字母表中的字母用密鑰對應的字母替換。置換加密的優點就在於它易於實施卻難於破解. 發送方和接收方很容易事先商量好一個密鑰,然後通過密鑰從明文中生成密文,即是敵人若獲取密文,通過密文直接猜測其代表的意義,在實踐中是不可能的。
凱撒密碼的加密算法極其簡單。其加密過程如下:
在這裡,我們做此約定:明文記為m,密文記為c,加密變換記為E(k1,m)(其中k1為密鑰),解密變換記為D(k2,m)(k2為解密密鑰)(在這裡不妨假設k1=k2,記為k)。凱撒密碼的加密過程可記為如下一個變換:
c≡m+k mod n (其中n為基本字符個數)
同樣,解密過程可表示為:
m≡c+k mod n (其中n為基本字符個數)
對於計算機而言,n可取256或128,m、k、c均為一個8bit的二進制數。顯然,這種加密算法極不安全,即使采用窮舉法,最多也只要255次即可破譯。當然,究其本身而言,仍然是一個單表置換,因此,頻率分析法對其仍是有效的。
加密解密算法
凱撒密碼的替換方法是通過排列明文和密文字母表,密文字母表示通過將明文字母表向左或向右移動一個固定數目的位置。例如,當偏移量是左移3的時候(解密時的密鑰就是3):
明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC
使用時,加密者查找明文字母表中需要加密的消息中的每一個字母所在位置,並且寫下密文字母表中對應的字母。需要解密的人則根據事先已知的密鑰反過來操作,得到原來的明文。例如:
明文:THE QUICK BROWN FOX JUMPSOVER THE LAZY DOG
密文:WKH TXLFN EURZQ IRA MXPSVRYHU WKH ODCB GRJ
恺撒密碼的加密、解密方法還能夠通過同余數的數學方法進行計算。首先將字母用數字代替,A=0,B=1,...,Z=25。此時偏移量為n的加密方法即為:
E (x)= (x+n) mod 2
解密就是:
D (x)=(x-n) mod 2
二、 環境介紹
編程語言
C#語言
編譯環境
Visual Studio 2010
.NET 4.0
操作系統
Windows 7
三、 思路以及算法分析
定義兩個字符數組char ch[]和byte array[]用以存放源文和字符移位處理。
定義一個key,表示移位的個數。這是加密解密的關鍵。
綜合考慮到在密表尾部的字母加密或解密的時候會循環移動到密表頭部,所以加密、解密語句分別為:
向後移動key:
view plainprint?
int offset = (AscII(sou) + key - AscII("a")) % (AscII("z") - AscII("a") + 1);
tar = Convert.ToChar(offset + AscII("a")).ToString();
向前移動key:
view plainprint?
int offset =(AscII("z") + key - AscII(sou)) % (AscII("z") - AscII("a") + 1);
tar = Convert.ToChar(AscII("z") - offset).ToString();
其中AscII為字符轉換方法。
四、 程序功能介紹及結果分析
1.程序功能介紹
a.實現對指定文本文件或字符串中大小寫字母進行加密或解密;
b.執行結果顯示在目標文件內容區域,並實現對其中內容的保存,
c.可指定的密鑰參數
2.程序初始界面
3.程序執行中的界面
4.結果分析
試對明文security進行加密,再將其解密,密鑰參數為5:
執行後,輸出加密後的密文:xjhzwnyd
輸入security的密文xjhzwnyd得到明文security
五、 主要代碼
view plainprint?
private int key = 0;
private string str = "";
//加密算法
for (int i = 0; i < str.Length; i++)
{
string sou = ch[i].ToString();
string tar = "";
bool isChar = "abcdefghijklmnopqrstuvwxyz".Contains(sou.ToLower());
boolisToUpperChar = isChar && (sou.ToUpper() == sou);
sou = sou.ToLower();
if (isChar)
{
int offset = (AscII(sou) + key - AscII("a")) % (AscII("z") - AscII("a") + 1);
tar =Convert.ToChar(offset + AscII("a")).ToString();
if(isToUpperChar)
{
tar = tar.ToUpper();
}
}
else
{
tar = sou;
}
strCaesar += tar;
}
//解密算法
for (int i = 0; i <str.Length; i++)
{
string sou = ch[i].ToString();
string tar = "";
bool isChar = "abcdefghijklmnopqrstuvwxyz".Contains(sou.ToLower());
boolisToUpperChar = isChar && (sou.ToUpper() == sou);
sou = sou.ToLower();
if (isChar)
{
int offset = (AscII("z") + key - AscII(sou)) % (AscII("z") - AscII("a") + 1);
tar = Convert.ToChar(AscII("z") - offset).ToString();
if(isToUpperChar)
{
tar = tar.ToUpper();
}
}
else
{
tar = sou;
}
strCaesar += tar;
}
//字符轉換
private int AscII(stringstr)
{
byte[] array = new byte[1];
array = System.Text.Encoding.ASCII.GetBytes(str);
int asciicode = (short)(array[0]);
return asciicode;
}
六、 總結與不足
程序是在幾個小時內測試運行成功的。凱撒密碼是密碼學中,一種最簡單的加密算法。原理並不復雜,只要理解了,實現起來並不困難。程序並不長,基本實現了對於凱撒密碼的加密和解密過程。但其中還存在很多不足,比如,這段代碼並沒有給出當遇到空格或者別的符號的處理方法,對於密鑰未知的情況下,需要手動指定密鑰進行破解等等。因此,還有很多地方還可以進行改進:1.可以設置一個“暴力破解”方法,實行自動破解;2.算法改進,可以通過同余數的數學方法進行加密、解密。這樣,凱撒密碼就可以變得更加靈活。總體來說,從開始編寫、修改凱撒密碼的程序到最終調試成功,還算比較順利,也體會到了一點密碼學的趣味。
作者“utopia”