vigenere cipher - 不添加正确的值

Posted

技术标签:

【中文标题】vigenere cipher - 不添加正确的值【英文标题】:vigenere cipher - not adding correct values 【发布时间】:2015-07-09 20:20:22 【问题描述】:

我想从 for 循环中获取特定值以添加到另一个字符串以创建 vigenere 密码。

这是代码。

userinput = input('enter message')
keyword = input('enter keyword')
new = ''
for a in keyword:
   pass
for i in (ord(x) for x in userinput): 
    if 96 < i < 123: #lowercase
        new += chr(97 + (i+ord(a)-97)#keeps all values in alphabet
print(new)

所以如果我将“abcd”作为我的消息并将“ab”作为我的关键字,那么我想要的答案是“bddf”,因为“a”+“a”是“b”而“b”+“b” ' = 'd' 等等。我将如何更改代码以匹配我想要的结果,或者我是否必须完全更改它以及我将如何去做。

【问题讨论】:

***.com/questions/tagged/vigenere+python 【参考方案1】:

试试这个(你错过了mod 26-part):

from itertools import cycle

plaintext = input('enter message: ')
keyword = input('enter keyword: ')

def chr_to_int(char):
    return 0 if char == 'z' else ord(char)-96
def int_to_chr(integer):
    return 'z' if integer == 0 else chr(integer+96)
def add_chars(a, b):
    return int_to_chr(( chr_to_int(a) + chr_to_int(b) ) % 26 )

def vigenere(plaintext, keyword):
    keystream = cycle(keyword)
    ciphertext = ''
    for pln, key in zip(plaintext, keystream):
        ciphertext += add_chars(pln, key)
    return ciphertext

ciphertext = vigenere(plaintext, keyword)
print(ciphertext)

如果你喜欢列表推导式,你也可以写

def vigenere(plaintext, keyword):
    keystream = cycle(keyword)
    return ''.join(add_chars(pln, key)
                    for pln, key in zip(plaintext, keystream))

更新

根据a+a=b的愿望更新了。请注意,z 在这种情况下是添加的中性元素 (z+char=z)。

【讨论】:

当我将 97 更改为 96 时,它可以完美运行。请您添加 cmets 已更新。感谢您的纠正。并注意z 的特殊情况。

以上是关于vigenere cipher - 不添加正确的值的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 的 Vigenere Cipher 存在输出问题

Vigenere Cipher - 解密(手动)

Vigenere Cipher - 莫名其妙的细微差别

Java 中的 Vigenere/Polyalphabetic Cipher Decoder/Decrypter/Breaker

Vigenere-cipher 错误输出

Vigenere Cipher - 解密(手动)