Python密码学编程 第2版

作者
阿尔·斯维加特(Al Sweigart)
丛书名
出版社
人民邮电出版社
ISBN
9787115529992
简要
简介
内容简介书籍计算机书籍 自互联网面世以来,网络安全一直是人们所重视的问题。从20世纪中叶开始,流传千百年的密码算法纷纷被投入到了网络安全的应用中;随后,在20世纪70年代,与古典密码完全不同的密码体制——公钥密码算法横空出世,密码学的发展完成了一次飞跃。 Python诞生于20世纪90年代,它是一种面向对象语言特点与解释型语言特点相结合的高级程序设计语言,已经得到了大规模应用。本书将Python语言与密码学结合起来,从简单的古典密码算法开始,一直到公钥密码算法,进行了简洁而细致的说明与解读。每一种密码算法的讲解包括原理部分、实现部分和破解部分(公钥算法不包括破解部分),其中后两者附有详细的Python代码,注释简洁明了,可读性极高。每章的末尾还提供了一些习题,帮助读者巩固所学知识并进行深入理解。 本书适合任何想要学习Python编程并对密码学抱有兴趣的读者。本书对Python编程的基础要求不高,初学者可以放心地阅读本书。相信本书一定能够为读者带来绝佳的阅读体验。
目录
第 1章 制作纸质密码学工具\t1


1.1 什么是密码学\t1


1.2 编码与密码\t2


1.3 凯撒密码\t3


1.3.1 密码轮\t3


1.3.2 使用密码轮进行加密\t4


1.3.3 使用密码轮进行解密\t5


1.3.4 通过计算进行加密和解密\t5


1.4 为什么加密两次不起作用\t6


1.5 小结 \t7


1.6 习题 \t7


第 2章 在交互式运行环境中编程\t8


2.1 简单的数学表达式\t8


2.2 整型和浮点数的值\t9


2.3 表达式\t10


2.4 运算顺序\t10


2.5 计算表达式的值\t10


2.6 用变量存储数值\t12


2.7 重写变量\t13


2.8 变量名\t14


2.9 小结 \t14


2.10 习题 \t15


第3章 字符串及编写程序\t16


3.1 用字符串的值处理文本\t16


3.1.1 “+”运算符实现字符串拼接\t17


3.1.2 “*”运算符实现字符串复制\t18


3.1.3 通过索引获得字符串中的字符\t18


3.2 用print()函数打印值\t21


3.3 打印转义字符\t22


3.4 引号和双引号\t23


3.5 在集成开发环境的文件编辑器中编写程序\t23


3.6 “Hello, World!”程序的源代码\t24


3.7 使用在线比较工具检查源代码\t25


3.8 通过集成开发环境保存程序\t26


3.8.1 保存程序\t26


3.8.2 运行程序\t26


3.8.3 打开保存的程序\t27


3.9 “Hello, World! ”程序如何工作\t27


3.9.1 注释\t28


3.9.2 打印指示信息\t28


3.9.3 接收输入\t28


3.9.4 完成程序\t29


3.10 小结 \t29


3.11 习题 \t30


第4章 反向密码\t31


4.1 反向密码程序的源代码\t31


4.2 反向密码程序的执行结果样例\t32


4.3 设置注释及变量\t32


4.4 确定字符串的长度\t33


4.5 while循环\t33


4.6 Boolean数据类型\t34


4.7 比较操作符\t34


4.8 代码块\t36


4.9 while循环语句\t37


4.10 “增长”字符串\t38


4.11 用input()提示改进程序\t40


4.12 小结 \t41


4.13 习题 \t41


第5章 凯撒密码\t42


5.1 凯撒密码程序的源代码\t42


5.2 凯撒密码程序样例运行\t43


5.3 导入模块并创建变量\t44


5.4 常量和变量\t45


5.5 for循环语句\t45


5.5.1 for循环的示例\t46


5.5.2 等价于for循环的while循环\t46


5.6 if语句\t47


5.6.1 if语句的示例\t47


5.6.2 else语句\t48


5.6.3 elif语句\t48


5.7 in和not in运算符\t49


