科技
类型
7.7
豆瓣评分
可以朗读
语音朗读
350千字
字数
2020-04-01
发行日期
展开全部
主编推荐语
Python编程实现加密算法的初学者指南。
内容简介
自互联网面世以来,网络安全一直是人们所重视的问题。从20世纪中叶开始,流传千百年的密码算法纷纷被投入到了网络安全的应用中;随后,在20世纪70年代,与古典密码完全不同的密码体制——公钥密码算法横空出世,密码学的发展完成了一次飞跃。 Python诞生于20世纪90年代,它是一种面向对象语言特点与解释型语言特点相结合的高级程序设计语言,已经得到了大规模应用。本书将Python语言与密码学结合起来,从简单的古典密码算法开始,一直到公钥密码算法,进行了简洁而细致的说明与解读。每一种密码算法的讲解包括原理部分、实现部分和破解部分(公钥算法不包括破解部分),其中后两者附有详细的Python代码,注释简洁明了,可读性极高。每章的末尾还提供了一些习题,帮助读者巩固所学知识并进行深入理解。
本书适合任何想要学习Python编程并对密码学抱有兴趣的读者。
目录
- 版权信息
- 版权声明
- 内容提要
- 作者简介
- 审稿人简介
- 致谢
- 前言
- 本书的目标读者
- 本书涵盖的内容
- 如何使用本书
- 下载并安装Python
- 下载pyperclip.py
- 启动IDLE
- 小结
- 资源与支持
- 配套资源
- 提交勘误
- 与我们联系
- 关于异步社区和异步图书
- 第1章 制作纸质密码学工具
- 1.1 什么是密码学
- 1.2 编码与密码
- 1.3 凯撒密码
- 1.3.1 密码轮
- 1.3.2 使用密码轮进行加密
- 1.3.3 使用密码轮进行解密
- 1.3.4 通过计算进行加密和解密
- 1.4 为什么加密两次不起作用
- 1.5 小结
- 1.6 习题
- 第2章 在交互式运行环境中编程
- 2.1 简单的数学表达式
- 2.2 整型和浮点数的值
- 2.3 表达式
- 2.4 运算顺序
- 2.5 计算表达式的值
- 2.6 用变量存储数值
- 2.7 重写变量
- 2.8 变量名
- 2.9 小结
- 2.10 习题
- 第3章 字符串及编写程序
- 3.1 用字符串的值处理文本
- 3.1.1 “+”运算符实现字符串拼接
- 3.1.2 “*”运算符实现字符串复制
- 3.1.3 通过索引获得字符串中的字符
- 3.2 用print()函数打印值
- 3.3 打印转义字符
- 3.4 引号和双引号
- 3.5 在集成开发环境的文件编辑器中编写程序
- 3.6 “Hello, World!”程序的源代码
- 3.7 使用在线比较工具检查源代码
- 3.8 通过集成开发环境保存程序
- 3.8.1 保存程序
- 3.8.2 运行程序
- 3.8.3 打开保存的程序
- 3.9 “Hello, World! ”程序如何工作
- 3.9.1 注释
- 3.9.2 打印指示信息
- 3.9.3 接收输入
- 3.9.4 完成程序
- 3.10 小结
- 3.11 习题
- 第4章 反向密码
- 4.1 反向密码程序的源代码
- 4.2 反向密码程序的执行结果样例
- 4.3 设置注释及变量
- 4.4 确定字符串的长度
- 4.5 while循环
- 4.6 Boolean数据类型
- 4.7 比较操作符
- 4.8 代码块
- 4.9 while循环语句
- 4.10 “增长”字符串
- 4.11 用input()提示改进程序
- 4.12 小结
- 4.13 习题
- 第5章 凯撒密码
- 5.1 凯撒密码程序的源代码
- 5.2 凯撒密码程序样例运行
- 5.3 导入模块并创建变量
- 5.4 常量和变量
- 5.5 for循环语句
- 5.5.1 for循环的示例
- 5.5.2 等价于for循环的while循环
- 5.6 if语句
- 5.6.1 if语句的示例
- 5.6.2 else语句
- 5.6.3 elif语句
- 5.7 in和not in运算符
- 5.8 find()字符串方法
- 5.9 符号加密和解密
- 5.9.1 实现“回环”
- 5.9.2 处理符号集以外的符号
- 5.10 显示和复制translated字符串
- 5.11 加密其他字符
- 5.12 小结
- 5.13 习题
- 第6章 用暴力算法破解凯撒密码
- 6.1 破解凯撒密码的源代码
- 6.2 运行凯撒密码破解程序的样例
- 6.3 设置变量
- 6.4 在循环中使用range()方法
- 6.5 解密消息
- 6.6 使用字符串标准化输出密钥及解密后的信息
- 6.7 小结
- 6.8 习题
- 第7章 通过置换密码实现加密
- 7.1 置换密码如何工作
- 7.1.1 手动加密消息
- 7.1.2 创建加密程序
- 7.2 置换密码加密程序的源代码
- 7.3 置换密码加密程序的示例运行
- 7.4 用def语句创建自定义函数
- 7.4.1 定义用形参接收实参的函数
- 7.4.2 更改仅存在于函数中的形参
- 7.4.3 定义main()函数
- 7.5 以参数形式传递密钥和消息
- 7.6 数据类型:列表
- 7.6.1 对列表中的项重新赋值
- 7.6.2 多级列表
- 7.6.3 对列表使用len()和in运算符
- 7.6.4 用+和*运算符连接和复制列表
- 7.7 置换加密算法
- 7.8 增量赋值运算符
- 7.9 随消息移动currentIndex
- 7.10 join()字符串方法
- 7.11 返回值和返回语句
- 7.11.1 return语句示例
- 7.11.2 返回加密得到的密文
- 7.12 __name__变量
- 7.13 小结
- 7.14 习题
- 第8章 解密置换密码
- 8.1 如何在纸上解密置换密码
- 8.2 置换密码解密程序的源代码
- 8.3 运行置换密码解密程序的样例
- 8.4 导入模块并创建主函数
- 8.5 使用密钥解密消息
- 8.5.1 round()、math.ceil()和math.floor()方法
- 8.5.2 decryptMessage()函数
- 8.5.3 布尔操作符
- 8.5.4 使用and和or操作符往往是一条捷径
- 8.5.5 布尔操作符的运算顺序
- 8.5.6 调整变量column和row的值
- 8.6 调用main()函数
- 8.7 小结
- 8.8 习题
- 第9章 编写测试程序
- 9.1 置换密码测试程序的源代码
- 9.2 运行置换密码测试程序的示例
- 9.3 导入模块
- 9.4 生成伪随机数
- 9.5 创建随机字符串
- 9.5.1 将字符串复制随机次
- 9.5.2 列表变量使用引用
- 9.5.3 传递引用
- 9.5.4 使用copy.deepcopy()复制列表
- 9.5.5 random.shuffle()函数
- 9.5.6 随机打乱字符串
- 9.6 测试消息
- 9.7 检查密码程序是否正常工作并结束程序
- 9.8 调用main()函数
- 9.9 检验测试程序
- 9.10 小结
- 9.11 习题
- 第10章 文件的加密与解密
- 10.1 纯文本文件
- 10.2 使用置换密码加密文件的源代码
- 10.3 运行置换密码加密文件程序的样例
- 10.4 文件操作
- 10.4.1 打开文件
- 10.4.2 数据写入及文件关闭
- 10.4.3 读取文件
- 10.5 创建main()函数
- 10.6 检查文件是否存在
- 10.6.1 os.path.exists() 方法
- 10.6.2 使用os.path.exists()方法检查输入的文件是否存在
- 10.7 使用字符串方法令用户的输入更灵活
- 10.7.1 upper()、lower()和title()字符串方法
- 10.7.2 startswith()和endswith()方法
- 10.7.3 在程序中使用上述字符串方法
- 10.8 读取作为输入的文件
- 10.9 计算加/解密所需的时间
- 10.9.1 time模块和time.time()方法
- 10.9.2 在程序中使用time.time()方法
- 10.10 将输出写入文件
- 10.11 调用main()函数
- 10.12 小结
- 10.13 习题
- 第11章 编程检测英语文本
- 11.1 计算机如何理解英语
- 11.2 英语检测模块的源代码
- 11.3 英语检测模块的运行示例
- 11.4 指令和设置常量
- 11.5 字典数据类型
- 11.5.1 字典和列表之间的区别
- 11.5.2 在字典中添加或更改项
- 11.5.3 对字典使用len()函数
- 11.5.4 对字典使用in运算符
- 11.5.5 用字典检索项比用列表更快
- 11.5.6 在字典上使用循环
- 11.6 运行字典文件
- 11.6.1 split()方法
- 11.6.2 将字典文件分割成单个单词
- 11.6.3 返回字典数据
- 11.7 对消息中出现的英文单词进行计数
- 11.7.1 除数为零错误
- 11.7.2 对匹配上的英语单词进行计数
- 11.7.3 float()、int()和str()函数及整数除法
- 11.7.4 获得message中英语单词的比例
- 11.8 删除非字母字符
- 11.8.1 append()列表方法
- 11.8.2 创建字母组成的字符串
- 11.9 检测英语单词
- 11.9.1 使用默认参数
- 11.9.2 计算百分比
- 11.10 小结
- 11.11 习题
- 第12章 破解置换密码
- 12.1 破解置换密码程序的源代码
- 12.2 运行破解置换密码程序的样例
- 12.3 导入模块
- 12.4 使用三引号的多行字符串
- 12.5 展示破解密文的结果
- 12.6 得到破解后的消息
- 12.6.1 strip()字符串方法
- 12.6.2 应用strip()字符串方法
- 12.6.3 破解失败
- 12.7 调用main()函数
- 12.8 小结
- 12.9 习题
- 第13章 仿射密码的模运算模块
- 13.1 模运算
- 13.2 模运算符
- 13.3 寻找因子并计算最大公约数
- 13.4 多重赋值
- 13.5 欧几里得算法求最大公约数
- 13.6 理解乘法和仿射密码的工作原理
- 13.6.1 为乘法密码选择有效的密钥
- 13.6.2 仿射密码加密
- 13.6.3 仿射密码解密
- 13.6.4 计算模逆
- 13.6.5 整数除法运算符
- 13.7 Cryptomath模块的源代码
- 13.8 小结
- 13.9 习题
- 第14章 编写仿射密码
- 14.1 仿射密码程序的源代码
- 14.2 运行仿射密码程序的样例
- 14.3 引入模块、设置常量并创建main()函数
- 14.4 计算并验证密钥
- 14.4.1 元组数据类型
- 14.4.2 检验弱密钥
- 14.4.3 仿射密码共有多少种密钥组合
- 14.5 编写加密函数
- 14.6 编写解密函数
- 14.7 生成随机密钥对
- 14.8 调用main()函数
- 14.9 小结
- 14.10 习题
- 第15章 破解仿射密码
- 15.1 仿射密码破解程序的源代码
- 15.2 仿射密码破解程序的运行示例
- 15.3 创建模块、常量和main()函数
- 15.4 仿射密码破解函数
- 15.4.1 乘方运算符
- 15.4.2 计算可能密钥的总数
- 15.4.3 continue语句
- 15.4.4 使用continue跳过代码
- 15.5 调用main()函数
- 15.6 小结
- 15.7 习题
- 第16章 编写简单代换密码
- 16.1 简单代换密码的工作原理
- 16.2 简单代换密码程序的源代码
- 16.3 运行简单代换密码程序的样例
- 16.4 引入模块、设置常量、创建main()函数
- 16.5 sort()列表方法
- 16.6 包裹函数
- 16.7 translateMessage()函数
- 16.7.1 isupper()和islower()字符串方法
- 16.7.2 用isupper()保留字符原大小写形式
- 16.8 生成随机密钥
- 16.9 调用main()函数
- 16.10 小结
- 16.11 习题
- 第17章 破解简单代换密码
- 17.1 使用单词模式进行解密
- 17.1.1 寻找单词模式
- 17.1.2 寻找可能解密字母
- 17.2 破解程序总览
- 17.3 单词模式模块
- 17.4 简单代换破解程序的源代码
- 17.5 简单代换破解程序的运行示例
- 17.6 创建模块和常量
- 17.7 用正则表达式查找字符
- 17.8 创建main()函数
- 17.9 向用户显示破解结果
- 17.10 创建密文映射
- 17.10.1 创建空映射
- 17.10.2 向映射添加字母
- 17.10.3 取两个映射的交集
- 17.10.4 字母映射辅助函数的工作原理
- 17.10.5 识别映射中已确定的明文字母
- 17.10.6 测试removeSolvedLetterFromMapping()函数
- 17.11 hackSimpleSub()函数
- 17.11.1 replace()字符串方法
- 17.11.2 解密消息
- 17.11.3 在交互式运行环境中进行解密
- 17.12 调用main()函数
- 17.13 小结
- 17.14 习题
- 第18章 编写维吉尼亚密码
- 18.1 在维吉尼亚密码中使用多字母密钥
- 18.1.1 密钥越长,维吉尼亚密码越安全
- 18.1.2 选择一把抗字典攻击的密钥
- 18.2 维吉尼亚密码实现程序的源代码
- 18.3 运行维吉尼亚密码实现程序的样例
- 18.4 引入模块、设置常量和创建main()函数
- 18.5 使用List-Append-Join模式生成字符串
- 18.6 消息的加密与解密
- 18.7 调用main()函数
- 18.8 小结
- 18.9 习题
- 第19章 频率分析
- 19.1 分析文本中的字母频率
- 19.2 匹配字母频率
- 19.2.1 计算简单代换密码的频率匹配分数
- 19.2.2 计算置换密码的频率匹配分数
- 19.2.3 对维吉尼亚密码进行频率分析
- 19.3 计算字母频率的源码
- 19.4 以“ETAOIN”顺序保存字母
- 19.5 对消息中的字母进行计数
- 19.6 获取元组的第一个成员
- 19.7 将消息中的字母按频率大小排序
- 19.7.1 getLetterCount()完成字母计数
- 19.7.2 创建字典存储频率和字母列表
- 19.7.3 按ETAOIN顺序排序字母列表
- 19.7.4 字典列表按频率大小排序
- 19.7.5 创建列表存储排序后的字母
- 19.8 计算消息的频率匹配分数
- 19.9 小结
- 19.10 习题
- 第20章 破解维吉尼亚密码
- 20.1 运用字典式攻击暴力破解维吉尼亚密码
- 20.2 维吉尼亚密码字典式破解程序的源代码
- 20.3 维吉尼亚密码字典式破解程序的运行样例
- 20.4 关于维吉尼亚密码破解程序
- 20.5 运用Kasiski检测确定密钥长度
- 20.5.1 找到重复序列
- 20.5.2 求得间隔的因子
- 20.5.3 提取字符串的每个第N位字母
- 20.5.4 使用频率分析法逐个破解子密钥
- 20.5.5 暴力破解可能密钥
- 20.6 维吉尼亚密码破解程序的源代码
- 20.7 维吉尼亚密码破解程序的运行样例
- 20.8 引入模块、设置常量和创建main()函数
- 20.9 寻找重复序列
- 20.10 求得间隔数的因子
- 20.10.1 通过set()函数去除重复元素
- 20.10.2 移除重复因子并对列表进行排序
- 20.10.3 找到出现次数最多的因子
- 20.11 找到最可能的密钥长度
- 20.11.1 extend()列表方法
- 20.11.2 扩展repeatedSeqSpacings字典
- 20.11.3 从factorByCount中获取因子
- 20.12 找到由相同子密钥加密的字母
- 20.13 尝试用可能的密钥长度进行解密
- 20.13.1 print()的end关键字参数
- 20.13.2 以沉默模式执行程序或打印信息
- 20.13.3 确定子密钥的可能组合
- 20.13.4 以正确的大小写形式打印解密后的文本
- 20.14 返回破解后的消息
- 20.14.1 找到可能密钥后跳出循环
- 20.14.2 用其他所有可能密钥长度进行暴力破解
- 20.15 调用main()函数
- 20.16 改变破解程序中的常量
- 20.17 小结
- 20.18 习题
- 第21章 一次一密
- 21.1 不可破解的一次一密
- 21.1.1 密钥长度等于消息长度
- 21.1.2 使密钥真正随机
- 21.1.3 避免两次一密
- 21.2 为什么两次一密是维吉尼亚密码
- 21.3 小结
- 21.4 习题
- 第22章 素数的查找与生成
- 22.1 什么是素数
- 22.2 素数模块的源代码
- 22.3 素数模块的调用样例
- 22.4 试除法的原理
- 22.5 实现试除法检测
- 22.6 埃拉托斯特尼筛法
- 22.7 使用埃拉托斯特尼筛法生成素数
- 22.8 Rabin-Miller素性检测算法
- 22.9 寻找大素数
- 22.10 生成大素数
- 22.11 小结
- 22.12 习题
- 第23章 为公钥密码生成密钥
- 23.1 公钥密码体制
- 23.2 认证的问题
- 23.2.1 数字签名
- 23.2.2 谨防MITM攻击
- 23.3 生成公钥和私钥的步骤
- 23.4 公钥生成程序的源代码
- 23.5 公钥生成程序的示例运行
- 23.6 创建main()函数
- 23.7 通过generateKey()函数生成密钥
- 23.7.1 计算e的值
- 23.7.2 计算d的值
- 23.7.3 返回公私钥对
- 23.8 通过makeKeyFiles()函数创建密钥文件
- 23.9 调用main()函数
- 23.10 混合密码体制
- 23.11 小结
- 23.12 习题
- 第24章 编写公钥密码算法
- 24.1 公钥密码算法的实现原理
- 24.1.1 分组的创建
- 24.1.2 字符串转换为分组
- 24.1.3 公钥密码算法进行加解密的数学原理
- 24.1.4 分组转换为字符串
- 24.1.5 为什么不能破解公钥密码
- 24.2 实现公钥密码算法的源代码
- 24.3 公钥密码算法实现程序的运行样例
- 24.4 程序的设置
- 24.5 程序如何判断加解密
- 24.6 通过getBlockFromText()函数将字符串转换为分组
- 24.6.1 min()函数及max()函数
- 24.6.2 将分组存储在blockInt中
- 24.7 使用getTextFromBlocks()进行解密
- 24.7.1 使用insert()列表方法
- 24.7.2 将消息列表合并为一个字符串
- 24.8 编写encryptMessage()函数
- 24.9 编写decryptMessage()函数
- 24.10 从密钥文件中读取公钥和私钥
- 24.11 将加密的内容写入文件
- 24.12 解密文件中的信息
- 24.13 调用main()函数
- 24.14 小结
- 附录 调试Python代码
- 调试器如何工作
- 调试反向密码程序
- 设置断点
- 小结
展开全部
出版方
人民邮电出版社
人民邮电出版社是工业和信息化部主管的大型专业出版社,成立于1953年10月1日。人民邮电出版社坚持“立足信息产业、面向现代社会、传播科学知识、服务科教兴国”,致力于通信、计算机、电子技术、教材、少儿、经管、摄影、集邮、旅游、心理学等领域的专业图书出版。