Python密碼學編程 第2版
內容描述
自互聯網面世以來,網絡安全一直是人們所重視的問題。
從20世紀中葉開始,流傳千百年的密碼算法紛紛被投入到了網絡安全的應用中;
隨後,在20世紀70年代,與古典密碼完全不同的密碼體制——公鑰密碼算法橫空出世,
密碼學的發展完成了一次飛躍。
Python誕生於20世紀90年代,它是一種面向對象語言特點與解釋型語言特點相結合的
級程序設計語言,已經得到了大規模應用。
本書將Python語言與密碼學結合起來,從簡單的古典密碼算法開始,
一直到公鑰密碼算法,進行了簡潔而細緻的說明與解讀。
每一種密碼算法的講解包括原理部分、實現部分和破解部分(公鑰算法不包括破解部分),
其中後兩者附有詳細的Python代碼,註釋簡潔明了,可讀性極高。
每章的末尾還提供了一些習題,幫助讀者鞏固所學知識並進行深入理解。
本書適合任何想要學習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
作者介紹
Al Sweigart
是一位專業的軟件開發人員,他專注於兒童和成人編程項目。
他編寫了《Python遊戲編程快速上手》《Python和Pygame遊戲開髮指南》
《Python密碼學編程》《Python編程快速上手——讓繁瑣工作自動化》等圖書,深受讀者歡迎。