我來,我見,我徵服!————凱撒大帝
網絡在古典密碼學中,有一個著名的凱撒密碼,是一種簡單而廣為人知的加密技術(廣為人知?這對與加密算法來說就不是好事,就很容易被破解),它是一種替代加密技術,雖然用現代技術很容易將密文進行破解。但是在當時,要破解這種密碼確實很難的,但對於密碼學的發展,凱撒密碼對於後續替代加密算法影響深遠……今天,我們對這一技術進行深入探討。
【凱撒密碼起源】
根據蘇維託尼烏斯(古羅馬帝國早期的著名傳記體歷史作家,應該不會錯)的記載,在古羅馬時期作戰中,為防止己方情報被對方獲取,凱撒與他的將軍們進行軍事聯絡時,會將信息進行加密(保密意識很強哦),據說,當時使用的加密技術就是我們現在看到的凱撒密碼算法。現在想想凱撒大帝確實很聰明哦!
在當時來說,沒有工具的輔助支持,加之與凱撒作戰的敵人大多是目不識丁的人(不像現代哦,那時候可能作戰對體質方面要求更高一點),即時他們截獲這些加密的信息,他們可能以為是凱撒使用的是一種外文(當時文字並沒有統一),對於凱撒的敵人來講,要破譯這種密碼也是有一定難度的,史料上也沒有當時人在作戰中破解凱撒密碼的記載,我們暫時可以認為這種加密技術在當時來說是比較先進的。
據說,現存最早的凱撒密碼破解方法被記載在阿爾·肯迪(阿拉伯人,出生於公元9世紀左右)的頻率分析著作中。有興趣的讀者可以看一看。
【凱撒密碼加密算法】
算法具體是這樣描述的:首先提供一個字母表和需要加密的明文(實質是大家都知道意思的字母表的排列組合),再在加密方和解密方之間確定一個相互都知道的密鑰n,拿出明文中第一個字符,在字母表中找到該字符,然後將該字符按照字母表的順序移動n位,找到該字符在字母表中的替代字符將其替代,然後依次類推,後面的字符按照前述方法進行替代,最終替代後的字符串就是加密後的密文。舉個例子,如果要加密英文「this」,密鑰為4,則加密後密文為「ftue」。當然,古羅馬使用的字符可能不是英文字母,但計算方法就是這樣的。
研究凱撒密碼時,人們通常會製作一個像上圖所示的輪盤,中間白色部分是固定的,我們轉動外圈橙色的字母表,比如轉動到圖示所在的位置,由於A字母的索引位置固定(0),轉動後我們找到外圈橙色轉盤中A的位置,它對應字母J的位置,而J的索引位置是9,因此,我們確定密鑰就是9,將密鑰通知凱撒和它的將軍們,軍事情報中碰到字母A就用J代替,B用K代替……依次類推,當解密的時候也很簡單了,碰到字母J用A代替,K用B代替……依次類推就可以將軍事情報還原為明文類型了。
【加密算法Python實現】
在該程序設計中,我們面臨的難點主要有兩個:
一是古羅馬的字符跟我們現在使用的字符是不一樣的,我們的程序應該實現對字符表進行替換的功能,還有密鑰應該也是可以自定義的。因此,我們將字母表、密鑰等作為參數封裝到一個函數中去實現。二是遍歷明文中如果一個字母位移超出字母表的長度時,應該從頭開始繼續索引,跟上面的轉盤的原理是一樣的,這在程序中如何體現?道理很簡單,應該是當索引超出字母表範圍後將索引值再減去字母表的長度即可。解密算法類推,當索引小於0時,加上字母長度即可實現轉盤的效果。現在我們來看代碼,如下圖所示。
怎麼樣,準確實現。程序中定義的主要參數如下:
【message】要加密的內容,即明文【key】相當於密鑰,傳入整型數據【mode】是要加密還是解密, encrypt表示加密,decrypt表示解密【SourceLetter】明文字母表,相當於加密輪盤上白色固定字母【總結】
幾行代碼使用Python實現了凱撒密碼算法,這可是危險的,需要知道的是加密的目的是為了不讓別人看到真實的信息或者通過破譯還原真實信息,凱撒密碼雖然現在來講是很簡單的,但是當時卻不容易被破譯,雖然現在很少見到使用凱撒密碼加密的例子,但它作為一種技術,我們在驚嘆發明它的人的聰明之外,它在密碼學發展中的地位確實不容忽視的,作為Python小白來說實現這一算法也是學習密碼學的必經之路。感興趣的朋友們敲一敲代碼,希望大家有所提高……
歡迎留言討論!
轉載請註明出處(百家號:Python高手養成)