Python密碼學(xué)編程 第2版(異步圖書出品)
定 價:89 元
- 作者:[美] 阿爾·斯維加特(Al Sweigart) 著,鄭新芳,趙怡翾 譯
- 出版時間:2020/4/1
- ISBN:9787115529992
- 出 版 社:人民郵電出版社
- 中圖法分類:TP311.561
- 頁碼:330
- 紙張:膠版紙
- 版次:2
- 開本:16開
自互聯(lián)網(wǎng)面世以來,網(wǎng)絡(luò)安全一直是人們所重視的問題。從20世紀中葉開始,流傳千百年的密碼算法紛紛被投入到了網(wǎng)絡(luò)安全的應(yīng)用中;隨后,在20世紀70年代,與古典密碼完全不同的密碼體制——公鑰密碼算法橫空出世,密碼學(xué)的發(fā)展完成了一次飛躍。
Python誕生于20世紀90年代,它是一種面向?qū)ο笳Z言特點與解釋型語言特點相結(jié)合的高級程序設(shè)計語言,已經(jīng)得到了大規(guī)模應(yīng)用。本書將Python語言與密碼學(xué)結(jié)合起來,從簡單的古典密碼算法開始,一直到公鑰密碼算法,進行了簡潔而細致的說明與解讀。每一種密碼算法的講解包括原理部分、實現(xiàn)部分和破解部分(公鑰算法不包括破解部分),其中后兩者附有詳細的Python代碼,注釋簡潔明了,可讀性極高。每章的末尾還提供了一些習(xí)題,幫助讀者鞏固所學(xué)知識并進行深入理解。
本書適合任何想要學(xué)習(xí)Python編程并對密碼學(xué)抱有興趣的讀者。本書對Python編程的基礎(chǔ)要求不高,初學(xué)者可以放心地閱讀本書。相信本書一定能夠為讀者帶來**的閱讀體驗。
本書是學(xué)習(xí)用Python編程實現(xiàn)加密算法的初學(xué)者指南
本書附帶示例源代碼,幫助讀者學(xué)以致用
本書配有課后習(xí)題及答案,可幫助讀者加深知識理解
通過閱讀本書,您將學(xué)習(xí)如何通過 Python 編程制作和破解密碼,以此創(chuàng)建和發(fā)送密文!學(xué)習(xí) Python 編程的基礎(chǔ) 知識之后,您將從使用反向和凱撒密碼的簡單程序開始,了解為公開密鑰加密的方法,該加密方法用于保護在線事務(wù)的 正常運作,包括數(shù)字簽名和電子郵件。另外,您還將學(xué)習(xí)如何使用經(jīng)典密碼(如置換密碼和維吉尼亞密碼)對文本進行加密。 每個程序都包含完整的代碼和逐行說明。本書結(jié)尾,您將學(xué)習(xí)如何使用 Python 進行編碼。
您還將學(xué)習(xí)以下內(nèi)容:
將循環(huán)、變量和流控制語句組合到實際的工作程序中;
使用字典文件檢測解密的消息是有效的英文還是亂碼;
創(chuàng)建并測試程序以確保代碼正確加密和解密;
對仿射密碼進行編碼(破解)的示例(使用模塊化算術(shù)對消息進行加密);
使用暴力算法和頻率分析等技術(shù)破解密碼。
阿爾·斯維加特(Al Sweigart)是一位專業(yè)的軟件開發(fā)人員,他專注于兒童和成人編程項目。他編寫了《Python游戲編程快速上手》《Python和Pygame游戲開發(fā)指南》《Python密碼學(xué)編程》《Python編程快速上手——讓繁瑣工作自動化》等圖書,深受讀者歡迎。
第 1章 制作紙質(zhì)密碼學(xué)工具 1
1.1 什么是密碼學(xué) 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 小結(jié) 7
1.6 習(xí)題 7
第 2章 在交互式運行環(huán)境中編程 8
2.1 簡單的數(shù)學(xué)表達式 8
2.2 整型和浮點數(shù)的值 9
2.3 表達式 10
2.4 運算順序 10
2.5 計算表達式的值 10
2.6 用變量存儲數(shù)值 12
2.7 重寫變量 13
2.8 變量名 14
2.9 小結(jié) 14
2.10 習(xí)題 15
第3章 字符串及編寫程序 16
3.1 用字符串的值處理文本 16
3.1.1 “+”運算符實現(xiàn)字符串拼接 17
3.1.2 “*”運算符實現(xiàn)字符串復(fù)制 18
3.1.3 通過索引獲得字符串中的字符 18
3.2 用print()函數(shù)打印值 21
3.3 打印轉(zhuǎn)義字符 22
3.4 引號和雙引號 23
3.5 在集成開發(fā)環(huán)境的文件編輯器中編寫程序 23
3.6 “Hello, World!”程序的源代碼 24
3.7 使用在線比較工具檢查源代碼 25
3.8 通過集成開發(fā)環(huán)境保存程序 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 小結(jié) 29
3.11 習(xí)題 30
第4章 反向密碼 31
4.1 反向密碼程序的源代碼 31
4.2 反向密碼程序的執(zhí)行結(jié)果樣例 32
4.3 設(shè)置注釋及變量 32
4.4 確定字符串的長度 33
4.5 while循環(huán) 33
4.6 Boolean數(shù)據(jù)類型 34
4.7 比較操作符 34
4.8 代碼塊 36
4.9 while循環(huán)語句 37
4.10 “增長”字符串 38
4.11 用input()提示改進程序 40
4.12 小結(jié) 41
4.13 習(xí)題 41
第5章 凱撒密碼 42
5.1 凱撒密碼程序的源代碼 42
5.2 凱撒密碼程序樣例運行 43
5.3 導(dǎo)入模塊并創(chuàng)建變量 44
5.4 常量和變量 45
5.5 for循環(huán)語句 45
5.5.1 for循環(huán)的示例 46
5.5.2 等價于for循環(huán)的while循環(huán) 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 實現(xiàn)“回環(huán)” 51
5.9.2 處理符號集以外的符號 52
5.10 顯示和復(fù)制translated字符串 52
5.11 加密其他字符 53
5.12 小結(jié) 53
5.13 習(xí)題 54
第6章 用暴力算法破解凱撒密碼 56
6.1 破解凱撒密碼的源代碼 56
6.2 運行凱撒密碼破解程序的樣例 57
6.3 設(shè)置變量 58
6.4 在循環(huán)中使用range()方法 58
6.5 解密消息 59
6.6 使用字符串標準化輸出密鑰及
解密后的信息 60
6.7 小結(jié) 61
6.8 習(xí)題 62
第7章 通過置換密碼實現(xiàn)加密 63
7.1 置換密碼如何工作 63
7.1.1 手動加密消息 64
7.1.2 創(chuàng)建加密程序 65
7.2 置換密碼加密程序的源代碼 66
7.3 置換密碼加密程序的示例運行 67
7.4 用def語句創(chuàng)建自定義函數(shù) 67
7.4.1 定義用形參接收實參的函數(shù) 68
7.4.2 更改僅存在于函數(shù)中的形參 68
7.4.3 定義main()函數(shù) 69
7.5 以參數(shù)形式傳遞密鑰和消息 70
7.6 數(shù)據(jù)類型:列表 70
7.6.1 對列表中的項重新賦值 71
7.6.2 多級列表 72
7.6.3 對列表使用len()和in運算符 72
7.6.4 用+和*運算符連接和復(fù)制列表 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 小結(jié) 79
7.14 習(xí)題 80
第8章 解密置換密碼 81
8.1 如何在紙上解密置換密碼 81
8.2 置換密碼解密程序的源代碼 82
8.3 運行置換密碼解密程序的樣例 84
8.4 導(dǎo)入模塊并創(chuàng)建主函數(shù) 84
8.5 使用密鑰解密消息 84
8.5.1 round()、math.ceil()和math.floor()方法 85
8.5.2 decryptMessage()函數(shù) 86
8.5.3 布爾操作符 87
8.5.4 使用and和or操作符往往是一條捷徑 89
8.5.5 布爾操作符的運算順序 90
8.5.6 調(diào)整變量column和row的值 90
8.6 調(diào)用main()函數(shù) 92
8.7 小結(jié) 92
8.8 習(xí)題 92
第9章 編寫測試程序 94
9.1 置換密碼測試程序的源代碼 94
9.2 運行置換密碼測試程序的示例 95
9.3 導(dǎo)入模塊 96
9.4 生成偽隨機數(shù) 96
9.5 創(chuàng)建隨機字符串 97
9.5.1 將字符串復(fù)制隨機次 98
9.5.2 列表變量使用引用 98
9.5.3 傳遞引用 101
9.5.4 使用copy.deepcopy()復(fù)制列表 101
9.5.5 random.shuffle()函數(shù) 101
9.5.6 隨機打亂字符串 102
9.6 測試消息 102
9.7 檢查密碼程序是否正常工作并
結(jié)束程序 103
9.8 調(diào)用main()函數(shù) 104
9.9 檢驗測試程序 104
9.10 小結(jié) 104
9.11 習(xí)題 105
第 10章 文件的加密與解密 106
10.1 純文本文件 106
10.2 使用置換密碼加密文件的
源代碼 107
10.3 運行置換密碼加密文件程序的
樣例 108
10.4 文件操作 109
10.4.1 打開文件 109
10.4.2 數(shù)據(jù)寫入及文件關(guān)閉 109
10.4.3 讀取文件 110
10.5 創(chuàng)建main()函數(shù) 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 調(diào)用main()函數(shù) 116
10.12 小結(jié) 116
10.13 習(xí)題 117
第 11章 編程檢測英語文本 118
11.1 計算機如何理解英語 118
11.2 英語檢測模塊的源代碼 120
11.3 英語檢測模塊的運行示例 121
11.4 指令和設(shè)置常量 121
11.5 字典數(shù)據(jù)類型 122
11.5.1 字典和列表之間的區(qū)別 123
11.5.2 在字典中添加或更改項 123
11.5.3 對字典使用len()函數(shù) 124
11.5.4 對字典使用in運算符 124
11.5.5 用字典檢索項比用列表更快 125
11.5.6 在字典上使用循環(huán) 125
11.6 運行字典文件 125
11.6.1 split()方法 126
11.6.2 將字典文件分割成單個單詞 126
11.6.3 返回字典數(shù)據(jù) 127
11.7 對消息中出現(xiàn)的英文單詞進行
計數(shù) 127
11.7.1 除數(shù)為零錯誤 128
11.7.2 對匹配上的英語單詞進行計數(shù) 128
11.7.3 float()、int()和str()函數(shù)及整數(shù)
除法 129
11.7.4 獲得message中英語單詞的
比例 129
11.8 刪除非字母字符 130
11.8.1 append()列表方法 130
11.8.2 創(chuàng)建字母組成的字符串 131
11.9 檢測英語單詞 131
11.9.1 使用默認參數(shù) 132
11.9.2 計算百分比 132
11.10 小結(jié) 134
11.11 習(xí)題 134
第 12章 破解置換密碼 136
12.1 破解置換密碼程序的源代碼 136
12.2 運行破解置換密碼程序的樣例 137
12.3 導(dǎo)入模塊 138
12.4 使用三引號的多行字符串 138
12.5 展示破解密文的結(jié)果 139
12.6 得到破解后的消息 140
12.6.1 strip()字符串方法 141
12.6.2 應(yīng)用strip()字符串方法 142
12.6.3 破解失敗 142
12.7 調(diào)用main()函數(shù) 143
12.8 小結(jié) 143
12.9 習(xí)題 143
第 13章 仿射密碼的模運算模塊 144
13.1 模運算 144
13.2 模運算符 145
13.3 尋找因子并計算最大公約數(shù) 146
13.4 多重賦值 147
13.5 歐幾里得算法求最大公約數(shù) 148
13.6 理解乘法和仿射密碼的工作
原理 149
13.6.1 為乘法密碼選擇有效的密鑰 150
13.6.2 仿射密碼加密 150
13.6.3 仿射密碼解密 151
13.6.4 計算模逆 152
13.6.5 整數(shù)除法運算符 152
13.7 Cryptomath模塊的源代碼 153
13.8 小結(jié) 154
13.9 習(xí)題 154
第 14章 編寫仿射密碼 155
14.1 仿射密碼程序的源代碼 155
14.2 運行仿射密碼程序的樣例 157
14.3 引入模塊、設(shè)置常量并創(chuàng)建
main()函數(shù) 157
14.4 計算并驗證密鑰 158
14.4.1 元組數(shù)據(jù)類型 159
14.4.2 檢驗弱密鑰 159
14.4.3 仿射密碼共有多少種密鑰組合 160
14.5 編寫加密函數(shù) 162
14.6 編寫解密函數(shù) 163
14.7 生成隨機密鑰對 164
14.8 調(diào)用main()函數(shù) 164
14.9 小結(jié) 165
14.10 習(xí)題 165
第 15章 破解仿射密碼 166
15.1 仿射密碼破解程序的源代碼 166
15.2 仿射密碼破解程序的運行示例 167
15.3 創(chuàng)建模塊、常量和main()函數(shù) 168
15.4 仿射密碼破解函數(shù) 169
15.4.1 乘方運算符 169
15.4.2 計算可能密鑰的總數(shù) 169
15.4.3 continue語句 170
15.4.4 使用continue跳過代碼 171
15.5 調(diào)用main()函數(shù) 172
15.6 小結(jié) 172
15.7 習(xí)題 173
第 16章 編寫簡單代換密碼 174
16.1 簡單代換密碼的工作原理 174
16.2 簡單代換密碼程序的源代碼 175
16.3 運行簡單代換密碼程序的樣例 177
16.4 引入模塊、設(shè)置常量、創(chuàng)建
main()函數(shù) 177
16.5 sort()列表方法 179
16.6 包裹函數(shù) 179
16.7 translateMessage()函數(shù) 181
16.7.1 isupper()和islower()字符串
方法 182
16.7.2 用isupper()保留字符原大小寫
形式 183
16.8 生成隨機密鑰 184
16.9 調(diào)用main()函數(shù) 184
16.10 小結(jié) 185
16.11 習(xí)題 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 創(chuàng)建模塊和常量 193
17.7 用正則表達式查找字符 194
17.8 創(chuàng)建main()函數(shù) 194
17.9 向用戶顯示破解結(jié)果 195
17.10 創(chuàng)建密文映射 195
17.10.1 創(chuàng)建空映射 196
17.10.2 向映射添加字母 196
17.10.3 取兩個映射的交集 197
17.10.4 字母映射輔助函數(shù)的工作
原理 198
17.10.5 識別映射中已確定的明文
字母 201
17.10.6 測試removeSolvedLetterFrom-
Mapping()函數(shù) 203
17.11 hackSimpleSub()函數(shù) 203
17.11.1 replace()字符串方法 205
17.11.2 解密消息 205
17.11.3 在交互式運行環(huán)境中進行
解密 206
17.12 調(diào)用main()函數(shù) 207
17.13 小結(jié) 208
17.14 習(xí)題 208
第 18章 編寫維吉尼亞密碼 209
18.1 在維吉尼亞密碼中使用多字母
密鑰 209
18.1.1 密鑰越長,維吉尼亞密碼越
安全 211
18.1.2 選擇一把抗字典攻擊的密鑰 212
18.2 維吉尼亞密碼實現(xiàn)程序的源
代碼 212
18.3 運行維吉尼亞密碼實現(xiàn)程序的
樣例 214
18.4 引入模塊、設(shè)置常量和創(chuàng)建
main()函數(shù) 214
18.5 使用List-Append-Join模式
生成字符串 215
18.6 消息的加密與解密 216
18.7 調(diào)用main()函數(shù) 218
18.8 小結(jié) 218
18.9 習(xí)題 219
第 19章 頻率分析 220
19.1 分析文本中的字母頻率 220
19.2 匹配字母頻率 222
19.2.1 計算簡單代換密碼的頻率匹配
分數(shù) 222
19.2.2 計算置換密碼的頻率匹配分數(shù) 223
19.2.3 對維吉尼亞密碼進行頻率分析 224
19.3 計算字母頻率的源碼 224
19.4 以“ETAOIN”順序保存字母 226
19.5 對消息中的字母進行計數(shù) 227
19.6 獲取元組的第 一個成員 228
19.7 將消息中的字母按頻率大小
排序 228
19.7.1 getLetterCount()完成字母
計數(shù) 229
19.7.2 創(chuàng)建字典存儲頻率和字母列表 229
19.7.3 按ETAOIN順序排序字母列表 230
19.7.4 字典列表按頻率大小排序 233
19.7.5 創(chuàng)建列表存儲排序后的字母 235
19.8 計算消息的頻率匹配分數(shù) 235
19.9 小結(jié) 236
19.10 習(xí)題 237
第 20章 破解維吉尼亞密碼 238
20.1 運用字典式攻擊暴力破解維吉尼亞密碼 238
20.2 維吉尼亞密碼字典式破解程序的
源代碼 238
20.3 維吉尼亞密碼字典式破解程序的
運行樣例 239
20.4 關(guān)于維吉尼亞密碼破解程序 240
20.5 運用Kasiski檢測確定密鑰
長度 240
20.5.1 找到重復(fù)序列 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 引入模塊、設(shè)置常量和創(chuàng)建
main()函數(shù) 251
20.9 尋找重復(fù)序列 252
20.10 求得間隔數(shù)的因子 254
20.10.1 通過set()函數(shù)去除重復(fù)元素 255
20.10.2 移除重復(fù)因子并對列表進行
排序 256
20.10.3 找到出現(xiàn)次數(shù)最多的因子 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關(guān)鍵字參數(shù) 263
20.13.2 以沉默模式執(zhí)行程序或打印
信息 263
20.13.3 確定子密鑰的可能組合 264
20.13.4 以正確的大小寫形式打印解密
后的文本 267
20.14 返回破解后的消息 268
20.14.1 找到可能密鑰后跳出循環(huán) 268
20.14.2 用其他所有可能密鑰長度進行
暴力破解 269
20.15 調(diào)用main()函數(shù) 269
20.16 改變破解程序中的常量 269
20.17 小結(jié) 270
20.18 習(xí)題 271
第 21章 一次一密 272
21.1 不可破解的一次一密 272
21.1.1 密鑰長度等于消息長度 272
21.1.2 使密鑰真正隨機 274
21.1.3 避免兩次一密 274
21.2 為什么兩次一密是維吉尼亞
密碼 275
21.3 小結(jié) 276
21.4 習(xí)題 276
第 22章 素數(shù)的查找與生成 277
22.1 什么是素數(shù) 277
22.2 素數(shù)模塊的源代碼 279
22.3 素數(shù)模塊的調(diào)用樣例 281
22.4 試除法的原理 281
22.5 實現(xiàn)試除法檢測 283
22.6 埃拉托斯特尼篩法 283
22.7 使用埃拉托斯特尼篩法生成
素數(shù) 285
22.8 Rabin-Miller素性檢測算法 286
22.9 尋找大素數(shù) 287
22.10 生成大素數(shù) 288
22.11 小結(jié) 289
22.12 習(xí)題 289
第 23章 為公鑰密碼生成密鑰 290
23.1 公鑰密碼體制 290
23.2 認證的問題 291
23.2.1 數(shù)字簽名 292
23.2.2 謹防MITM攻擊 293
23.3 生成公鑰和私鑰的步驟 293
23.4 公鑰生成程序的源代碼 294
23.5 公鑰生成程序的示例運行 295
23.6 創(chuàng)建main()函數(shù) 296
23.7 通過generateKey()函數(shù)生成
密鑰 297
23.7.1 計算e的值 297
23.7.2 計算d的值 298
23.7.3 返回公私鑰對 298
23.8 通過makeKeyFiles()函數(shù)創(chuàng)建
密鑰文件 299
23.9 調(diào)用main()函數(shù) 300
23.10 混合密碼體制 301
23.11 小結(jié) 301
23.12 習(xí)題 301
第 24章 編寫公鑰密碼算法 302
24.1 公鑰密碼算法的實現(xiàn)原理 302
24.1.1 分組的創(chuàng)建 302
24.1.2 字符串轉(zhuǎn)換為分組 303
24.1.3 公鑰密碼算法進行加解密的
數(shù)學(xué)原理 305
24.1.4 分組轉(zhuǎn)換為字符串 306
24.1.5 為什么不能破解公鑰密碼 307
24.2 實現(xiàn)公鑰密碼算法的源代碼 309
24.3 公鑰密碼算法實現(xiàn)程序的運行
樣例 312
24.4 程序的設(shè)置 313
24.5 程序如何判斷加解密 314
24.6 通過getBlockFromText()函數(shù)
將字符串轉(zhuǎn)換為分組 315
24.6.1 min()函數(shù)及max()函數(shù) 315
24.6.2 將分組存儲在blockInt中 316
24.7 使用getTextFromBlocks()進行
解密 317
24.7.1 使用insert()列表方法 318
24.7.2 將消息列表合并為一個字符串 318
24.8 編寫encryptMessage()函數(shù) 319
24.9 編寫decryptMessage()函數(shù) 319
24.10 從密鑰文件中讀取公鑰和
私鑰 320
24.11 將加密的內(nèi)容寫入文件 321
24.12 解密文件中的信息 323
24.13 調(diào)用main()函數(shù) 324
24.14 小結(jié) 324
附錄 調(diào)試Python代碼 326