Vigenere Cipher - 不给信[关闭]

Posted

技术标签:

【中文标题】Vigenere Cipher - 不给信[关闭]【英文标题】:Vigenere Cipher - Not giving letters [closed] 【发布时间】:2016-05-11 17:02:04 【问题描述】:

我正在尝试在 python 中制作 Vigenere 密码。我在互联网上找到了一些我打算解决的代码,因为它很难。当我运行这段代码时:

plaintext = "HELLO WORLD"
keyword = "KEYKEYKEYKEY"
encoded = ""

for c in range(len(plaintext)):
    char = ord(plaintext[c])
    temp = ord(keyword[c])
    newchar = char + temp
    if newchar > ord("Z"):
        newchar -= 26
    newnewchar = chr(newchar)
    encoded += newnewchar

print(repr(encoded))

它打印出这个:

'yp\x8bz_\x88z\x91o'

我只期待英文字母。知道有什么问题吗?

【问题讨论】:

我已经编辑了您的问题和代码,以便人们可以快速查看他们需要知道的内容,而不必打开 pastebin 链接、将代码复制到他们的计算机、运行它并输入可能或者可能无法重现问题。我还删除了正在运行的代码部分,以便阅读更少。请注意:这是在 *** 上提问的方法。想象一下现在对读者来说是多么容易。 【参考方案1】:

试用 PyCharm,并学习使用调试器。在其中运行您的代码很容易发现问题:

(突出显示的行是代码当前所在的位置,因此是newchar == 121 == 72 + 75 - 26

即使没有 PyCharm,教训是当您需要找出代码中的问题时,请找到一种方法来查看每个阶段的值是什么来测试您的假设。最简单的方法是在任何地方插入print(...)

【讨论】:

正如我老师所说,每当你求助调试时,“先添加打印语句,寻找没有意义的东西。如果仍然找不到问题,那就来我”【参考方案2】:

更 Python 的方式是使用列表推导;

plaintext = 'THISISAPLAINTEXT'
key = 'SPAMEGGS'
count = int(len(plaintext)/len(key))+1

stretchedkey = [ord(c) for c in key*count]

# Encryption
plainnum = [ord(c) for c in plaintext]
ciphernum = [a+b-65 for a, b in zip(plainnum, stretchedkey)]
ciphertext = ''.join([chr(c) if c <= 90 else chr(c-26) for c in ciphernum])

# Decryption
ciphernum = [ord(c) for c in ciphertext]
decryptnum = [a-b+65 for a, b in zip(ciphernum, stretchedkey)]
decrypt = ''.join([chr(c) if c >= 65 else chr(c+26) for c in decryptnum])

显示 IPython 中的步骤;

In [1]: plaintext = 'THISISAPLAINTEXT'

In [2]: key = 'SPAMEGGS'

In [3]: count = int(len(plaintext)/len(key))+1

In [4]: stretchedkey = [ord(c) for c in key*count]

In [5]: plainnum = [ord(c) for c in plaintext]

In [6]: plainnum
Out[6]: [84, 72, 73, 83, 73, 83, 65, 80, 76, 65, 73, 78, 84, 69, 88, 84]

In [7]: ciphernum = [a+b-65 for a, b in zip(plainnum, stretchedkey)]

In [8]: ciphernum
Out[8]: [102, 87, 73, 95, 77, 89, 71, 98, 94, 80, 73, 90, 88, 75, 94, 102]

In [9]: ciphertext = ''.join([chr(c) if c <= 90 else chr(c-26) for c in ciphernum])

In [10]: ciphertext
Out[10]: 'LWIEMYGHDPIZXKDL'

In [11]: ciphernum = [ord(c) for c in ciphertext]

In [12]: decryptnum = [a-b+65 for a, b in zip(ciphernum, stretchedkey)]

In [13]: decryptnum
Out[13]: [58, 72, 73, 57, 73, 83, 65, 54, 50, 65, 73, 78, 84, 69, 62, 58]

In [14]: decrypt = ''.join([chr(c) if c >= 65 else chr(c+26) for c in decryptnum])

In [15]: decrypt
Out[15]: 'THISISAPLAINTEXT'

【讨论】:

以上是关于Vigenere Cipher - 不给信[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Vigenere Cipher - 解密(手动)

Vigenere Cipher - 解密(手动)

PSET 2:Vigenere Cipher 部分工作?

Vigenere Cipher使用命令行提示

Vigenere Cipher 没有错误消息 Python

vigenere cipher - 不添加正确的值