Python 密碼學編程, 2/e

Al Sweigart 鄭新芳,趙怡翾譯

  • Python 密碼學編程, 2/e-preview-1
  • Python 密碼學編程, 2/e-preview-2
Python 密碼學編程, 2/e-preview-1

買這商品的人也買了...

商品描述

自互聯網面世以來,網絡安全一直是人們所重視的問題。
從20世紀中葉開始,流傳千百年的密碼算法紛紛被投入到了網絡安全的應用中;
隨後,在20世紀70年代,與古典密碼完全不同的密碼體制——公鑰密碼算法橫空出世,
密碼學的發展完成了一次飛躍。
Python誕生於20世紀90年代,它是一種面向對象語言特點與解釋型語言特點相結合的*
級程序設計語言,已經得到了大規模應用。
本書將Python語言與密碼學結合起來,從簡單的古典密碼算法開始,
一直到公鑰密碼算法,進行了簡潔而細緻的說明與解讀。
每一種密碼算法的講解包括原理部分、實現部分和破解部分(公鑰算法不包括破解部分),
其中後兩者附有詳細的Python代碼,註釋簡潔明了,可讀性極高。
每章的末尾還提供了一些習題,幫助讀者鞏固所學知識並進行深入理解。
本書適合任何想要學習Python編程並對密碼學抱有興趣的讀者。
本書對Python編程的基礎要求不高,初學者可以放心地閱讀本書。
相信本書一定能夠為讀者帶來絕*的閱讀體驗。  

作者簡介

Al Sweigart

是一位專業的軟件開發人員,他專注於兒童和成人編程項目。
他編寫了《Python遊戲編程快速上手》《Python和Pygame遊戲開髮指南》
《Python密碼學編程》《Python編程快速上手——讓繁瑣工作自動化》等圖書,深受讀者歡迎。  

目錄大綱

目錄:  
第1章製作紙質密碼學工具1  
1.1什麼是密碼學1  
1.2編碼與密碼2  
1.3凱撒密碼3  
1.3.1密碼輪3  
1.3.2使用密碼輪進行加密4  
1.3.3使用密碼輪進行解密5  
1.3.4通過計算進行加密和解密5  
1.4為什麼加密兩次不起作用6  
1.5小結7  
1.6習題7
  
第2章在交互式運行環境中編程8  
2.1簡單的數學表達式8  
2.2整型和浮點數的值9  
2.3表達式10  
2.4運算順序10  
2.5計算表達式的值10  
2.6用變量存儲數值12  
2.7重寫變量13  
2.8變量名14  
2.9小結14  
2.10習題15  

第3章字符串及編寫程序16  
3.1用字符串的值處理文本16  
3.1.1 “+ ”運算符實現字符串拼接17  
3.1.2 “*”運算符實現字符串複製18  
3.1.3通過索引獲得字符串中的字符18  
3.2用print()函數打印值21  
3.3打印轉義字符22  
3.4引號和雙引號23  
3.5在集成開發環境的文件編輯器中編寫程序23  
3.6 “Hello, World!”程序的源代碼24  
3.7使用在線比較工具檢查源代碼25  
3.8通過集成開發環境保存程序26  
3.8. 1保存程序26  
3.8.2運行程序26  
3.8.3打開保存的程序27  
3.9 “Hello, World! ”程序如何工作27  
3.9.1註釋28  
3.9.2打印指示信息28  
3.9.3接收輸入28  
3.9.4完成程序29  
3.10小結29  
3.11習題30  

第4章反向密碼31  
4.1反向密碼程序的源代碼31  
4.2反向密碼程序的執行結果樣例32  
4.3設置註釋及變量32  
4.4確定字符串的長度33  
4.5 while循環33  
4.6 Boolean數據類型34  
4.7比較操作符34  
4.8代碼塊36  
4.9 while循環語句37  
4.10 “增長”字符串38  
4.11用input()提示改進程序40  
4.12小結41  
4.13習題41  