5.8 find()字符串方法\t50


5.9 符号加密和解密\t51


5.9.1 实现“回环”\t51


5.9.2 处理符号集以外的符号\t52


5.10 显示和复制translated字符串\t52


5.11 加密其他字符\t53


5.12 小结 \t53


5.13 习题 \t54


第6章 用暴力算法破解凯撒密码\t56


6.1 破解凯撒密码的源代码\t56


6.2 运行凯撒密码破解程序的样例\t57


6.3 设置变量\t58


6.4 在循环中使用range()方法\t58


6.5 解密消息\t59


6.6 使用字符串标准化输出密钥及


解密后的信息\t60


6.7 小结 \t61


6.8 习题 \t62


第7章 通过置换密码实现加密\t63


7.1 置换密码如何工作\t63


7.1.1 手动加密消息\t64


7.1.2 创建加密程序\t65


7.2 置换密码加密程序的源代码\t66


7.3 置换密码加密程序的示例运行\t67


7.4 用def语句创建自定义函数\t67


7.4.1 定义用形参接收实参的函数\t68


7.4.2 更改仅存在于函数中的形参\t68


7.4.3 定义main()函数\t69


7.5 以参数形式传递密钥和消息\t70


7.6 数据类型:列表\t70


7.6.1 对列表中的项重新赋值\t71


7.6.2 多级列表\t72


7.6.3 对列表使用len()和in运算符\t72


7.6.4 用+和*运算符连接和复制列表\t73


7.7 置换加密算法\t74


7.8 增量赋值运算符\t75


7.9 随消息移动currentIndex\t75


7.10 join()字符串方法\t77


7.11 返回值和返回语句\t77


7.11.1 return语句示例\t78


7.11.2 返回加密得到的密文\t78


7.12 __name__变量\t78


7.13 小结 \t79


7.14 习题 \t80


第8章 解密置换密码\t81


8.1 如何在纸上解密置换密码\t81


8.2 置换密码解密程序的源代码\t82


8.3 运行置换密码解密程序的样例\t84


8.4 导入模块并创建主函数\t84


8.5 使用密钥解密消息\t84


8.5.1 round()、math.ceil()和math.floor()方法\t85


8.5.2 decryptMessage()函数\t86


8.5.3 布尔操作符\t87


8.5.4 使用and和or操作符往往是一条捷径\t89


8.5.5 布尔操作符的运算顺序\t90


8.5.6 调整变量column和row的值\t90


8.6 调用main()函数\t92


8.7 小结 \t92


8.8 习题 \t92


第9章 编写测试程序\t94


9.1 置换密码测试程序的源代码\t94


9.2 运行置换密码测试程序的示例\t95


9.3 导入模块\t96


9.4 生成伪随机数\t96


9.5 创建随机字符串\t97


9.5.1 将字符串复制随机次\t98


9.5.2 列表变量使用引用\t98


9.5.3 传递引用\t101


9.5.4 使用copy.deepcopy()复制列表\t101


9.5.5 random.shuffle()函数\t101


9.5.6 随机打乱字符串\t102


9.6 测试消息\t102


9.7 检查密码程序是否正常工作并


结束程序\t103


9.8 调用main()函数\t104


9.9 检验测试程序\t104


9.10 小结 \t104


9.11 习题 \t105


第 10章 文件的加密与解密\t106


10.1 纯文本文件\t106


10.2 使用置换密码加密文件的


源代码\t107


10.3 运行置换密码加密文件程序的


样例\t108


10.4 文件操作\t109


10.4.1 打开文件\t109


10.4.2 数据写入及文件关闭\t109


10.4.3 读取文件\t110


10.5 创建main()函数\t111


10.6 检查文件是否存在\t111


10.6.1 os.path.exists() 方法\t111


10.6.2 使用os.path.exists()方法检查


输入的文件是否存在\t112


10.7 使用字符串方法令用户的输入


更灵活\t112


10.7.1 upper()、lower()和title()字符串


方法\t112


10.7.2 startswith()和endswith()方法\t113


10.7.3 在程序中使用上述字符串方法\t113


