Python密码学编程

978-7-115-42429-7
作者: 【美】Al Sweigart(斯维加特)
译者: 李永伦
编辑: 陈冀康
分类: Python

图书目录:

详情

本书主要介绍了加密算法,同时从Python编程的角度来引导读者将加密算法更好地实现。书中不仅讲述了详细的算法理论,还附以详细的代码示例帮助读者更好地学习算法,并最终实现加密算法。除此之外,书中还提供了相应的源码下载资源,能够让读者获取到最完整真实的代码示例,帮助读者更好地进行后续的开发和学习。

图书摘要

版权信息

书名:Python密码学编程

ISBN:978-7-115-42429-7

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

• 著    [美] Al Sweigart

  译    李永伦

  责任编辑 陈冀康

• 人民邮电出版社出版发行  北京市丰台区成寿寺路11号

  邮编 100164  电子邮件 315@ptpress.com.cn

  网址 http://www.ptpress.com.cn

• 读者服务热线:(010)81055410

  反盗版热线:(010)81055315


Simplified Chinese translation copyright © 2016 by Posts and Telecommunications Press

ALL RIGHTS RESERVED

Hacking Secret Ciphers with Python byAl Sweigart

Copyright © 2013 by Al Sweigart

本书中文简体版由作者Al Sweigart授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。

版权所有,侵权必究。


Python是一种高级程序设计语言,因其简洁、易读及可扩展性日渐成为程序设计领域备受推崇的语言。同时,Python语言在算法领域也得到了很好的应用。

本书是面向初学者的Python密码学编程指南通过理论和实例相结合的方式介绍了多种加密算法及其破解方法。全书共分24章,由浅入深地介绍了与密码学编程相关的各类基础知识、编程技巧以及算法实现。除此之外,本书还提供了相应的源码下载资源,以供读者更好地进行探索和学习。

本书适合Python初学者和密码学的初学者,也适合信息安全从业人员。


Albert Sweigart(你可以叫他Al)在加州的旧金山从事有用软件开发,他喜欢去咖啡店。《Python密码学教程》是他的第三本书。

他的前两本书分别是《Python游戏编程快速上手》和《Python和Pygame游戏开发指南》,它们可以在http://inventwithpython.com网站上免费阅读。

他的老家是得克萨斯州的休斯顿。他看到公园的松树就会大笑,这让人们觉得他是个傻瓜。


有很多书教初学者如何使用加密法写秘密消息,有一些书教初学者如何破译加密法。据我所知,还没有书教初学者如何编写程序来破译加密法。这本书填补了这个空缺。

本书适合不懂加密、破译或密码学的初学者。本书的加密法(除了最后一章的RSA加密法)都有数百年历史了,现代计算机的计算能力可以破译使用它们加密的信息,现代组织或个人已经不再使用这些加密法了。有鉴于此,你不会因为本书里的内容而惹麻烦。

本书适合从来没有编过程序的初学者。本书使用Python编程语言讲解基本编程概念。Python非常适合初学者学习编程:它是一种简单可读却又强大的编程语言,为专业软件开发者所用。Python软件可以从http://python.org免费下载,可以在Linux,Windows,OS X和树莓派上运行。

“黑客”有两种定义。一种“黑客”是指通过学习来理解一个系统,并跳出系统原有的规则限制,有创造性地修改它,使之以新的方式来工作的人。另一种“黑客”也用来指入侵计算机系统,触犯个人隐私并造成伤害的罪犯。本书提到的“黑客”是第一种。黑客很酷,罪犯则只是通过破坏来显摆智商的人。就我个人而言,我的本职是一名软件开发者,和写病毒或网络诈骗相比,这份工作钱多活少。

