Skip to content

Commit fc2fd56

Browse files
committed
2023-04-10 18:08:20
1 parent 50a9915 commit fc2fd56

File tree

6 files changed

+33
-33
lines changed

6 files changed

+33
-33
lines changed

docs/cracking/06.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ Traceback (most recent call last):
101101
ImportError: No module named pyperclip
102102
```
103103

104-
如果是这样,你可能没有将`pyperclip.py`模块下载到正确的文件夹中。如果您确认`pyperclip.py`在带有`caesarCipher.py`的文件夹中,但仍然无法让模块工作,只需在`caesarCipher.py`程序的第 4 行和第 45 行代码(其中有文本`pyperclip`)前面加上一个`#`就可以了。这使得 Python 忽略了依赖于`pyperclip.py`模块的代码,允许程序成功运行。请注意,如果您注释掉该代码,加密或解密的文本不会在程序结束时复制到剪贴板。你也可以在以后的章节中注释掉程序中的`pyperclip`代码,这也将从那些程序中移除复制到剪贴板的功能。
104+
如果是这样,你可能没有将`pyperclip.py`模块下载到正确的文件夹中。如果您确认`pyperclip.py`在带有`caesarCipher.py`的文件夹中,但仍然无法让模块工作,只需在`caesarCipher.py`程序的第 4 行和第 45 行代码(其中有文本`pyperclip`前面加上一个`#`就可以了。这使得 Python 忽略了依赖于`pyperclip.py`模块的代码,允许程序成功运行。请注意,如果您注释掉该代码,加密或解密的文本不会在程序结束时复制到剪贴板。你也可以在以后的章节中注释掉程序中的`pyperclip`代码,这也将从那些程序中移除复制到剪贴板的功能。
105105

106106
要解密消息,只需将输出文本作为新值粘贴到第 7 行的`message`变量中。然后修改第 13 行的赋值语句,将字符串`'decrypt'`存储在变量`mode`中:
107107

@@ -191,7 +191,7 @@ for symbol in message:
191191

192192
*图 5-1:`for`循环语句的六个部分*
193193

194-
每次程序执行循环时(也就是说,在循环的每次迭代中),`for`语句中的变量(在第 21 行中是`symbol`)取包含字符串的变量中的下一个字符的值(在本例中是`message`)`for`语句类似于赋值语句,因为变量被创建并赋值,除了`for`语句循环不同的值来给变量赋值之外。
194+
每次程序执行循环时(也就是说,在循环的每次迭代中),`for`语句中的变量(在第 21 行中是`symbol`取包含字符串的变量中的下一个字符的值(在本例中是`message``for`语句类似于赋值语句,因为变量被创建并赋值,除了`for`语句循环不同的值来给变量赋值之外。
195195

196196
#### 一个for循环的例子
197197

@@ -240,7 +240,7 @@ The letter is y
240240
    if symbol in SYMBOLS:
241241
```
242242

243-
你可以把一个`if`语句理解为,“如果这个条件是`True`,执行下面块中的代码。否则,如果是`False`,跳过这个代码块。”一个`if`语句的格式是使用关键字`if`后跟一个条件,再跟一个冒号(`:`)。与循环一样,要执行的代码缩进在一个块中。
243+
你可以把一个`if`语句理解为,“如果这个条件是`True`,执行下面块中的代码。否则,如果是`False`,跳过这个代码块。”一个`if`语句的格式是使用关键字`if`后跟一个条件,再跟一个冒号(`:`。与循环一样,要执行的代码缩进在一个块中。
244244

245245
#### 一个if 语句的案例
246246

@@ -260,7 +260,7 @@ The letter is y
260260

261261
#### else语句
262262

263-
通常,我们想要测试一个条件,如果条件是`True`就执行一段代码,如果条件是`False`就执行另一段代码。我们可以在`if`语句块后使用`else`语句,如果`if`语句的条件为`False`,则`else`语句的代码块将被执行。对于一个`else`语句,您只需编写关键字`else`和一个冒号(`:`)。它不需要条件,因为如果`if`语句的条件不为真,它就会运行。您可以将代码读作“如果这个条件是`True`,则执行这个块,否则,如果是`False`,则执行另一个块。”
263+
通常,我们想要测试一个条件,如果条件是`True`就执行一段代码,如果条件是`False`就执行另一段代码。我们可以在`if`语句块后使用`else`语句,如果`if`语句的条件为`False`,则`else`语句的代码块将被执行。对于一个`else`语句,您只需编写关键字`else`和一个冒号(`:`。它不需要条件,因为如果`if`语句的条件不为真,它就会运行。您可以将代码读作“如果这个条件是`True`,则执行这个块,否则,如果是`False`,则执行另一个块。”
264264

265265
修改`checkPw.py`程序,如下所示(新行以粗体显示):
266266

@@ -280,7 +280,7 @@ The letter is y
280280

281281
#### elif 语句
282282

283-
另一个语句叫做`elif`语句,也可以和`if`成对出现。就像一个`if`语句,它有一个条件。像一个`else`语句一样,它跟随一个`if`(或另一个`elif`)语句,如果前一个`if`(或`elif`)语句的条件为`False`,则执行该语句。您可以将`if``elif``else`语句理解为“如果这个条件是`True`,运行这个块。否则,检查该下一个条件是否为`True`。否则,就跑完这最后一个代码块。”任意数量的`elif`语句可以跟在`if`语句之后。再次修改`checkPw.py`程序,使其看起来如下:
283+
另一个语句叫做`elif`语句,也可以和`if`成对出现。就像一个`if`语句,它有一个条件。像一个`else`语句一样,它跟随一个`if`(或另一个`elif`语句,如果前一个`if`(或`elif`语句的条件为`False`,则执行该语句。您可以将`if``elif``else`语句理解为“如果这个条件是`True`,运行这个块。否则,检查该下一个条件是否为`True`。否则,就跑完这最后一个代码块。”任意数量的`elif`语句可以跟在`if`语句之后。再次修改`checkPw.py`程序,使其看起来如下:
284284

285285
`checkPw.py`
286286

@@ -300,7 +300,7 @@ The letter is y
300300

301301
该代码包含四个模块,分别用于`if``elif``else`语句。如果用户输入`12345`,则`typedPassword == 'swordfish'`的计算结果为`False` ➊,因此跳过第一个带有`print('Access Granted')` ➋ 的块。接下来执行检查`typedPassword == 'mary'`条件,该条件也评估为`False` ➌,因此第二个块也被跳过。`typedPassword == '12345'`条件是`True` ➍,因此执行进入该`elif`语句之后的块以运行代码`print('That is a really obvious password.')`并跳过任何剩余的`elif``else`语句。注意,这些程序块中有且只有一个会被执行。
302302

303-
在一个`if`语句之后可以有零个或多个`elif`语句。您可以有零个或一个但不是多个`else`语句,并且`else`语句总是最后一个,因为它只在没有一个条件评估为`True`时执行。具有`True`条件的第一条语句执行其块。其余的条件(即使它们也是`True`)没有被检查。
303+
在一个`if`语句之后可以有零个或多个`elif`语句。您可以有零个或一个但不是多个`else`语句,并且`else`语句总是最后一个,因为它只在没有一个条件评估为`True`时执行。具有`True`条件的第一条语句执行其块。其余的条件(即使它们也是`True`没有被检查。
304304

305305
### in 和 not in 运算符
306306

@@ -331,7 +331,7 @@ The letter is y
331331

332332
返回到`caesarCipher.py`,第 23 行检查`symbol`中的字符串(第 21 行的`for`循环将其设置为来自`message`字符串的单个字符)是否在`SYMBOLS`字符串中(该密码程序可以加密或解密的所有字符的符号集)。如果`symbol``SYMBOLS`中,执行进入从第 24 行开始的下一个程序块。如果不是,执行将跳过这个块,转而进入第 39 行的`else`语句后面的块。根据符号是否在符号集中,密码程序需要运行不同的代码。
333333

334-
### find()字符串方法
334+
### `find()`字符串方法
335335

336336
第 24 行找到了`SYMBOLS`字符串中的索引,其中`symbol`是:
337337

docs/cracking/07.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ SYMBOLS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz12345
109109

110110
`SYMBOLS`的值需要与我们试图破解的加密密文的凯撒密码程序中使用的`SYMBOLS`的值相同;否则破解程序无法运行。注意,字符串值中的`0``!`之间有一个空格。
111111

112-
### range()函数循环
112+
### `range()`函数循环
113113

114114
第 8 行是一个`for`循环,它不遍历字符串值,而是遍历对`range()`函数调用的返回值:
115115

@@ -161,7 +161,7 @@ Hello
161161
5
162162
```
163163

164-
变量`i`将取从`2`(包括`2`)`6`(不包括`6)`)的值。
164+
变量`i`将取从`2`(包括`2``6`(不包括`6)`的值。
165165

166166
### 解密消息
167167

@@ -224,7 +224,7 @@ for key in range(len(SYMBOLS)):
224224
    print('Key #%s: %s' % (key, translated))
225225
```
226226

227-
`print()`函数调用的参数是一个使用*字符串格式化*(也称为*字符串插值*)的字符串值。使用`%s`文本的字符串格式将一个字符串放在另一个字符串中。字符串中的第一个`%s`被字符串末尾括号中的第一个值替换。
227+
`print()`函数调用的参数是一个使用*字符串格式化*(也称为*字符串插值*的字符串值。使用`%s`文本的字符串格式将一个字符串放在另一个字符串中。字符串中的第一个`%s`被字符串末尾括号中的第一个值替换。
228228

229229
在交互式 shell 中输入以下内容:
230230

docs/cracking/08.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,17 +87,17 @@
8787

8888
*图 7-4:给每个盒子加上索引号,从 0 开始。*
8989

90-
这些方框显示第一列具有索引`0``8``16``24`处的字符(它们是`'C'``'e'``'n'``'o'`)。下一列具有索引`1``9``17``25`处的字符(它们是`'o'``'n'``'o'``'m'`)。注意出现的模式:第`n`列包含字符串中索引为 0+(`n`–1)、8+(`n`–1)、16+(`n`–1)、24+(`n`–1)的所有字符,如图 7-5 所示。
90+
这些方框显示第一列具有索引`0``8``16``24`处的字符(它们是`'C'``'e'``'n'``'o'`。下一列具有索引`1``9``17``25`处的字符(它们是`'o'``'n'``'o'``'m'`。注意出现的模式:第`n`列包含字符串中索引为`0 + (n – 1)``8 + (n – 1)``16 + (n – 1)``24 + (n – 1)`的所有字符,如图 7-5 所示。
9191

9292
![Images](img/5e60db99cd44e2c323995bdb13dc7deb.png)
9393

9494
*图 7-5:每个盒子的索引遵循一个可预测的模式。*
9595

96-
第 7 列和第 8 列的最后一行有一个例外,因为 24+(7–1)24+(8–1)将大于 29,这是字符串中最大的索引。在这些情况下,你只需将 0、8 和 16 加到`n` (并跳过 24)
96+
第 7 列和第 8 列的最后一行有一个例外,因为`24+(7–1)``24+(8–1)`将大于 29,这是字符串中最大的索引。在这些情况下,你只需将 0、8 和 16 加到`n` (并跳过 24
9797

98-
数字 0、8、16 和 24 有什么特别的?这些是从 0 开始添加密钥(在本例中是 8)时得到的数字。所以,0 + 8 是 8,8 + 8 是 16,16 + 8 是 24。24 + 8 的结果将是 32,但是因为 32 比消息的长度大,所以您将在 24 处停止。
98+
数字 0、8、16 和 24 有什么特别的?这些是从 0 开始添加密钥(在本例中是 8时得到的数字。所以,0 + 8 是 8,8 + 8 是 16,16 + 8 是 24。24 + 8 的结果将是 32,但是因为 32 比消息的长度大,所以您将在 24 处停止。
9999

100-
对于第`n`列的字符串,从索引(`n`–1)开始,继续加 8(键)得到下一个索引。只要索引小于 30(消息长度),就一直加 8,此时移到下一列。
100+
对于第`n`列的字符串,从索引(`n–1`开始,继续加 8(键)得到下一个索引。只要索引小于 30(消息长度),就一直加 8,此时移到下一列。
101101

102102
如果您将每一列想象成一个字符串,那么结果将是一个包含八个字符串的列表,如下所示:`'Ceno'``'onom'``'mstm'``'me o'``'o sn'``'nio.'``' s '``'s c'`。如果您按顺序将字符串连接在一起,结果将是密文:`'Cenoonommstmme oo snnio. s s c'`。在这一章的后面,你会学到一个叫做*列表*的概念,它会让你做到这一点。
103103

@@ -164,7 +164,7 @@ if __name__ == '__main__':
164164
Cenoonommstmme oo snnio. s s c|
165165
```
166166

167-
竖线字符(`|`)标记密文的结尾,以防结尾有空格。这个密文(末尾没有管道字符)也被复制到剪贴板,因此您可以将它粘贴到给某人的电子邮件中。如果您想要加密不同的消息或使用不同的密钥,请更改第 7 行和第 8 行中分配给`myMessage``myKey`变量的值。然后再次运行该程序。
167+
竖线字符(`|`标记密文的结尾,以防结尾有空格。这个密文(末尾没有管道字符)也被复制到剪贴板,因此您可以将它粘贴到给某人的电子邮件中。如果您想要加密不同的消息或使用不同的密钥,请更改第 7 行和第 8 行中分配给`myMessage``myKey`变量的值。然后再次运行该程序。
168168

169169
### 用 def 语句创建自己的函数
170170

@@ -279,7 +279,7 @@ def main():
279279
    pyperclip.copy(ciphertext)
280280
```
281281

282-
该程序在消息的末尾打印一个管道字符(`|`),这样用户就可以看到密文末尾的任何空格字符。
282+
该程序在消息的末尾打印一个管道字符(`|`,这样用户就可以看到密文末尾的任何空格字符。
283283

284284
第 18 行是`main()`功能的最后一行。在它执行之后,程序执行返回到调用它的行之后的行。
285285

@@ -406,7 +406,7 @@ TypeError: 'str' object does not support item assignment
406406

407407
`spam[0]`的值评估为列表`['dog', 'cat']`,它有自己的索引。用于`spam[0][0]`的双索引括号表示我们从第一个列表中取出第一个项目:`spam[0]`计算为`['dog', 'cat']``['dog', 'cat'][0]`计算为`'dog'`
408408

409-
#### 使用 len()和 in 运算符使用列表
409+
#### 使用`len()``in`运算符使用列表
410410

411411
您已经使用了`len()`来表示字符串中的字符数(即字符串的长度)。`len()`函数也作用于列表值,并返回列表中项目数的整数。
412412

@@ -541,7 +541,7 @@ TypeError: 'str' object does not support item assignment
541541

542542
对于每一列,`while`循环遍历原始的`message`变量,并通过将`key`加到`currentIndex`中来挑选出`key`间隔中的字符。在第 27 行上,对于`for`循环的第一次迭代,`currentIndex`被设置为从`0`开始的`column`的值。
543543

544-
如图 7-7 中的所示,`message[currentIndex]``message`第一次迭代的第一个字符。在`message[currentIndex]`T13 的字符被连接到`ciphertext[column]`以在第 33 行开始第一列。第 36 行每次通过循环将`key`(即`8`)中的值添加到`currentIndex`。第一次是`message[0]`,第二次`message[8]`,第三次`message[16]`,第四次`message[24]`
544+
如图 7-7 中的所示,`message[currentIndex]``message`第一次迭代的第一个字符。在`message[currentIndex]`T13 的字符被连接到`ciphertext[column]`以在第 33 行开始第一列。第 36 行每次通过循环将`key`(即`8`中的值添加到`currentIndex`。第一次是`message[0]`,第二次`message[8]`,第三次`message[16]`,第四次`message[24]`
545545

546546
![Images](img/42a30d5cb60371901b1b30d55a9eddb0.png)
547547

@@ -559,7 +559,7 @@ TypeError: 'str' object does not support item assignment
559559

560560
`for`循环完成其余列的循环后,`ciphertext`中的值为`['Ceno',` `'onom',` `'mstm',` `'me o',` `'o sn',` `'nio.',` `' s ',` `'s c']`。有了字符串列的列表后,我们需要将它们连接在一起,形成一个字符串,这就是整个密文:`'Cenoonommstmme oo snnio. s s c'`
561561

562-
### join()字符串方法
562+
### `join()`字符串方法
563563

564564
第 39 行使用了`join()`方法将`ciphertext`的各个列字符串连接成一个字符串。对一个字符串值调用`join()`方法,并获取一个字符串列表。它返回一个字符串,列表中的所有成员都由调用`join()`的字符串连接。(如果您只想将字符串连接在一起,这是一个空白字符串。)在交互式 shell 中输入以下内容:
565565

@@ -634,7 +634,7 @@ if __name__ == '__main__':
634634

635635
当您导入一个 Python 程序时,在程序执行之前,`__name__`变量被设置为文件名的 before 部分。`py`。当`transpositonecrypt.py`程序被导入时,所有的`def`语句都被运行(以定义导入程序想要使用的`encryptMessage()`函数),但是`main()`函数没有被调用,所以`'Common` `sense` `is` `not` `so` `common.'`的带密钥`8`的加密代码没有被执行。
636636

637-
这就是为什么用`myKey`密钥加密`myMessage`字符串的代码在一个函数内部(这个函数按照惯例被命名为`main()`)。当`transpositonecrypt.py`被其他程序导入时`main()`里面的这段代码不会运行,但是这些其他程序仍然可以调用它的`encryptMessage()`函数。这就是函数的代码可以被其他程序重用的方式。
637+
这就是为什么用`myKey`密钥加密`myMessage`字符串的代码在一个函数内部(这个函数按照惯例被命名为`main()`。当`transpositonecrypt.py`被其他程序导入时`main()`里面的这段代码不会运行,但是这些其他程序仍然可以调用它的`encryptMessage()`函数。这就是函数的代码可以被其他程序重用的方式。
638638

639639
> ****
640640
>

0 commit comments

Comments
 (0)