第5章凱撒密碼42  
5.1凱撒密碼程序的源代碼42  
5.2凱撒密碼程序樣例運行43  
5.3導入模塊並創建變量44  
5.4常量和變量45  
5.5 for循環語句45  
5.5.1 for循環的示例46  
5.5.2等價於for循環的while循環46  
5.6 if語句47  
5.6.1 if語句的示例47  
5.6.2 else語句48  
5.6.3 elif語句48  
5.7 in和not in運算符49  
5.8 find()字符串方法50  
5.9符號加密和解密51  
5.9.1實現“回環” 51  
5.9.2處理符號集以外的符號52  
5.10顯示和復制translated字符串52  
5.11加密其他字符53  
5.12小結53  
5.13習題54  

第6章用暴力算法破解凱撒密碼56  
6.1破解凱撒密碼的源代碼56  
6.2運行凱撒密碼破解程序的樣例57  
6.3設置變量58  
6.4在循環中使用range()方法58  
6.5解密消息59  
6.6使用字符串標準化輸出密鑰及  
解密後的信息60  
6.7小結61  
6.8習題62 

第7章通過置換密碼實現加密63  
7.1置換密碼如何工作63  
7.1.1手動加密消息64  
7.1.2創建加密程序65  
7.2置換密碼加密程序的源代碼66  
7.3置換密碼加密程序的示例運行67  
7.4用def語句創建自定義函數67  
7.4.1定義用形參接收實參的函數68  
7.4.2更改僅存在於函數中的形參68  
7.4.3定義main()函數69  
7.5以參數形式傳遞密鑰和消息70  
7.6數據類型:列表70  
7.6.1對列表中的項重新賦值71  
7.6.2多級列表72  
7.6.3對列表使用len()和in運算符72  
7.6.4用+和*運算符連接和復制列表73  
7.7置換加密算法74  
7.8增量賦值運算符75  
7.9隨消息移動currentIndex 75  
7.10 join()字符串方法77  
7.11返回值和返回語句77  
7.11.1 return語句示例78  
7.11.2返回加密得到的密文78  
7.12 __name__變量78  
7.13小結79  
7.14習題80  

第8章解密置換密碼81  
8.1如何在紙上解密置換密碼81  
8.2置換密碼解密程序的源代碼82  
8.3運行置換密碼解密程序的樣例84  
8.4導入模塊並創建主函數84  
8.5使用密鑰解密消息84  
8.5.1 round()、 math.ceil()和math.floor()方法85  
8.5.2 decryptMessage()函數86  
8.5.3布爾操作符87  
8.5.4使用and和or操作符往往是一條捷徑89  
8.5.5布爾操作符的運算順序90  
8.5.6調整變量column和row的值90  
8.6調用main()函數92  
8.7小結92  
8.8習題92 
 
第9章編寫測試程序94  
9.1置換密碼測試程序的源代碼94  
9.2運行置換密碼測試程序的示例95  
9.3導入模塊96  
9.4生成偽隨機數96  
9.5創建隨機字符串97  
9.5.1將字符串複製隨機次98  
9.5.2列表變量使用引用98  
9.5.3傳遞引用101  
9.5.4使用copy.deepcopy()複製列表101  
9.5.5 random.shuffle()函數101  
9.5.6隨機打亂字符串102  
9.6測試消息102  
9.7檢查密碼程序是否正常工作並結束程序103  
9.8調用main()函數104  
9.9檢驗測試程序104  
9.10小結104  
9.11習題105  