10.8 读取作为输入的文件\t114


10.9 计算加/解密所需的时间\t114


10.9.1 time模块和time.time()方法\t114


10.9.2 在程序中使用time.time()方法\t115


10.10 将输出写入文件\t115


10.11 调用main()函数\t116


10.12 小结 \t116


10.13 习题 \t117


第 11章 编程检测英语文本\t118


11.1 计算机如何理解英语\t118


11.2 英语检测模块的源代码\t120


11.3 英语检测模块的运行示例\t121


11.4 指令和设置常量\t121


11.5 字典数据类型\t122


11.5.1 字典和列表之间的区别\t123


11.5.2 在字典中添加或更改项\t123


11.5.3 对字典使用len()函数\t124


11.5.4 对字典使用in运算符\t124


11.5.5 用字典检索项比用列表更快\t125


11.5.6 在字典上使用循环\t125


11.6 运行字典文件\t125


11.6.1 split()方法\t126


11.6.2 将字典文件分割成单个单词\t126


11.6.3 返回字典数据\t127


11.7 对消息中出现的英文单词进行


计数\t127


11.7.1 除数为零错误\t128


11.7.2 对匹配上的英语单词进行计数\t128


11.7.3 float()、int()和str()函数及整数


除法\t129


11.7.4 获得message中英语单词的


比例\t129


11.8 删除非字母字符\t130


11.8.1 append()列表方法\t130


11.8.2 创建字母组成的字符串\t131


11.9 检测英语单词\t131


11.9.1 使用默认参数\t132


11.9.2 计算百分比\t132


11.10 小结 \t134


11.11 习题 \t134


第 12章 破解置换密码\t136


12.1 破解置换密码程序的源代码\t136


12.2 运行破解置换密码程序的样例\t137


12.3 导入模块\t138


12.4 使用三引号的多行字符串\t138


12.5 展示破解密文的结果\t139


12.6 得到破解后的消息\t140


12.6.1 strip()字符串方法\t141


12.6.2 应用strip()字符串方法\t142


12.6.3 破解失败\t142


12.7 调用main()函数\t143


12.8 小结 \t143


12.9 习题 \t143


第 13章 仿射密码的模运算模块\t144


13.1 模运算\t144


13.2 模运算符\t145


13.3 寻找因子并计算最大公约数\t146


13.4 多重赋值\t147


13.5 欧几里得算法求最大公约数\t148


13.6 理解乘法和仿射密码的工作


原理\t149


13.6.1 为乘法密码选择有效的密钥\t150


13.6.2 仿射密码加密\t150


13.6.3 仿射密码解密\t151


13.6.4 计算模逆\t152


13.6.5 整数除法运算符\t152


13.7 Cryptomath模块的源代码\t153


13.8 小结 \t154


13.9 习题 \t154


第 14章 编写仿射密码\t155


14.1 仿射密码程序的源代码\t155


14.2 运行仿射密码程序的样例\t157


14.3 引入模块、设置常量并创建


main()函数\t157


14.4 计算并验证密钥\t158


14.4.1 元组数据类型\t159


14.4.2 检验弱密钥\t159


14.4.3 仿射密码共有多少种密钥组合\t160


14.5 编写加密函数\t162


14.6 编写解密函数\t163


14.7 生成随机密钥对\t164


14.8 调用main()函数\t164


14.9 小结 \t165


14.10 习题 \t165


第 15章 破解仿射密码\t166


15.1 仿射密码破解程序的源代码\t166


15.2 仿射密码破解程序的运行示例\t167


15.3 创建模块、常量和main()函数\t168


15.4 仿射密码破解函数\t169


15.4.1 乘方运算符\t169


15.4.2 计算可能密钥的总数\t169


15.4.3 continue语句\t170


15.4.4 使用continue跳过代码\t171


15.5 调用main()函数\t172


15.6 小结 \t172


15.7 习题 \t173


第 16章 编写简单代换密码\t174


16.1 简单代换密码的工作原理\t174


16.2 简单代换密码程序的源代码\t175


16.3 运行简单代换密码程序的样例\t177


