首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Vignere密码解密函数不返回正确的解密python 2.7

Vignere密码解密函数不返回正确的解密python 2.7
EN

Stack Overflow用户
提问于 2017-03-29 16:16:35
回答 1查看 124关注 0票数 0

我为Vignere密码设计了一个加密器和解密器。加密器工作它把“鹰着陆”变成"WHZ RCOOE PNU OAILRF“。但是,当我试图使用DAVINCI解密"WHZ RCOOE PNU OAILRF“时,它不会返回鹰已经着陆的信息。相反,它返回一个随机混乱的“朱EEWREXAWRADTEH”。是decryptVignere中的问题,还是以前的函数?我知道encryptVignere工作得很好。

代码语言:javascript
复制
"""
This program will decrypt/encrypt a Vignere with the Keyword: DaVinci
"""

# helper functions
# letter to index
def letterToIndex(ch):
   alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "
   idx = alphabet.find(ch)
   if idx < 0:
      print ("error: letter not in the alphabet", ch)
   return idx

# index to letter
def indexToLetter(idx):
   alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "
   if idx > 25:
      print ('error: ', idx, ' is too large')
      letter = ' '
   elif idx < 0:
      print ('error: ', idx, ' is less than 0')
      letter = ' '
   else:
      letter = alphabet[idx]
   return letter

# looking up a letter in the Vignere square
def vignereIndex(keyLetter, plainTextLetter):
   keyIndex = letterToIndex(keyLetter)
   ptIndex = letterToIndex(plainTextLetter)
   newIdx = (ptIndex + keyIndex) % 26
   return indexToLetter(newIdx)

def decryptVignere(key, cipherText):
   plainText = ""
   keyLen = len(key)
   for i in range (len(cipherText)):
      ch = cipherText[i]
      if ch == ' ':
         plainText = plainText + ch
      else:
         plainText = plainText + vignereIndex(key[i%keyLen], ch)
   return plainText

#encrypting a message using the Vignere cipher
def encryptVignere(key, plainText):
   cipherText = ""
   keyLen = len(key)
   for i in range (len(plainText)):
      ch = plainText[i]
      if ch == ' ':
         cipherText = cipherText + ch
      else:
         cipherText = cipherText + vignereIndex(key[i%keyLen], ch)
   return cipherText

# decrypt
messageOne = "WHZ RCOOE PNU OAILRF" # raw_input("Enter your string: ")?
keyOne = "DAVINCI"

deStr = decryptVignere(keyOne, messageOne)
print deStr 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-29 16:24:03

您的解密方法与您的加密方法完全相同!解密方法应该执行相反的操作,即减去密钥而不是添加密钥。

一种可能的解决方案是向vignereIndex方法中添加一个参数,以在加密和解密之间切换。

代码语言:javascript
复制
def vignereIndex(keyLetter, plainTextLetter, encrypt):
    keyIndex = letterToIndex(keyLetter)
    ptIndex = letterToIndex(plainTextLetter)
    if not encrypt:
        keyIndex *= -1
    newIdx = (ptIndex + keyIndex) % 26
    return indexToLetter(newIdx)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43098919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档