重复一个单词以匹配字符串的长度
Repeating a word to match the length of a string
在学校,我们目前正在使用 python 创建凯撒密码和关键字密码。我需要关键字密码的某些部分的帮助,主要是重复一个单词以匹配已输入的字符串的长度,例如:
输入的字符串:你好,我是 Jacob Key:再见打印文本: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)
我知道我已经啰嗦了很久,但如果有人能提供关于这个主题的任何信息,比如解释关键字密码的代码,或者只是回答我的问题,我将不胜感激!
动漫守护者
一个简单的单线可以是
''.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
另一种可能性是重复密钥足够多次以获得至少与消息一样长的字符串,然后从头开始抓取尽可能多的字符:
>>> 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)
个字符。
在学校,我们目前正在使用 python 创建凯撒密码和关键字密码。我需要关键字密码的某些部分的帮助,主要是重复一个单词以匹配已输入的字符串的长度,例如:
输入的字符串:你好,我是 Jacob Key:再见打印文本: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)
我知道我已经啰嗦了很久,但如果有人能提供关于这个主题的任何信息,比如解释关键字密码的代码,或者只是回答我的问题,我将不胜感激!
动漫守护者
一个简单的单线可以是
''.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
另一种可能性是重复密钥足够多次以获得至少与消息一样长的字符串,然后从头开始抓取尽可能多的字符:
>>> 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)
个字符。