第10章文件的加密與解密106  
10.1純文本文件106  
10.2使用置換密碼加密文件的源代碼107  
10.3運行置換密碼加密文件程序的樣例108  
10.4文件操作109  
10.4.1打開文件109  
10.4 .2數據寫入及文件關閉109  
10.4.3讀取文件110  
10.5創建main()函數111  
10.6檢查文件是否存在111  
10.6.1 os.path.exists()方法111  
10.6.2使用os.path.exists()方法檢查輸入的文件是否存在112  
10.7使用字符串方法令用戶的輸入更靈活112  
10.7 .1 upper()、lower()和title()字符串方法112  
10.7.2 startswith()和endswith()方法113  
10.7.3在程序中使用上述字符串方法113  
10.8讀取作為輸入的文件114  
10.9計算加/解密所需的時間114  
10.9.1 time模塊和time.time()方法114  
10.9.2在程序中使用time.time()方法115  
10.10將輸出寫入文件115  
10.11調用main()函數116  
10.12小結116  
10.13習題117  

第11章編程檢測英語文本118  
11.1計算機如何理解英語118  
11.2英語檢測模塊的源代碼120  
11.3英語檢測模塊的運行示例121  
11.4指令和設置常量121  
11.5字典數據類型122  
11.5.1字典和列表之間的區別123  
11.5.2在字典中添加或更改項123  
11.5.3對字典使用len()函數124  
11.5.4對字典使用in運算符124  
11.5. 5用字典檢索項比用列表更快125  
11.5.6在字典上使用循環125  
11.6運行字典文件125  
11.6.1 split()方法126  
11.6.2將字典文件分割成單個單詞126  
11.6.3返回字典數據127  
11.7對消息中出現的英文單詞進行計數127  
11.7.1除數為零錯誤128  
11.7.2對匹配上的英語單詞進行計數128  
11.7.3 float()、int()和str()函數及整數除法129  
11.7.4獲得message中英語單詞的比例129  
11.8刪除非字母字符130  
11.8.1 append()列表方法130  
11.8.2創建字母組成的字符串131  
11.9檢測英語單詞131  
11.9.1使用默認參數132  
11.9 .2計算百分比132  
11.10小結134  
11.11習題134  

第12章破解置換密碼136  
12.1破解置換密碼程序的源代碼136  
12.2運行破解置換密碼程序的樣例137  
12.3導入模塊138  
12.4使用三引號的多行字符串138  
12.5展示破解密文的結果139  
12.6得到破解後的消息140  
12.6.1 strip()字符串方法141  
12.6.2應用strip()字符串方法142  
12.6.3破解失敗142  
12.7調用main()函數143  
12.8小結143  
12.9習題143  

第13章仿射密碼的模運算模塊144  
13.1模運算144  
13.2模運算符145  
13.3尋找因子併計算*大公約數146  
13.4多重賦值147  
13.5歐幾里得算法求*大公約數148  
13.6理解乘法和仿射密碼的工作原理149  
13.6.1為乘法密碼選擇有效的密鑰150  
13.6.2仿射密碼加密150  
13.6.3仿射密碼解密151  
13.6.4計算模逆152  
13.6.5整數除法運算符152  
13.7 Cryptomath模塊的源代碼153  
13.8小結154  
13.9習題154  

第14章編寫仿射密碼155  
14.1仿射密碼程序的源代碼155  
14.2運行仿射密碼程序的樣例157  
14.3引入模塊、設置常量並創建main()函數157  
14.4計算並驗證密鑰158  
14.4.1元組數據類型159  
14.4.2檢驗弱密鑰159  
14.4.3仿射密碼共有多少種密鑰組合160  
14.5編寫加密函數162  
14.6編寫解密函數163  
14.7生成隨機密鑰對164  
14.8調用main()函數164  
14.9小結165  
14.10習題165  

第15章破解仿射密碼166  
15.1仿射密碼破解程序的源代碼166  
15.2仿射密碼破解程序的運行示例167  
15.3創建模塊、常量和main()函數168  
15.4仿射密碼破解函數169  
15.4.1乘方運算符169  
15.4.2計算可能密鑰的總數169  
15.4.3 continue語句170  
15.4.4使用continue跳過代碼171  
15.5調用main()函數172  
15.6小結172  
15.7習題173
  
