本文主要内容:
我忍不住偷听,可能因为我在窃听。——佚名
看看以下两段文字:
左边的文字是秘密消息。这段消息已被加密,或者说被变成了秘密代码。任何不知道如何解密(也就是把它变回普通英语消息)的人都无法阅读。本书将会教你如何加密和解密消息。
右边的消息只是随机乱码,没有包含任何有意义的内容。加密你写下来的消息是对其他人保密的一种方式,即使他们得到了加密之后的消息。这看起来和随机乱码完全一样。
密码学是使用秘密代码的科学。密码编译者是使用和研究秘密代码的人。本书会告诉你成为一名密码编译者需要知道什么。
当然,这些秘密消息并不总是保持秘密状态。密码破译者是能破译秘密代码并读取其他人的加密消息的人。密码破译者又称为代码破译者(code breaker)或代码黑客(hacker)。本书也会告诉你成为一名密码破译者需要知道什么。遗憾的是,你在本书里学到的破译方式不会给你带来麻烦(我的意思是,幸亏如此)。
间谍、士兵、黑客、海盗、贵族、商人、暴君、政治激进分子、网购者以及任何要与可信好友分享秘密的人都依赖密码学,以确保他们的秘密还是秘密。
19世纪初发明的电报允许通过跨越大陆的电线进行即时通信,这比带着一袋信件骑马派送要快很多。然而,电报不能直接发送写在纸上的字母,它只能发送电子脉冲。短脉冲叫“点”,长脉冲叫“线”。
图1-1 Samuel Morse 1791年4月27日—1872年4月2日
图1-2 Alfred Vail 1807年9月25日—1859年1月18日
为了把这些点和线转成英文字母,需要一个编码(或代码)系统把英语翻译成电子脉冲代码(编码),另一边把电子脉冲翻译成英语(解码)。用于电报(后来也用于无线电)的代码叫摩斯代码(Morse Code),由Samuel Morse(见图1-1)和Alfred Vail(见图1-2)发明。通过一个电报按钮敲打出点和线,电报员可以把英语消息发给世界另一端的某个人,几乎是实时的!(如果你想学习图1-3所示的摩斯代码,请到http://invpy.com/morse。)
图1-3 国际摩斯代码,通过点和线表示字符
代码是可以理解的,而且是公开发布的。任何人都应该可以通过查找代码符号的含义解密已被加密的消息。
在学习通过计算机编程进行加密和解密之前,我们先来了解一下如何使用简单的纸质工具手工完成这项任务。把可理解的英语文字(明文)变成隐藏秘密代码的乱码文字(密文)是很容易的。加密法(cipher)是一组转换明文和密文的规则。这些规则通常使用一个密钥。我们会在本书里学到多种不同的加密法。
我们来学一下凯撒加密法。这种加密法曾在两千年前被凯撒大帝用过。好消息是,它学起来很简单很容易。坏消息是,正因为它简单,密码破译者也很容易破译它。但我们可以把它看做一个简单的练习。Wikipedia上有更多关于凯撒加密法的信息:[http://en.wikipedia. org/wiki/Caesar_cipher](http://en.wikipedia. org/wiki/Caesar_cipher)。
要用凯撒加密法把明文转成密文,需要制作一个加密轮盘(又名加密圆盘)。你可以复印本书给出的加密轮盘(见图1-4和图1-5),也可以打印http://invpy.com/cipherwheel上的那个加密轮盘。把这两个圆圈剪下来,然后把它们叠在一起,参考图1-6至图1-8所示的步骤。
图1-4 加密轮盘内圈
图1-5 加密轮盘外圈不要从本书http://invpy.com/cipherwheel上打印上剪!复印本页或从
图1-6 剪下加密轮盘
图1-7 剪下来的圆圈
图1-8 完成后的加密轮盘
剪下两个圆圈之后,把小的放在大的中间。在两个圆圈中间插一根大头针或曲头钉,这样你就可以在上面旋转了。现在,你拥有使用凯撒加密法加密信息所需的工具了。
如果你手头没有剪刀和复印机,你也可以使用在线虚拟加密轮盘(见图1-9)。用浏览器打开http://invpy.com/cipherwheel,使用软件版的加密轮盘。
图1-9 在线加密轮盘
要旋转轮盘,用鼠标在上面点击一下,然后移动鼠标,直到你想要的密钥在适当的位置上。再次点击鼠标,就可以停止轮盘的旋转。
首先,在纸上用英语写下你的消息。在这个例子里,我们将会加密这条消息:“The secret password is Rosebud.”。接着,旋转内圈,直到它的字母匹配外圈的字母。值得注意的是,外圈的字母A下面有一个点。再看看外圈里的这个点对应的内圈里的数字,这个数字就是密钥。
这个密钥就是加密或解密消息的秘密所在。任何读过这本书的人都知道凯撒加密法,就像任何读过关于锁的书的人都知道门锁的工作原理。但是,就像平常的锁和钥匙,除非他们有密钥,否则他们不能解锁(也就是解密)已被加密的消息。在图1-9中,外圈的A在内圈的数字8上,这意味着我们将会使用8这个密钥来加密我们的消息。凯撒加密法使用的密钥范围是0~25。我们的例子将会使用8这个密钥。保管好这个密钥,任何知道这条消息使用8这个密钥加密的人都能读懂密文。
对于我们的消息里的每个字母,我们将会找到它在外圈的位置,然后把它替换成内圈对应的字母。我们的消息的第一个字母是T(“The secret…”里的第一个“T”),于是我们在外圈找到字母T,然后找到内圈对应的字母。这个字母是B,因此,我们总会把我们的秘密消息里的T替换成B(如果我们使用8以外的其他密钥,那么明文里的T将被替换成别的字母)。
我们的消息里的下一个字母是H,它会变成P。字母E会变成M。当我们加密完整条消息时,这条消息会从“The secret password is Rosebud.”变成“Bpm amkzmb xiaaewzl qa Zwamjcl.”(见图1-10)。现在你可以把这条消息发给某人(或者给自己写下来),没人可以读懂它,除非你把密钥(数字8)告诉他们。
图1-10 用加密轮盘加密的消息
外圈上的每个字母总是加密成内圈上相同的字母。为了节约时间,在你查找“The secret…”里的第一个T,并看到它会加密成B之后,你可以把这条消息里的每个T都替换成B。这样,一个字母你只需要查找一次。
要解密一条密文,从内圈向外圈走。假设你从一个朋友那里收到这条密文:“Iwt ctl ephhldgs xh Hldgsuxhw.”。你和其他人都不能解密它,除非你知道密钥(或者除非你是个很聪明的黑客)。但你的朋友决定使用15这个密钥加密自己发给你的每条消息。
把外圈上的字母A(下面有个点的那个)对准内圈上带有数字15的字母(即字母P)。密文里的第一个字母是I,因此,我们在内圈上找I,看看旁边外圈上的字母,是T。密文里的W会解密成字母H。一个接一个地,我们把密文里的每个字母解密成明文:“The new password is Swordfish.”。
如果你使用不正确的密钥,比如16,而不是正确的密钥15,解密的消息是:“Sgd mdv ozrrvnqc hr Rvnqcehrg.”。这个明文根本看不懂。除非使用正确的密钥,否则被解密的消息永远不会是可理解的英语。
还有一个纸质工具可以用来做加密和解密,这个纸质工具叫做St. Cyr滑条。它很像密钥索引轮盘,但它是直的。
复印本页的St. Cyr滑条图片(或者从http://invpy.com/stcyrslide打印),剪下三条纸带,如图1-11所示。
图1-11 复印这些纸带制作St. Cyr滑条
连接两条字母表纸带,把黑框A粘在另一条纸带上的白框Z旁边。割开主滑框两边的裂缝,使连接起来的纸条可以穿过它。最后看起来应该是如图1-12所示。
图1-12 完成后的St. Cyr滑条
当黑框A在字母H(数字7)下面时,如果要加密,就在长纸带上找出明文字母的位置,然后把它替换成在它上面的字母。如果要解密,就在上面那行字母里找出密文字母,然后把它替换成下面的长纸带上的字母。
大框两边的裂缝会隐藏其他的字母,这样,对于任何密钥,滑条上的每个字母你只会看到一个。
St. Cyr滑条的好处是更容易找到你要找的字母,因为它们都在同一条直线上,不像加密轮盘那样有时候会倒转过来。
虚拟的可打印的St. Cyr滑条可以在http://invpy.com/stcyrslide找到。
你可以在http://invpy.com/hackingpractice1A找到练习。
不要忽略练习!
本书没有足够的篇幅列出所有练习,但它们仍然重要。
仅仅阅读关于黑客技术和编程的资料不会让你成为一名黑客。你需要实践!
在使用凯撒加密法做加密和解密时,加密轮盘和St. Cyr滑条都是很好的工具。但我们只用铅笔和纸也可以实现凯撒加密法。
把字母表的字母从A到Z写下来,在每个字母下面写下数字0到25。在A下面写0,B下面写1,如此类推,直到在Z下面写25(字母表里有26个字母,但我们的数字最多只到25,因为我们从0而不是1开始的)。最终看起来像这样:
有了上面这个从字母到数字的代码,我们就可以用数字来表示字母了。这是一个非常强大的概念,因为数学使用数字。现在我们可以在字母上做运算了。
现在,如果要加密,我们找到希望加密的字母下面的数字,然后把密钥数字加上去。这个和就是加密的字母下面的数字。如,我们使用密钥13加密“Hello. How are you?”。首先,我们找到H下面的数字,是7。接着,我们把密钥加上这个数字,7 + 13 = 20。数字20在字母U下面,这意味着字母H加密成字母U。如果要加密字母E,我们把E下面的4加上13,得到17。17上面的字母是R,因此E加密成R。如此类推。
直到我们遇上字母O时这个方法才会出问题。O下面的数字是14,当把14加上13时,我们得到27。但我们的数字列表最多只到25。如果字母的数字和密钥之和超过26,我们应该减去26,27 – 26得到1。数字1上面的字母是B。于是,当使用密钥13时,字母O加密成字母B。一个接一个地,我们可以把“HELLO. HOW ARE YOU?”里的字母加密成“URYYB. UBJ NER LBH?”。
因此,加密一个字母的步骤是:
1.从1到25选一个密钥。保管好这个密钥!
2.找出明文字母的数字。
3.把密钥加到这个明文字母的数字。
4.如果这个数字大于26,则减去26。
5.找出你计算的数字的字母。这就是密文字母。
6.对明文消息里的每个字母重复步骤2~5。
表1-1演示了如何使用密钥13加密“HELLO. HOW ARE YOU?”里的每个字母。每列演示了把左边的明文字母变成右边的密文字母的步骤。
表1-1 用纸和铅笔加密“Hello. How are you?”的步骤
明文字母 | 明文数字 | + | 密钥 | 结果 | 减去26? | 结果 | 密文字母 |
---|---|---|---|---|---|---|---|
H | 7 | + | 13 | = 20 | = 20 | 20 = U | |
E | 4 | + | 13 | = 17 | = 17 | 17 = R | |
L | 11 | + | 13 | = 24 | = 24 | 24 = Y | |
L | 11 | + | 13 | = 24 | = 24 | 24 = Y | |
O | 14 | + | 13 | = 27 | −26 | = 1 | 1 = B |
H | 7 | + | 13 | = 20 | = 20 | 20 = U | |
O | 14 | + | 13 | = 27 | −26 | = 1 | 1 = B |
W | 22 | + | 13 | = 35 | −26 | = 9 | 9 = J |
A | 0 | + | 13 | = 13 | = 13 | 13 = N | |
R | 17 | + | 13 | = 30 | −26 | = 4 | 4 = E |
E | 4 | + | 13 | = 17 | = 17 | 17 = R | |
Y | 24 | + | 13 | = 37 | −26 | = 11 | 11 = L |
O | 14 | + | 13 | = 27 | −26 | = 1 | 1 = B |
U | 20 | + | 13 | = 33 | −26 | = 7 | 7 = H |
如果要解密,你需要理解负数是什么。如果你不知道如何加和减负数,可以参考教程http://invpy.com/neg。
如果要解密,减去这个密钥,而不是加上它。对于密文字母B,这个数字是1。1减去13得到−12。就像加密的“减去26”规则,当解密并且结果小于0时,我们有一条“加上26”的规则。−12 + 26是14,因此,如表1-2所示,密文字母B解密回字母O。
表1-2 用纸和铅笔解密密文的步骤
密文字母 | 密文数字 | − | 密钥 | 结果 | 加上26? | 结果 | 明文字母 |
---|---|---|---|---|---|---|---|
U | 20 | − | 13 | = 7 | = 7 | 7 = H | |
R | 17 | − | 13 | = 4 | = 4 | 4 = E | |
Y | 24 | − | 13 | = 11 | = 11 | 11 = L | |
Y | 24 | − | 13 | = 11 | = 11 | 11 = L | |
B | 1 | − | 13 | = −12 | +26 | = 14 | 14 = O |
U | 20 | − | 13 | = 7 | = 7 | 7 = H | |
B | 1 | − | 13 | = −12 | +26 | = 14 | 14 = O |
J | 9 | − | 13 | = −4 | +26 | = 22 | 22 = W |
N | 13 | − | 13 | = 0 | = 0 | 0 = A | |
E | 4 | − | 13 | = −9 | +26 | = 17 | 17 = R |
R | 17 | − | 13 | = 4 | = 4 | 4 = E | |
L | 11 | − | 13 | = −2 | +26 | = 24 | 24 = Y |
B | 1 | − | 13 | = −12 | +26 | = 14 | 14 = O |
H | 7 | − | 13 | = −6 | +26 | = 20 | 20 = U |
如你所见,使用凯撒加密法加密是并不真的需要加密轮盘。如果你记住数字和字母,你甚至不必写下字母表以及它们下面的数字。你只需心算就可以写出秘密消息了。
你可以在http://invpy.com/hackingpractice1B找到练习。
你可能在想,使用两个不同密钥加密同一条消息两次会加倍加密的强度。但这对于凯撒加密法(以及大多数其他加密法)来说不是那么一回事。让我们双重加密一条消息看个究竟。
如果我们用密钥3加密“KITTEN”这个词,得到的密文将是“NLWWHQ”。如果我们用密钥4加密“NLWWHQ”这个词,得到的密文将是“RPAALU”。这和用密钥7加密“KITTEN”这个词完全一样。“双重”加密和普通加密是一样的,没有任何强化。
其中的原因是,当我们用密钥3加密时,我们把3加到明文字母的数字。接着,当我们用密钥4加密时,我们把4加到明文字母的数字。但加上3再加上4和直接加上7完全一样。用密钥3和4加密两次和用密钥7加密一次是一样的。
对于大多数加密法而言,多次加密不会增加密文的强度。事实上,如果你用两个加起来等于26的密钥来加密某些明文,你最终得到的密文和原来的明文是一样的!
几个世纪以来,凯撒加密法或者类似的加密法曾被用于加密信息。图1-13是Albert Myer设计的加密圆盘,这个加密圆盘曾在1863年的美国南北战争中使用。
图1-13 在美国国家密码博物馆展览的美国南北战争同盟使用的加密圆盘
如果你有一段很长的消息希望加密(如加密一整本书),手工加密需要耗费数日或数周的时间。这正是编程派上用场的地方。计算机可以在一秒之内完成大量文字工作。但是,我们需要学习如何指示(也就是编程)计算机执行我们所做的步骤。
我们要会说一门计算机能懂的语言。幸运的是,学习编程语言不像学习日语或西班牙语等外语那么难。你甚至不需要懂太多数学,除了加、减和乘。你只需下载一个叫Python的免费软件,这个软件我们将在下一章里讲解。
本文摘自刚刚上架的《Python密码学编程》
《Python密码学编程》适合不懂加密、破译或密码学的初学者。本书的加密法(除了最后一章的RSA加密法)都有数百年历史了,现代计算机的计算能力可以破译使用它们加密的信息,现代组织或个人已经不再使用这些加密法了。有鉴于此,你不会因为本书里的内容而惹麻烦。
本书适合从来没有编过程序的初学者。本书使用Python编程语言讲解基本编程概念。Python非常适合初学者学习编程:它是一种简单可读却又强大的编程语言,为专业软件开发者所用。Python软件可以从http://python.org免费下载,可以在Linux,Windows,OS X和树莓派上运行。
“黑客”有两种定义。一种“黑客”是指通过学习来理解一个系统,并跳出系统原有的规则限制,有创造性地修改它,使之以新的方式来工作的人。另一种“黑客”也用来指入侵计算机系统,触犯个人隐私并造成伤害的罪犯。本书提到的“黑客”是第一种。黑客很酷,罪犯则只是通过破坏来显摆智商的人。就我个人而言,我的本职是一名软件开发者,和写病毒或网络诈骗相比,这份工作钱多活少。
还有一点要注意的,不要把本书里的任何加密程序用于你的实际文件。它们可以带来乐趣,但并不提供真正的安全。一般来说,你不应该信任你自己创造的加密法。正如传奇密码学家Bruce Schneier说的:“任何人,从最无能的外行到最好的密码学家,都能创建出他自己无法破译的算法。这并非难处。难处在于创建出别人无法破译的算法,即使经过数年分析,证明那点的唯一途径是通过各地最好的密码学家对这个算法进行长达数年的分析。”
【亚马逊入口】【当当入口】【京东入口】