前言
如果读者带着本书穿越回到20世纪90年代,就会发现第23章关于RSA密码的内容在当时的美国是不允许出口的。由于RSA密码加密过的信息不可能被破解,因此美国政府将出口类似RSA的加密软件视作与美国国家安全相关的问题,需要由美国国务院提供许可。事实上,法律对高强度的密码算法甚至有着和坦克、导弹、火焰喷射器一样严格的限定。
1990年,加利福尼亚大学的一名学生Daniel J. Bernstein想要发表一篇关于Snuffle加密系统源代码的学术论文。美国政府告知他,如果想要将代码发表在互联网上,就必须先得到一张军火商的许可证。同时,美国政府还告诉他,因为他的技术安全等级太高,所以如果他要申请一张军火许可证的话,政府就不得不吊销他的出境护照。
电子前线基金会(EFF)是一个十分年轻的数字公民自由组织,在Bernstein起诉美国政府的时候,它与Bernstein站在了同一阵线。这是有史以来第一次,法庭判决一份软件代码受到宪法第一修正案的保护,且对该加密软件的出境控制触犯了Bernstein的法定人权。
现在,每天都有成千上万的互联网商人使用强大的密码算法。这些密码算法已然成为全球经济、商业安全保障和电子商务站点的基石。情报机构曾经预测加密软件将会毁灭国家安全机制的骇人言论早已失去踪影。
本书的目标读者
许多图书指导初学者如何运用密码算法写出密文以及破解密码算法,但目前几乎没有一本书教授初学者如何用计算机编程实现密码算法的破解,本书填补了这一空白。
本书是为对加密、破解或密码算法抱有浓厚兴趣的人士准备的。除第23章和第24章介绍的公钥密码算法以外,本书其余的密码算法均有超过一个世纪的历史,但目前的笔记本电脑有破解它们的计算能力。现在已经很少有组织或个人会使用这些密码算法了,但通过学习这些算法,读者能够了解密码算法建立的基础,也能了解黑客破解弱密码算法的方式。
● 注意
本书介绍的密码算法都非常有趣,但它们实际上并不安全。切记不能使用本书中的任何加密程序去加密真实的文件。还有一个普遍的定理是,不要信任任何你自己创造出来的密码算法。真实世界中的密码算法是经过密码学家多年的专业分析及设计之后才投入使用的。
本书也是为从未学习过编程的读者准备的。它将以Python语言传达基础的编程理念。对于新手来说,Python是一门优秀的编程语言,拥有平缓的学习曲线,各年龄段的初学者均可以掌握,而它同时也是一种用于专业软件开发的强大语言。Python程序可以运行在Windows、macOS、Linux系统,甚至树莓派,下载和使用Python程序都是完全免费的。
在本书中,作者将频繁用到“黑客”这一术语。“黑客”这个词语有两种定义,它可能指某个研究密码系统(如密码算法的原理或软件代码的片段)的人,这个人精通整个系统,以致他不会受到系统原则的限制,甚至可以创造性地对系统进行修改;这个词也可能是指闯入计算机系统的不法分子,他们会侵犯人们的隐私,造成各类损失。本书采用的是第一种释义。黑客是很“酷”的,而犯罪分子不过是一些认为搞破坏就能显得自己高人一等的家伙罢了。
本书涵盖的内容
第1~3章将介绍Python和密码学的基本概念。第4~24章则依次解释某种密码算法的加密程序与其对应的破解程序。每章配备习题,有助于读者复习所学到的知识。
•第1章:制作纸质密码学工具,包含了一些简单的书面工具的介绍,展示了在计算机出现之前加密是如何实现的。
•第2章:在交互式运行环境中编程,说明了如何使用Python交互式运行环境逐行执行代码。
•第3章:字符串及编写程序,包含了编写完整代码的教程和本书中所有程序都会用到的字符串数据类型的简介。
•第4章:反向密码,介绍了第一种密码算法的简单程序编写方法。
•第5章:凯撒密码,包含了一种数千年前发明的基础密码。
•第6章:用暴力算法破解凯撒密码,介绍了暴力破解算法及如何在没有密钥的情况下使用暴力破解算法解密信息。
•第7章:通过置换密码实现加密,介绍了置换密码及置换密码加密程序。
•第8章:解密置换密码,包含了置换密码的第二部分,即通过密钥解密消息。
•第9章:编写测试程序,介绍了通过一个程序测试另一个程序的技术。
•第 10 章:文件的加密与解密,介绍了如何从硬盘中读出文件以及如何将文件写入硬盘。
•第11章:编程检测英语文本,描述了计算机检测英文句子的方法。
•第12章:破解置换密码,结合之前章节的内容,破解置换密码。
•第13章:仿射密码的模运算模块,解释仿射密码的数学原理。
•第14章:编写仿射密码,包含了仿射密码实现程序的编写过程。
•第15章:破解仿射密码,解释了如何编写程序破解仿射密码。
•第16章:编写简单代换密码,包含了代换密码实现程序的编写过程。
•第17章:破解简单代换密码,解释了如何编写程序破解代换密码。
•第18章:编写维吉尼亚密码,介绍了维吉尼亚密码的实现程序。该密码是一种更为复杂的代换密码。
•第19章:频率分析,对英文单词的结构进行了探究,并据此说明如何利用其结构破解维吉尼亚密码。
•第20章:破解维吉尼亚密码,解释了如何通过编写程序破解维吉尼亚密码密码。
•第21章:一次一密,介绍了一次一密密码并从数学角度分析其无法被破解的原因。
•第22章:素数的查找与生成,介绍了如何编写一个用于快速判断素数的程序。
•第23章:为公钥密码生成密钥,描述了公钥密码原理及生成公私钥对的程序。
•第24章:编写公钥密码算法,说明了公钥密码加密程序,其生成的密文无法仅用一台便携式计算机破解。
•附录:调试Python代码,向读者展示了如何通过IDLE的调试器找到并修复程序中的错误。
如何使用本书
本书与其他编程类图书的不同之处在于,它的重点在于讲解一段完整的源代码。本书会向读者展示完整的程序并解释其工作原理,而不是仅告诉读者编程的原理,然后让读者自己去研究如何编写一个程序。
输入源代码
在阅读本书的过程中,建议读者手动将本书中的代码输入Python文件中。这样做有助于读者更好地理解代码。
在输入源代码时,注意不要将每行开头的行号一起输入。这些数字并不是代码的一部分,只不过是在解释代码的过程中可能会提到具体的某一行代码,因此使用了行号。当然,除需要注意行号的问题以外,还必须确保输入的代码和书中完全一致,包括大小写形式。
读者可能会注意到,某些代码并不是从最左侧开始书写的,它的前面有4格、8格甚至更多的缩进。请确保输入正确的空格数,避免出错。
检查拼写错误
虽然手动输入程序的源代码对学习Python有很大帮助,但这个过程可能会偶尔出现拼写错误,导致程序报错。要检查出拼写错误可能十分困难,尤其是在源代码非常长的情况下。
本书的编程规范
本书并不是一本编程参考书,而是一本为初学者设计的实践指南。因此,本书中的代码有时候并未与最佳代码样式相符,但对本书而言,让代码学习起来更容易才是明智的选择。同时,本书并不会对计算机科学的理论做任何介绍。
老练的程序员可能会指出,本书的部分代码可以改进得更有效率一些,但本书最关心的问题不是代码执行的效率,而是以简单的方式让程序能够执行。
下载并安装Python
在开始编程之前,读者首先要安装Python编译器(Python Interpreter),即一种用于执行Python指令的软件。以下将Python编译器简称为Python。
读者可从Python官网上免费下载Windows、macOS、Ubuntu版本的Python。只要下载最新版本,本书中的所有程序就能够正常运行。
● 注意
读者需要确保下载的版本是Python 3系列(如Python 3.6)。本书中的程序是在Python 3上运行的,在Python 2上可能无法正常运行。
Windows版本安装指南
在Windows上,首先下载Python安装包,该安装包的文件名应该以 .msi结尾,双击这个安装包,然后按照安装程序在屏幕上显示的指南安装Python。
(1)选择Install Now开始安装。
(2)安装完成后,单击Close按钮。
macOS版本安装指南
在macOS上,首先下载符合当前macOS版本的.dmg文件并双击,然后按照安装程序在屏幕上显示的指南安装Python,如下所示。
(1)当DMG包打开新窗口时,双击Python.mpkg文件。这个过程可能要输入计算机的管理员密码。
(2)单击欢迎界面上的Continue按钮并单击Agree按钮接受相关条款。
(3)选择HD Macintosh(或读者硬盘的名称)并单击Install按钮。
Ubuntu版本安装指南
如果当前系统是Ubuntu,那么可以按照以下步骤从Ubuntu软件中心安装Python。
(1)打开Ubuntu软件中心。
(2)在窗口右上角的搜索栏中输入Python。
(3)选择IDLE(Python 3.6版本),或其他最新版本。
(4)单击Install按钮。
在完成安装的过程中,可能要输入管理员密码。
下载pyperclip.py
本书中的程序用到了一个作者编写的通用模块:pyperclip.py。这个模块可以让程序复制并粘贴文本到剪贴板中。
该文件的位置必须和读者编写的Python文件在同一文件夹(或称同一路径)中,否则运行程序时会出现如下报错信息。
ImportError: No module named pyperclip
下载并安装完Python编译器及pyperclip.py模块之后,接下来看一看编写程序的工具。
启动IDLE
Python编译器即为能够执行Python程序的软件,而交互式开发环境(Interactive Development Environment,IDLE)就是编写程序的地方,它更像是一个文字处理器。IDLE在安装Python的同时就一并被安装好了,可以通过以下步骤启动IDLE。
•在Windows 7或更新版本的系统中,单击屏幕左下角的开始按钮,在搜索栏中输入IDLE,并选择IDLE(Python 3.6 64-bit)。
•在macOS中,打开Finder,单击Applications以及Python 3.6,再单击IDLE图标。
•在Ubuntu中,首先选择Applications▸Accessories▸Terminal,接着输入idle3。(还可以单击屏幕上方的Applications,选择Programming,再单击IDLE 3。)
无论是哪种操作系统,IDLE的窗口看起来都和图0.1差不多。顶部的文字可能会有些许不同,这取决于读者下载的Python版本。
图0.1所示的这个窗口称为交互式运行环境(interactive shell)。在交互式运行环境中,可以将指令输入计算机,这与macOS的Terminal或Windows的Command Prompt程序类似。有时,程序员可能不想编写一个完整的程序,只想试着执行几行代码片段,Python交互式运行环境就提供了这一功能,使得程序员能够直接往里输入指令,而计算机会立即读取并执行这些指令。
图0.1 IDLE窗口
例如,将下列代码输入交互式运行环境的 >>> 提示符之后。
>>> print('Hello, world!')
按回车键,交互式运行环境将显示以下内容。
Hello, world!
小结
在现代密码学引入计算机技术之前,仅靠纸和笔是无法破解大部分密码的。虽然计算机使许多古老的、经典的密码变得十分脆弱,但学习这些密码的过程仍然非常有趣。编写密码分析程序去破解这些密码是学习如何编程的好方法。
在第1章中,我们将从基础的密码学工具说起,在没有计算机帮助的情况下实现对信息的加密和解密。
让我们开始破解的相关学习吧!