还有一点要注意的,不要把本书里的任何加密程序用于你的实际文件。它们可以带来乐趣,但并不提供真正的安全。一般来说,你不应该信任你自己创造的加密法。正如传奇密码学家Bruce Schneier说的:“任何人,从最无能的外行到最好的密码学家,都能创建出他自己无法破译的算法。这并非难处。难处在于创建出别人无法破译的算法,即使经过数年分析,证明那点的唯一途径是通过各地最好的密码学家对这个算法进行长达数年的分析。”

如果你对这些程序如何工作有问题,可以随时给我发电子邮件:al@inventwithpython.com。


本章主要内容:

我忍不住偷听,可能因为我在窃听。

——佚名

看看以下两段文字:

左边的文字是秘密消息。这段消息已被加密,或者说被变成了秘密代码。任何不知道如何解密(也就是把它变回普通英语消息)的人都无法阅读。本书将会教你如何加密和解密消息。

右边的消息只是随机乱码,没有包含任何有意义的内容。加密你写下来的消息是对其他人保密的一种方式,即使他们得到了加密之后的消息。这看起来和随机乱码完全一样。

密码学是使用秘密代码的科学。密码编译者是使用和研究秘密代码的人。本书会告诉你成为一名密码编译者需要知道什么。

当然,这些秘密消息并不总是保持秘密状态。密码破译者是能破译秘密代码并读取其他人的加密消息的人。密码破译者又称为代码破译者(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的免费软件,这个软件我们将在下一章里讲解。


本章主要内容:

开放社会的隐私需要密码学。如果我说了什么,我希望听到的人都是我想让他们听到的。如果我讲话的内容全世界都能知道,那我就没隐私了。

——Eric Hughes,《A Cypherpunk’s Manifesto》,1993(http://invpy.com/cypherpunk

本章内容很像Invent Your Own Computer Games with Python的第1章。如果你已经读过那本书或者已经安装Python,你只需阅读本章2.2节。

在开始编程之前,你需要安装Python解析器软件(这里你可能需要找人帮忙)。解析器是一个可以理解你用Python语言写的指令的程序。如果没有解析器,你的计算机不会理解这些指令(从现在起,我们会把“Python解析器”称为“Python”)。

因为我们将会使用Python语言写程序,所以我们需要从Python编程语言的官方网站(http://www.python.org)下载Python。安装过程可能会有所不同,这取决于你的计算机的操作系统是Windows、OS X还是Linux发行版(如Ubuntu)。你可以在http://invpy.com/installing找到安装Python软件的视频。

注意:请确保你安装的是Python 3,而不是Python 2。本书的程序使用Python 3,使用Python 2运行它们将会出错。因为这很重要,所以我画了一个卡通企鹅来提醒你安装Python 3(见图2-1),不要搞错。

图2-1 “请确保你安装的是Python 3,而不是Python 2!”紧张的企鹅说道

http://www.python.org网页左边有一组链接。点击Download链接进入下载页面,找到Python 3.3.0 Windows Installer(“Windows binary–does not include source”)文件,单击这个链接下载Python for Windows(如果有比Python 3.3.0更新的版本,请下载新版本)。双击你下载的python-3.3.0.msi文件启动Python安装程序(如果没有启动,尝试单击这个文件并选择安装)。一旦安装程序启动,单击“下一步”按钮,接受安装程序里的选项,没有什么需要修改。安装结束时单击“完成”。

OS X的安装过程与Windows的安装过程类似。你要从Python网站下载的是.dmg(Mac Installer Disk Image)文件,而不是.msi文件。“Download Python Software”页面上包含“Python 3.3.0 Mac OS X”字眼的就是这个文件的链接了。

如果你的操作系统是Ubuntu,打开终端窗口(单击Application\Accessories\ Terminal),输入sudo apt-get install python 3.3,然后按下Enter键,就可以安装Python了。你需要输入根密码才能安装Python,请让这台计算机的所有者输入这个密码。

你也需要安装IDLE软件。在终端窗口里输入sudo apt-get install idle3。你也需要根密码才能安装IDLE。

这本书里几乎每个程序都会用到我写的pyperclip.py自定义模块。这个模块提供的函数可以让你的程序把文本复制到剪贴板。Python没有附带这个模块,你可以从http://invpy.com/ pyperclip.py下载它。

这个文件和你写的Python程序文件必须放在相同的文件夹里(文件夹也叫目录)。否则当你尝试运行程序时将会看到如下错误消息:

ImportError: No module named pyperclip

我们将会使用IDLE软件输入并运行程序。IDLE全称是Interactive DeveLopment Environment。Python是解析和运行Python程序的软件,IDLE则是用来输入程序的软件。

如果你的操作系统是Windows XP(见图2-2),你应该单击“开始”按钮,选择Programs\ Python 3.3\IDLE (Python GUI)来运行Python。对于Windows Vista或Windows 7,单击左下角的Windows按钮,输入“IDLE”,然后选择“IDLE (Python GUI)”。

如果你的操作系统是Mac OS X(见图2-2),打开Finder窗口,单击Applications,单击Python 3.3,然后单击IDLE图标就可以打开IDLE了。

如果你的操作系统是Ubuntu或其他的Linux(见图2-2),单击Application\Accessories\ Terminal,然后输入idle3就可以打开IDLE了。你也可以单击屏幕顶部的Applications,选择Programming,然后选择IDLE 3。

图2-2 在Windows(上)、OS X(中)和Ubuntu Linux(下)上运行的IDLE

显示的窗口基本上都是空白的,除了下面这种文字:

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit
(AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>

首次启动IDLE时显示的窗口叫做交互式Shell。Shell是一个让你向计算机输入指令的程序。Python Shell让你输入Python指令,然后把这些指令发送给Python解析器软件运行。我们向这个Shell输入Python指令。由于这个Shell是交互式的,计算机会即时读取并执行我们的指令。

本书不同于其他编程书籍,它专注于完整程序的源代码。这本书不是教你编程概念,让你自己搞清楚如何创建你自己的程序,而是向你展示完整程序,并解释它们是如何工作的。

在阅读本书时,你可以自己把本书的代码输入IDLE。你也可以从本书的网站下载源代码文件。打开http://invpy.com/hackingsource,按照指示下载源代码文件。

一般而言,你应该从头到尾阅读。这些编程概念都是建立在前面章节基础之上的。但是,Python是一门可读性很强的语言,读了开头几章之后,你就可以搞清楚这些代码是做什么的了。如果你跳着读,读着读着感到糊涂了,不妨回到前面的章节看看,或者把你的编程问题通过邮件地址al@inventwithpython.com发给我。

当你自己输入源代码时,不要输入每行开头显示的行号。例如,如果你在本书里看到这段代码:

1. number = random.randint(1, 20)
2. spam = 42
3. print('Hello world!')

你不需要输入左边的“1.”以及紧跟其后的空格。只要这样输入就行了:

number = random.randint(1, 20)
spam = 42
print('Hello world!')

那些编号只是用来引用本书代码的特定行。它们不是实际程序的一部分。除了这些行号,请确保输入的代码和看到的完全一致,包括字母大小写。在Python里,HELLO、hello和Hello是三个不同的东西。

注意,某些行不是从最左边开始的,而是会缩进4个或8个空格。请确保在每行开始输入正确数量的空格。因为IDLE里的每个字符都是等宽的,数一下上一行或者下一行的字符数就可以知道这行的空格数了。

例如,你可以看到第二行缩进了4个空格,因为上一行对应缩进空格的地方有4个字符(“whil”);第三行再缩进了4个空格(第三行的缩进空格上有“if n”4个字符):

while spam < 10:
    if number == 42:
         print('Hello')

某些代码太长,一行放不下,代码的文字就会换行。当你在文件编辑器里输入这种代码时,把它们全部放在一行,中间没有换行。

你可以通过代码左边的行号来判断是不是新的一行。下面的例子只有两行代码,但是第一行内容太多,所以有自动换行:

1. print('This is the first line! xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxx’)
2. print('This is the second line!')

跟踪程序就是单步调试代码,每次一行,就像计算机执行它那样。你可以访问http://invpy. com/hackingtraces,查看本书每个程序的跟踪结果。这个跟踪Web页面对每步跟踪提供注解和有帮助的提醒,解释这个程序在做什么,帮助你更好地理解这些程序为什么可以这样工作。

虽然通过输入这些程序的源代码来学习Python很有帮助,但你可能不小心输入错误导致程序崩溃。输入错误的位置可能无法一眼看出。

你可以复制粘贴你输入的源代码的文本到本书网站的在线比较工具。这个比较工具会显示本书代码和你输入的代码之间的差别。这是找出你的程序的输入错误的一个简单方法。

这个在线比较工具在http://invpy.com/hackingdiff。有一段关于如何使用这个比较工具的视频也可以在本书的网站http://invpy.com/hackingvideos上找到。

复制粘贴文本是一项有用的计算机技能,尤其对于本书而言,因为很多将要加密或解密的文本很长。你可以在本书的网站上找到文本的电子版,然后从你的浏览器复制文本粘贴到IDLE里,而不必手动输入。

要复制粘贴文本,你先在希望复制的文本上拖动鼠标,这会选中文本。接着,你点击编辑\复制菜单项,或者在Windows上按下Ctrl-C(按住Ctrl键,然后按一次C,接着松开Ctrl键)。在Mac上,键盘快捷方式是Command-C(即⌘键)。这会把选中的文本复制到计算机内存,或者说剪贴板。

要粘贴剪贴板上的文本时,把鼠标指针移到你希望插入文本的地方,然后点击编辑\粘贴菜单项,或者Ctrl-V或Command-V。粘贴和手动输入复制到剪贴板的所有字符具有相同的效果。复制粘贴可以为你节约大量输入时间,与输入不同的是,它在产生文本的过程中不会出错。

值得注意的是,每次复制文本到剪贴板,之前在剪贴板上的文本就会消失。

本书网站http://invpy.com/copypaste上有一个关于复制粘贴的教程。

关于编程和密码学还有很多可以学习的,但你不需要现在就把所有的都学了。有时候,你可能了解这些额外的细节和解释,但如果我把它们都放到这本书里,就会增加很大篇幅。出版这么大的一本书会把大量容易着火的纸聚在一起,使之会变成一个火灾隐患。我在本书里包含了“更多信息”链接,你可以通过它们访问本书的网站。你不需要阅读这些额外的信息来理解本书的任何东西,但这些信息可以帮助你学习。这些链接以http://invpy.com开头(这是“Invent with Python”书籍网站的短网址)。

即使本书不是危险的火灾隐患,也请无论如何不要点燃它。

编程和密码学是两个独立的技能,但一起学是很有用的,因为计算机做加密比人更快。比如说,以下是用简单替换密码的方式加密莎士比亚的《罗密欧与朱丽叶》之后的全部文本:

如果你尝试手工加密,每天工作12小时,周末休息,需要大约三周时间才能完成加密。或许你还会犯些错误。然后需要另外的三周时间才能解密这段加密的文本。

你的计算机只需不到两秒就能完全加密或解密整部戏剧。

但你需要知道如何进行计算机编程才能加密。这就是本书的目的了。如果你会计算机编程,你也可以破译别人加密并试图保密的密文。学习计算机编程,学习成为一名黑客。

让我们开始吧!


相关图书

深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
动手学自然语言处理
动手学自然语言处理
Web应用安全
Web应用安全
Python高性能编程(第2版)
Python高性能编程(第2版)
图像处理与计算机视觉实践——基于OpenCV和Python
图像处理与计算机视觉实践——基于OpenCV和Python
Python数据科学实战
Python数据科学实战

相关文章

相关课程