第16章編寫簡單代換密碼174  
16.1簡單代換密碼的工作原理174  
16.2簡單代換密碼程序的源代碼175  
16.3運行簡單代換密碼程序的樣例177  
16.4引入模塊、設置常量、創建main()函數177  
16.5 sort()列表方法179  
16.6包裹函數179  
16.7 translateMessage()函數181  
16.7.1 isupper()和islower()字符串方法182  
16.7.2用isupper()保留字符原大小寫形式183  
16.8生成隨機密鑰184  
16.9調用main()函數184  
16.10小結185  
16.11習題185 
 
第17章破解簡單代換密碼186  
17.1使用單詞模式進行解密186  
17.1.1尋找單詞模式187  
17.1.2尋找可能解密字母187  
17.2破解程序總覽188  
17.3單詞模式模塊189  
17.4簡單代換破解程序的源代碼190  
17.5簡單代換破解程序的運行示例193  
17.6創建模塊和常量193  
17.7用正則表達式查找字符194  
17.8創建main()函數194  
17.9向用戶顯示破解結果195  
17.10創建密文映射195  
17.10.1創建空映射196  
17.10.2向映射添加字母196  
17.10.3取兩個映射的交集197  
17.10.4字母映射輔助函數的工作原理198  
17.10.5識別映射中已確定的明文字母201  
17.10.6測試removeSolvedLetterFrom-Mapping()函數203  
17.11 hackSimpleSub()函數203  
17.11.1 replace()字符串方法205  
17.11.2解密消息205  
17.11.3在交互式運行環境中進行解密206  
17.12調用main()函數207  
17.13小結208  
17.14習題208  

第18章編寫維吉尼亞密碼209  
18.1在維吉尼亞密碼中使用多字母密鑰209  
18.1.1密鑰越長,維吉尼亞密碼越安全211  
18.1.2選擇一把抗字典攻擊的密鑰212  
18.2維吉尼亞密碼實現程序的源代碼212  
18.3運行維吉尼亞密碼實現程序的樣例214  
18.4引入模塊、設置常量和創建main ()函數214  
18.5使用List-Append-Join模式生成字符串215  
18.6消息的加密與解密216  
18.7調用main()函數218  
18.8小結218  
18.9習題219  

第19章頻率分析220  
19.1分析文本中的字母頻率220  
19.2匹配字母頻率222  
19.2.1計算簡單代換密碼的頻率匹配分數222  
19.2.2計算置換密碼的頻率匹配分數223  
19.2.3對維吉尼亞密碼進行頻率分析224  
19.3計算字母頻率的源碼224  
19.4以“ETAOIN”順序保存字母226  
19.5對消息中的字母進行計數227  
19.6獲取元組的第一個成員228  
19.7將消息中的字母按頻率大小排序228  
19.7.1 getLetterCount()完成字母計數229  
19.7.2創建字典存儲頻率和字母列表229  
19.7.3按ETAOIN順序排序字母列表230  
19.7.4字典列表按頻率大小排序233  
19.7.5創建列表存儲排序後的字母235  
19.8計算消息的頻率匹配分數235  
19.9小結236  
19.10習題237  

