vigenere 密码 - 不添加正确的值
vigenere cipher - not adding correct values
我想从 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' 等等。我将如何更改代码以匹配我想要的结果,或者我是否必须完全更改它以及如何更改我开始这样做了。
试试这个(你错过了 mod 26
部分):
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
).
我想从 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' 等等。我将如何更改代码以匹配我想要的结果,或者我是否必须完全更改它以及如何更改我开始这样做了。
试试这个(你错过了 mod 26
部分):
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
).