Python密碼學編程
寫在前面
婁老師推薦的這本書《Python密碼學編程》,比較系統地講述了許多經典的密碼,並在介紹密碼原理、python實現的過程中、介紹了python的許多語法知識,對於我們信息安全專業的學生不僅在密碼學知識上,並且在Python編程中都有很大的幫助。
本書代碼鏈接
反向密碼源代碼
凱撒密碼程序
暴力破解凱撒密碼
置換加密
破解置換密碼
編寫測試程序
文件加密程序
編程檢測英文文本
破解置換密碼
仿射密碼模塊運算
仿射密碼
破解仿射密碼
簡單代換密碼
簡單代換密碼破解
維吉尼亞密碼
維吉尼亞密碼破解
反向密碼實現與破解
及將所有字符反向來加密,是比較簡單的加密方式
python實現
解碼驗證
凱撒密碼實現與破解
在密碼學中,愷撒密碼(英語:Caesar cipher),或稱愷撒加密、愷撒變換、變換加密,是一種最簡單且最廣為人知的加密技術。它是一種替換加密的技術,明文中的所有字母都在字母表上向后(或向前)按照一個固定數目進行偏移后被替換成密文。例如,當偏移量是3的時候,所有的字母A將被替換成D,B變成E,以此類推。這個加密方法是以羅馬共和時期愷撒的名字命名的,當年愷撒曾用此方法與其將軍們進行聯系。
python實現
編碼
解碼
暴力破解凱撒密碼
如果我們知道了密碼的加密方式為凱撒加密,但不知道使用的是什么密匙,我們就可以用枚舉法,暴力破解,一共只有66種可能,交給計算機來就是一瞬的事情。
Python實現
- 練一練
置換密碼實現加密與破解
- 置換密碼
和替換密碼不同的是,置換密碼是通過對原始信息中的字符重新排列,使其變得不可讀,因為不同的密匙會導致字符有不用的順序,將密文重新排列還原成原始消息。 - 用置換密碼進行加密的步驟如下:
1.計算消息和密匙中字符的個數
2.繪制一行個數等於密匙值的空框(如密鑰為8,繪制8個框)
3.從左到右開始對框進行填充,每個框內放置一個字符。
4.當框已經填滿但還有剩余字符時,再添加一行空框。
5.到最后一個字符時,為最后一行未使用的框塗上陰影。
6.從左上方開始,每列依次向下寫出字符。當到達一列的底部,移到右側一列,並跳過陰影框,這樣的結果是密文
實例“Common sense is not so common." 用數字8作為密鑰
python實現
置換加密算法
用python實現置換加密的關鍵就是了解算法
ciphertext =[''] * key
ciphertext變量中的每個字符串代表置換密碼網格中的一列。因為列的數量與鍵的值相等,所以可以使用復制列表的方式將具有一個空字符串的列表乘以鍵的值。這樣就得到了一個擁有正確數目的空字符串的列表
然后
for column in range(key):
currentIndex =column
破解置換密碼
- 如何在紙上破解置換密碼
python實現破解置換密碼
編寫測試程序
文件的加密和解密
python實現
編程檢測英語文本
Python破解置換密碼
仿射密碼實現與破解
- 模運算
模運算或者稱時鍾運算,是指數字達到某一特定值時,對其取模,用模運算來處理仿射密碼中的回環。
類似於時鍾問題如10小時后的5小時是幾小時
10+5=15 15/12=1...3 所以是指向3小時 - 尋找最大公約數
通過可視化兩個因數的因子,最容易找到最大公約數現在舉例古氏積木法,可視化3+2=5 5*3=15
def gcd(a,b):
while a !=0:
a,b =b%a,a
return b
def findModInverse(a,m):
if gcd(a,m) !=1:
return None
u1,u2,u3=1,0,a
v1,v2,v3=0,1,m
while v3 != 0:
q=u3//v3
v1,v2,v3,u1,u2,u3=(u1-q* v1),(u2-q*v2),(u3-q*v3),v1,v2,v3
return u1 %m
Cryptomath模塊的源代碼 包含gcd函數和歐幾里得擴展算法的findModInverse函數
仿射加密
仿射加密法需要兩個密鑰:一個用於乘數加密法相乘,另一個用於凱撒加密法相加。
對於仿射加密法程序,我們將使用單個整數密鑰。我們將通過某種簡單的數學運算把這
個密鑰分成兩個密鑰,我們把它們稱為密鑰A和密鑰B。
使用仿射加密法加密會將一個字符在SYMBOLS里的索引乘以密鑰A,再加上密鑰B。
但是,如果keyA是1,加密之后的文字將會非常弱,因為將這個索引乘以1並未改變它。
類似地,如果keyB是0,加密之后的文字也會非常弱,因為將這個索引加上0並未改變它。
如果keyA是1,且keyB是0,那么“加密之后的”消息就會和原來的消息完全一樣。也就是根本沒有加密!
破解仿射密碼
只要密鑰的數量級是幾千個,暴力破解就不會花費計算機很長時間,可以嘗試每一個可能的密鑰並使用isEnglish()函數來尋找正確的密鑰。
用來暴力破譯密文的密鑰的整數范圍是從0到符號集大小的二次方
我們之所以這樣相乘是因為密鑰A有len (affineCipher.SYMBOLS)個可能的整數,密鑰B也有len (affineCipher.SYMBOLS)個可能的整數。要得到可能密鑰的整個范圍,我們將這些值相乘來尋找進一步范圍。
簡單代換密碼原理即破解
讓我們先用紙筆實現簡單替代加密法。比如說,我們要用密鑰VJZBGNFEPLITMXDW
KQUCRYAHSO加密消息“Attack at dawn.”。首先寫出字母表的字母,然后在它下面寫下密鑰。
ABCDEFGHIJKLMNOPQRSTUVWXYZ
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
VJZBGNFEPLITMXDWKQUCRYAHSO
要加密消息,從上面那行的明文找到字母,用下面那行的字母替代它。A加密成V,T
加密成C,C加密成Z,如此類推。因此,消息“Attack at dawn.”加密成“Vccvzi vc bvax.”。
要解密,從下面那行的密文找到字母,用上面那行的字母替代它。V解密成A,C解密
成T,Z解密成C,如此類推...
簡單替代加密法的優勢是擁有大量可能的密鑰。劣勢是密鑰有26個字符的長度,很
難記。如果字母在明文里是小寫的,它在密文里也是小寫的;如果字母在明文里是大寫
的,它在密文里也是大寫的。簡單替代加密法並不加密空格或標點符號。
簡單替代加密法的密鑰字符串值只有在它包含了符號集里的每個字符且沒有重復或缺失
的情況下才有效。我們可以按照字母表順序對一個字符串值和符號集分別進行排序,並檢查
它們是否相等,這樣就能判斷這個字符串值是不是一個有效的密鑰了。
破解簡單代換密碼
通過單詞模式可以猜測密文字母可能解密到哪些明文字母,這些明文字母稱為密文字母的可能解密字母。
破解步驟如下
- 在密文中找出每個密文單詞的單詞模式
- 找出每個密文單詞的英語單詞候選項
- 為每個密文字母創建一個字典存儲為可能解密字母,相當於對每個密文單詞獲取密文字母映射
- 將密文字母的映射取交集合並為一個映射,稱之為交集映射
- 從交集映射中移除任意已經確定了正確映射的密文字母
- 根據確定了的密文字母映射解密密文
維吉尼亞密碼實現與破解
與凱撒密碼不同,維吉尼亞密碼是一種多密匙密碼
簡單來講就是由多個凱撒密碼組成的維吉尼亞密碼
破解維吉尼亞密碼
本章程序實現的是字典式攻擊算法,這意味着維吉尼亞密碼如果采用英文單詞作為密鑰,很難抵御字典式攻擊
字典式攻擊詳細介紹
感悟
通過這本書,簡單了解了反向密碼、凱撒密碼、置換密碼、文件加密、仿射密碼、簡單代換密碼、維吉尼亞密碼,並通過暴力破解或制作算法破解密碼,對密碼學有了初步的了解,並在學習密碼原理的過程中對於數學能力與Python編程能力也有了很大的提升,希望可以進一步學習密碼學知識,早日做到能自己制作一種加密算法。