16.4 引入模块、设置常量、创建


main()函数\t177


16.5 sort()列表方法\t179


16.6 包裹函数\t179


16.7 translateMessage()函数\t181


16.7.1 isupper()和islower()字符串


方法\t182


16.7.2 用isupper()保留字符原大小写


形式\t183


16.8 生成随机密钥\t184


16.9 调用main()函数\t184


16.10 小结 \t185


16.11 习题 \t185


第 17章 破解简单代换密码\t186


17.1 使用单词模式进行解密\t186


17.1.1 寻找单词模式\t187


17.1.2 寻找可能解密字母\t187


17.2 破解程序总览\t188


17.3 单词模式模块\t189


17.4 简单代换破解程序的源代码\t190


17.5 简单代换破解程序的运行示例\t193


17.6 创建模块和常量\t193


17.7 用正则表达式查找字符\t194


17.8 创建main()函数\t194


17.9 向用户显示破解结果\t195


17.10 创建密文映射\t195


17.10.1 创建空映射\t196


17.10.2 向映射添加字母\t196


17.10.3 取两个映射的交集\t197


17.10.4 字母映射辅助函数的工作


原理\t198


17.10.5 识别映射中已确定的明文


字母\t201


17.10.6 测试removeSolvedLetterFrom-


Mapping()函数\t203


17.11 hackSimpleSub()函数\t203


17.11.1 replace()字符串方法\t205


17.11.2 解密消息\t205


17.11.3 在交互式运行环境中进行


解密\t206


17.12 调用main()函数\t207


17.13 小结 \t208


17.14 习题 \t208


第 18章 编写维吉尼亚密码\t209


18.1 在维吉尼亚密码中使用多字母


密钥\t209


18.1.1 密钥越长,维吉尼亚密码越


安全\t211


18.1.2 选择一把抗字典攻击的密钥\t212


18.2 维吉尼亚密码实现程序的源


代码\t212


18.3 运行维吉尼亚密码实现程序的


样例\t214


18.4 引入模块、设置常量和创建


main()函数\t214


18.5 使用List-Append-Join模式


生成字符串\t215


18.6 消息的加密与解密\t216


18.7 调用main()函数\t218


18.8 小结 \t218


18.9 习题 \t219


第 19章 频率分析\t220


19.1 分析文本中的字母频率\t220


19.2 匹配字母频率\t222


19.2.1 计算简单代换密码的频率匹配


分数\t222


19.2.2 计算置换密码的频率匹配分数\t223


19.2.3 对维吉尼亚密码进行频率分析\t224


19.3 计算字母频率的源码\t224


19.4 以“ETAOIN”顺序保存字母\t226


19.5 对消息中的字母进行计数\t227


19.6 获取元组的第 一个成员\t228


19.7 将消息中的字母按频率大小


排序\t228


19.7.1 getLetterCount()完成字母


计数\t229


19.7.2 创建字典存储频率和字母列表\t229


19.7.3 按ETAOIN顺序排序字母列表\t230


19.7.4 字典列表按频率大小排序\t233


19.7.5 创建列表存储排序后的字母\t235


19.8 计算消息的频率匹配分数\t235


19.9 小结 \t236


19.10 习题 \t237


第 20章 破解维吉尼亚密码\t238


20.1 运用字典式攻击暴力破解维吉尼亚密码\t238


20.2 维吉尼亚密码字典式破解程序的


源代码\t238


20.3 维吉尼亚密码字典式破解程序的


运行样例\t239


20.4 关于维吉尼亚密码破解程序\t240


20.5 运用Kasiski检测确定密钥


长度\t240


20.5.1 找到重复序列\t240


20.5.2 求得间隔的因子\t241


20.5.3 提取字符串的每个第N位


字母\t242


20.5.4 使用频率分析法逐个破解


子密钥\t243


20.5.5 暴力破解可能密钥\t245


20.6 维吉尼亚密码破解程序的源


代码\t246


20.7 维吉尼亚密码破解程序的运行


样例\t251


20.8 引入模块、设置常量和创建


main()函数\t251


