在学校,我们正在使用python创建一个Caeser Cipher和一个Keyword Cipher。我需要帮助关键字密码的某些部分,主要是重复一个单词以匹配已输入的字符串的长度,例如:
输入字符串:您好我是Jacob 键:再见打印文字:byebyebyebyeb
我对Python很好,但对我来说这很难。目前这是我得到的:
def repeat_to_length(key, Input):
return (key * ((ord(Input)/len(key))+1))[:ord(Input)]
因为它是一个字符串,我想如果我使用ord它会将它变成一个数字,但我意识到使用ord命令时你只能有一个字符,因为我意识到我反复得到这个错误:
TypeError: ord() expected a character, but string of length 16 found
我发现了一些使用关键字密码的代码,但我不确定我尝试编写代码的过程是哪一部分:
def createVigenereSquare():
start = ord('a')
end = start + 26
index = start
sq = [''] * 256
for i in range(start, end):
row = [''] * 256
for j in range(start, end):
if index > (end - 1):
index = start
row[j] = chr(index)
index += 1
sq[i] = row
index = i + 1
return sq
def createKey(message, keyword):
n = 0
key = ""
for i in range(0, len(message)):
if n >= len(keyword):
n = 0
key += keyword[n]
n += 1
return key
def createCipherText(message, key):
vsquare = createVigenereSquare()
cipher = ""
for i in range(0, len(key)):
cipher += vsquare[ord(key[i])][ord(message[i])]
return cipher
message = str(input("Please input a message using lowercase letters: "))
keyword = str(input("Please input a single word with lowercase letters: "))
key = createKey(message, keyword)
ciphertext = createCipherText(message, key)
print ("Message: " + message)
print ("Keyword: " + keyword)
print ("Key: " + key)
print ("Ciphertext: " + ciphertext)
正如我所说,我只对Python很好,所以我不能真正理解上面代码中的所有代码,我真的希望能够自己编写大部分代码。 到目前为止,这是我的代码:
def getMode():
while True:
print("Enter encrypt, e, decrypt or d")
mode = input('Do you want to encrypt the message or decrypt? ') #changes whether the code encrypts or decrypts message
if mode in 'encrypt e decrypt d ENCRYPT E DECRYPT D'.split(): #defines the various inputs that are valid
return mode
else:
print('Enter either "encrypt" or "e" or "decrypt" or "d".') #restarts this string of code if the input the user enters is invalid
Input = input('Enter your message: ')
key = input('Enter the one word key: ')
def repeat_to_length(key, Input):
return (key * ((ord(Input)/len(key))+1))[:ord(Input)]
encryptedKey = repeat_to_length(key, Input)
print(encryptedKey)
我知道我已经啰嗦了但是如果有人能提供关于这个主题的任何信息,比如解释关键字密码的代码,或者只是回答我的问题,我将不胜感激!
AnimeDeamon
答案 0 :(得分:0)
简单的单行可能是
''.join(key[i % len(key)] for i in range(len(message)))
它做了什么,从里到外:
message
%
运算符)取除除法后的余数并从密钥中获取相应的字母join
方法)示例:
>>> message = "Hello I am Jacob"
>>> key = "bye"
>>> print ''.join(key[i % len(key)] for i in range(len(message)))
byebyebyebyebyeb
答案 1 :(得分:0)
另一种可能性是重复键足以获得至少与消息一样长的字符串,然后从头开始抓取任意数量的字符:
>>> message='Hello I am Jacob'
>>> key='bye'
>>> times=len(message)//len(key)+1
>>> print((times*key)[:len(message)])
byebyebyebyebyeb
我们通过将消息的长度除以字符串的长度来计算times
,但我们必须添加1,因为任何余数都将被删除。 times*key
仅key
次重复times
次。这可能比我们想要的要长,所以我们只选择第一个len(message)
个字符。