|
79 | 79 | >>> blockInteger = blockInteger + 7 |
80 | 80 | ``` |
81 | 81 |
|
82 | | -然后我们为`'Howdy'`中的第二个字符`'o'`找到符号集索引。因为这是消息的第二个字符,我们将`'o'`的符号集索引乘以 66 <sup class="calibre21">1</sup> 而不是 66 <sup class="calibre21">0</sup> ,然后将其添加到块中: |
| 82 | +然后我们为`'Howdy'`中的第二个字符`'o'`找到符号集索引。因为这是消息的第二个字符,我们将`'o'`的符号集索引乘以`66 ** 1`而不是`66 ** 0`,然后将其添加到块中: |
83 | 83 |
|
84 | 84 | ```py |
85 | 85 | >>> SYMBOLS.index('o') |
@@ -167,7 +167,7 @@ M = C^d mod n |
167 | 167 |
|
168 | 168 | 比如我们把五个字符的字符串`'Howdy'`加密后发给爱丽丝。当转换为整数块时,消息为`[957285919]`(完整的消息适合一个块,所以列表值中只有一个整数)。Alice 的公钥是 64 位,太小了,不安全,但是我们将使用它来简化本例中的输出。其`n`为 116284564958604315258674918142848831759`e`为 13805220545651593223。(对于 1024 位密钥,这些数字会大得多。) |
169 | 169 |
|
170 | | -要加密,我们通过将这些数字传递给 Python 的`pow()`函数,计算(957285919<sup class="calibre21">13805220545651593223</sup>)% 116284564958604315258674918142848831759,就像这样: |
| 170 | +要加密,我们通过将这些数字传递给 Python 的`pow()`函数,计算`(957285919 ** 13805220545651593223) % 116284564958604315258674918142848831759`,就像这样: |
171 | 171 |
|
172 | 172 | ```py |
173 | 173 | >>> pow(957285919, 13805220545651593223, |
@@ -208,7 +208,7 @@ Python 的`pow()`函数使用了一种叫做模幂运算的数学技巧来快速 |
208 | 208 | 'y' |
209 | 209 | ``` |
210 | 210 |
|
211 | | -下一步是将块整数乘以 66 <sup class="calibre21">4</sup> 以获得下一个块整数。计算 957,285,919 % (66 <sup class="calibre21">4</sup> 得到 8,549,119,这恰好是字符串`'Howd'`的块整数值。我们可以用(66 <sup class="calibre21">3</sup> 的底除法来确定这个方块的最后一个字符。为此,请在交互式 shell 中输入以下内容: |
| 211 | +下一步是将块整数乘以`66 ** 4`以获得下一个块整数。计算`957,285,919 % (66 ** 4)`得到 8,549,119,这恰好是字符串`'Howd'`的块整数值。我们可以用`66 ** 3`的底除法来确定这个方块的最后一个字符。为此,请在交互式 shell 中输入以下内容: |
212 | 212 |
|
213 | 213 | ```py |
214 | 214 | >>> blockInteger = 8549119 |
@@ -694,7 +694,7 @@ def getTextFromBlocks(blockInts, messageLength, blockSize): |
694 | 694 | for i in range(blockSize - 1, -1, -1): |
695 | 695 | ``` |
696 | 696 |
|
697 | | -`getTextFromBlocks()`中的代码将每个块整数分割成`blockSize`个整数,每个整数代表一个字符的符号集索引。我们必须反向工作以从`blockInt`中提取符号集索引,因为当我们加密消息时,我们从较小的指数(66 <sup class="calibre21">0</sup> ,66 <sup class="calibre21">1</sup> ,66 <sup class="calibre21">2</sup> 等等)开始,但是当解密时,我们必须首先使用较大的指数进行除法和模运算。这就是为什么第 59 行上的`for`循环从`blockSize - 1`开始,然后在每次迭代中减去`1`,直到(但不包括)`-1`。这意味着最后一次迭代中`i`的值是`0`。 |
| 697 | +`getTextFromBlocks()`中的代码将每个块整数分割成`blockSize`个整数,每个整数代表一个字符的符号集索引。我们必须反向工作以从`blockInt`中提取符号集索引,因为当我们加密消息时,我们从较小的指数(`66 ** 0`,`66 ** 1`,`66 ** 2`等等)开始,但是当解密时,我们必须首先使用较大的指数进行除法和模运算。这就是为什么第 59 行上的`for`循环从`blockSize - 1`开始,然后在每次迭代中减去`1`,直到(但不包括)`-1`。这意味着最后一次迭代中`i`的值是`0`。 |
698 | 698 |
|
699 | 699 | 在我们将符号集索引转换为字符之前,我们需要确保解码的块没有超过`message`的长度。为此,我们检查到目前为止已经从块中翻译出来的字符数`len(message) + i`,仍然少于第 60 行的`messageLength`。 |
700 | 700 |
|
|
0 commit comments