20.9 寻找重复序列\t252


20.10 求得间隔数的因子\t254


20.10.1 通过set()函数去除重复元素\t255


20.10.2 移除重复因子并对列表进行


排序\t256


20.10.3 找到出现次数最多的因子\t256


20.11 找到最可能的密钥长度\t258


20.11.1 extend()列表方法\t258


20.11.2 扩展repeatedSeqSpacings


字典\t259


20.11.3 从factorByCount中获取因子\t259


20.12 找到由相同子密钥加密的


字母\t260


20.13 尝试用可能的密钥长度进行


解密\t261


20.13.1 print()的end关键字参数\t263


20.13.2 以沉默模式执行程序或打印


信息\t263


20.13.3 确定子密钥的可能组合\t264


20.13.4 以正确的大小写形式打印解密


后的文本\t267


20.14 返回破解后的消息\t268


20.14.1 找到可能密钥后跳出循环\t268


20.14.2 用其他所有可能密钥长度进行


暴力破解\t269


20.15 调用main()函数\t269


20.16 改变破解程序中的常量\t269


20.17 小结 \t270


20.18 习题 \t271


第 21章 一次一密\t272


21.1 不可破解的一次一密\t272


21.1.1 密钥长度等于消息长度\t272


21.1.2 使密钥真正随机\t274


21.1.3 避免两次一密\t274


21.2 为什么两次一密是维吉尼亚


密码\t275


21.3 小结 \t276


21.4 习题 \t276


第 22章 素数的查找与生成\t277


22.1 什么是素数\t277


22.2 素数模块的源代码\t279


22.3 素数模块的调用样例\t281


22.4 试除法的原理\t281


22.5 实现试除法检测\t283


22.6 埃拉托斯特尼筛法\t283


22.7 使用埃拉托斯特尼筛法生成


素数\t285


22.8 Rabin-Miller素性检测算法\t286


22.9 寻找大素数\t287


22.10 生成大素数\t288


22.11 小结 \t289


22.12 习题 \t289


第 23章 为公钥密码生成密钥\t290


23.1 公钥密码体制\t290


23.2 认证的问题\t291


23.2.1 数字签名\t292


23.2.2 谨防MITM攻击\t293


23.3 生成公钥和私钥的步骤\t293


23.4 公钥生成程序的源代码\t294


23.5 公钥生成程序的示例运行\t295


23.6 创建main()函数\t296


23.7 通过generateKey()函数生成


密钥\t297


23.7.1 计算e的值\t297


23.7.2 计算d的值\t298


23.7.3 返回公私钥对\t298


23.8 通过makeKeyFiles()函数创建


密钥文件\t299


23.9 调用main()函数\t300


23.10 混合密码体制\t301


23.11 小结 \t301


23.12 习题 \t301


第 24章 编写公钥密码算法\t302


24.1 公钥密码算法的实现原理\t302


24.1.1 分组的创建\t302


24.1.2 字符串转换为分组\t303


24.1.3 公钥密码算法进行加解密的


数学原理\t305


24.1.4 分组转换为字符串\t306


24.1.5 为什么不能破解公钥密码\t307


24.2 实现公钥密码算法的源代码\t309


24.3 公钥密码算法实现程序的运行


样例\t312


24.4 程序的设置\t313


24.5 程序如何判断加解密\t314


24.6 通过getBlockFromText()函数


将字符串转换为分组\t315


24.6.1 min()函数及max()函数\t315


24.6.2 将分组存储在blockInt中\t316


24.7 使用getTextFromBlocks()进行


解密\t317


24.7.1 使用insert()列表方法\t318





24.7.2 将消息列表合并为一个字符串\t318


24.8 编写encryptMessage()函数\t319


24.9 编写decryptMessage()函数\t319


24.10 从密钥文件中读取公钥和


私钥\t320


24.11 将加密的内容写入文件\t321


24.12 解密文件中的信息\t323


24.13 调用main()函数\t324


24.14 小结 \t324


附录 调试Python代码\t326



有问题微信扫码联系

推荐

Understand China
桂ICP备20004708号-4