重复一个单词以匹配字符串的长度

时间:2015-10-16 13:20:15

标签: python string encryption ordinal vigenere

在学校,我们正在使用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

2 个答案:

答案 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*keykey次重复times次。这可能比我们想要的要长,所以我们只选择第一个len(message)个字符。