Python密碼學編程(第2版)

Python密碼學編程(第2版)

《Python密碼學編程(第2版)》是2020年4月人民郵電出版社出版的圖書,作者是[美]阿爾·斯維加特(Al Sweigart)。

基本介紹

  • 書名:Python密碼學編程(第2版)
  • 作者:[美]阿爾·斯維加特(Al Sweigart)
  • 出版社:人民郵電出版社
  • 出版時間:2020年4月
  • 頁數:330 頁
  • 定價:89 元
  • 開本:16 開
  • 裝幀:平裝
  • ISBN:9787115529992
內容簡介,圖書目錄,

內容簡介

自網際網路面世以來,網路安全一直是人們所重視的問題。從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.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.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.7 使用埃拉托斯特尼篩法生成
素數 285
22.8 Rabin-Miller素性檢測算法 286
22.9 尋找大素數 287
22.10 生成大素數 288
22.11 小結 289
22.12 習題 289
第 23章 為公鑰密碼生成密鑰 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
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.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.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.7 使用埃拉托斯特尼篩法生成
素數 285
22.8 Rabin-Miller素性檢測算法 286
22.9 尋找大素數 287
22.10 生成大素數 288
22.11 小結 289
22.12 習題 289
第 23章 為公鑰密碼生成密鑰 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

相關詞條

熱門詞條

聯絡我們