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 - 不给信[关闭]的主要内容,如果未能解决你的问题,请参考以下文章