0

我目前正在做一个加密项目,我在我的程序中正确地实现了一个剖腹产功能,但我需要实现另一种加密方法。

说明:我们将使用一个名为 Pseudo-random offset 的修改版本。我们不需要预先分发小册子,只需要一个密码,而且这些密码更短,不需要写下来。然后使用该密码来播种 python 随机数生成器,如上所述。您应该从 Caesarian 代码开始,但不要在函数开头创建一个偏移量,而是为每个字符创建一个新偏移量。

以下是我的剖腹产代码。任何人都可以为代码中的一个字符提供一个示例,以便我可以了解正在发生的事情吗?我是 python 新手,还在学习。

def Caesarian(fin, fout, encrypt_or_decrypt_choice, alphabet):
    # Determine the offset by generating a random number in the correct range.
    # This will be the same random number, if the password sent to random.seed is the same.
    offset = random.randrange(1,len(alphabet))
    if encrypt_or_decrypt_choice=='d':
        offset = -offset
    print "Using the secret offset of", offset

    # Read every line of the input file.
    for line1 in fin:
        # Alter each character of the line1, putting the result into line2.
        line2 = ""
        for c in line1:
            if c in alphabet:
                pos1 = alphabet.find(c)
                pos2 = (pos1+offset)%len(alphabet)
                line2 += alphabet[pos2]
        # Write each resulting line2 to the output file.
        fout.write(line2)
4

1 回答 1

3

在停止密码中,您将每个字符移动一个恒定的固定量。

Vigenère 密码是对它的改进,它通过将一个小组中的每个字母移动一个固定的数量。例如,一个密钥123可能意味着“移动一,然后移动二,然后移动三,然后重复”,因此消息“aaaaaa”将被加密为“bcdbcd”。

Vigenère 密码与 Ceaser 密码有共同的弱点 - 可以计算最常见字母模式的统计数据,并使用它们来优化对密钥的暴力搜索。

您正在构建的内容稍微复杂一些 - 一个简单的流密码。这里的目标是以不同的数量加密每个字符 - 所以它几乎是一次性的,但没有传输非常大的密钥的开销。

现在看一下 Python 的random模块:

>>> import random
>>> random.choice(range(100))
42
>>> random.choice(range(100))
46
>>> random.choice(range(100))
92

如您所见,每个值都是不同的。如果我们要重新运行 Python,我们会得到一系列不同的数字。如果这些数字真的是随机的,那么它们对于这种加密方法将毫无用处,因为接收者将无法重新创建相同的流。

播种伪随机数生成器允许我们修复初始状态,以便结果是可预测的:

>>> random.seed(5)
>>> random.choice(range(100))
62
>>> random.choice(range(100))
74

现在,如果我重新播种,我们将得到相同的确切数字:

>>> random.seed(5)
>>> random.choice(range(100))
62
>>> random.choice(range(100))
74

要迁移原始代码,您需要将初始计算更改offset为设置种子,然后更新每个字符的偏移量。

(这是我更新粘贴代码的尝试):

def streamCipher(fin, fout, encrypt_or_decrypt_choice, alphabet, seed):
    # Seed random with the shared secret
    random.seed(seed)

    # Read every line of the input file.
    for line1 in fin:
        # Alter each character of the line1, putting the result into line2.
        line2 = ""
        for c in line1:
            if c in alphabet:
                # Determine the offset by generating a random number in the correct range.
                # This will return the same sequence of random numbers, if the seed is the same.
                offset = random.randrange(1,len(alphabet))
                if encrypt_or_decrypt_choice=='d':
                    offset = -offset
                pos1 = alphabet.find(c)
                pos2 = (pos1+offset)%len(alphabet)
                line2 += alphabet[pos2]
        # Write each resulting line2 to the output file.
        fout.write(line2)
于 2013-03-25T20:22:51.167 回答