第20章破解維吉尼亞密碼238  
20.1運用字典式攻擊暴力破解維吉尼亞密碼238  
20.2維吉尼亞密碼字典式破解程序的源代碼238  
20.3維吉尼亞密碼字典式破解程序的運行樣例239  
20.4關於維吉尼亞密碼破解程序240  
20.5運用Kasiski檢測確定密鑰長度240  
20.5.1找到重複序列240  
20.5.2求得間隔的因子241  
20.5.3提取字符串的每個第N位字母242  
20.5.4使用頻率分析法逐個破解子密鑰243  
20.5.5暴力破解可能密鑰245  
20.6維吉尼亞密碼破解程序的源代碼246  
20.7維吉尼亞密碼破解程序的運行樣例251  
20.8引入模塊、設置常量和創建main()函數251  
20.9尋找重複序列252  
20.10求得間隔數的因子254  
20.10.1通過set()函數去除重複元素255  
20.10.2移除重複因子並對列表進行排序256  
20.10.3找到出現次數*多的因子256  
20.11找到*可能的密鑰長度258  
20.11. 1 extend()列表方法258  
20.11.2擴展repeatedSeqSpacings字典259  
20.11.3從factorByCount中獲取因子259  
20.12找到由相同子密鑰加密的字母260  
20.13嘗試用可能的密鑰長度進行解密261  
20.13.1 print()的end關鍵字參數263  
20.13.2以沉默模式執行程序或打印信息263  
20.13.3確定子密鑰的可能組合264  
20.13.4以正確的大小寫形式打印解密後的文本267  
20.14返回破解後的消息268  
20.14.1找到可能密鑰後跳出循環268  
20.14.2用其他所有可能密鑰長度進行暴力破解269  
20.15調用main()函數269  
20.16改變破解程序中的常量269  
20.17小結270  
20.18習題271
  
第21章一次一密272  
21.1不可破解的一次一密272  
21.1.1密鑰長度等於消息長度272  
21.1.2使密鑰真正隨機274  
21.1. 3避免兩次一密274  
21.2為什麼兩次一密是維吉尼亞密碼275  
21.3小結276  
21.4習題276

第22章素數的查找與生成277  
22.1什麼是素數277  
22.2素數模塊的源代碼279  
22.3素數模塊的調用樣例281  
22.4試除法的原理281  
22.5實現試除法檢測283  
22.6埃拉托斯特尼篩法283  
22.7使用埃拉托斯特尼篩法生成  素數285  
22.8 Rabin-Miller素性檢測算法286  
22.9尋找大素數287  
22.10生成大素數288  
22.11小結289  
22.12習題28
  
第23章為公鑰密碼生成密鑰290  
23.1公鑰密碼體制290  
23.2認證的問題291  
23.2.1數字簽名292  
23.2.2謹防MITM攻擊293  
23.3生成公鑰和私鑰的步驟293  
23.4公鑰生成程序的源代碼294  
23.5公鑰生成程序的示例運行295  
23.6創建main()函數296  
23.7通過generateKey()函數生成密鑰297  
23.7.1計算e的值297  
23.7.2計算d的值298  
23.7.3返回公私鑰對298  
23.8通過makeKeyFiles()函數創建密鑰文件299  
23.9調用main()函數300  
23.10混合密碼體制301  
23.11小結301  
23.12習題301 

第24章編寫公鑰密碼算法302  
24.1公鑰密碼算法的實現原理302  
24.1.1分組的創建302  
24.1.2字符串轉換為分組303  
24.1.3公鑰密碼算法進行加解密的數學原理305  
24.1.4分組轉換為字符串306  
24.1.5為什麼不能破解公鑰密碼307  
24.2實現公鑰密碼算法的源代碼309  
24.3公鑰密碼算法實現程序的運行樣例312  
24.4程序的設置313  
24.5程序如何判斷加解密314  
24.6通過getBlockFromText()函數將字符串轉換為分組315  
24.6.1 min()函數及max()函數315  
24.6.2將分組存儲在blockInt中316  
24.7使用getTextFromBlocks()進行解密317  
24.7.1使用insert()列表方法318  
24.7.2將消息列表合併為一個字符串318  
24.8編寫encryptMessage()函數319  
24.9編寫decryptMessage()函數319  
24.10從密鑰文件中讀取公鑰和私鑰320  
24.11將加密的內容寫入文件321  
24.12解密文件中的信息323  
24.13調用main()函數324  
24.14小結324  
附錄調試Python代碼326