凯撒密码不正确旋转字母? (Python)

问题描述:

我曾尝试为我在学校的首个Python项目制作凯撒密码。我有点从主密码段的YouTube视频中复制出代码,但是当我加密用户键入的消息时,它会执行随机密码,而不是输入到shell中的密钥。这是代码:凯撒密码不正确旋转字母? (Python)

abc = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz' 

def main(): 
    message = input("What's the message to encrypt/decrypt? ") 
    key = int(input("What number would you like for your key value? ")) 
    choice = input("Choose: encrypt or decrypt. ") 
    if choice == "encrypt": 
     encrypt(message, key) 
    elif choice == "decrypt": 
     encrypt(message, key * (-1)) 
    else: 
     print("Bad answer, try again.") 

def encrypt(message, key): 
    cipherText = "" 
    for letter in message: 
     if letter in abc: 
      newPosition = (abc.find(letter) + key) % 26 
      cipherText += abc[newPosition] 
     else: 
      cipherText += letter 
    print(cipherText) 
    return cipherText 

main() 

有人可以帮我解决这个问题,请。另外请不要让它变得非常复杂,因为我是Python的初学者,而且我一点都不了解。

谢谢!

+0

看看[ask] – pvg

+0

你没有将'key'或'message'传递给'encrypt'方法。 – KDecker

+0

'encrypt'方法有两个参数。 – GAVD

的问题主要论点是,你在交织字符集大写和小写字母。所以当你试图用角色替换一个角色,比如说前面5个角色时,你实际上是在翻转角色并提前2-3个角色(取决于你开始的情况)。实现这一点有更好的方法,但事实证明,一个简单的变化可以使你的代码按预期方式工作:

newPosition = (abc.find(letter) + key * 2) % 52 

如果您双击,当你发现你的替换字符的关键,那么你会被跳过两字符集中的大写和小写字母。而且由于你的加倍钥匙将永远是平衡的,你最终会得到同样的情况。您还需要按照R.Sharp指出的方式将模数相应更改为52。

+0

谢谢,这解决了我的问题!并感谢所有人帮助我!我不知道这是一个明显的解决方案哈哈! – Kieran

abc = 'AaBbCcDdEeFfGgHhIiJjKKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz' 

def main(): 
    message = input("What's the message to encrypt/decrypt? ") 
    key = int(input("What number would you like for your key value? ")) 
    choice = input("Choose: encrypt or decrypt. ") 
    if choice == "encrypt": 
     encrypt(message, key) 
    elif choice == "decrypt": 
     encrypt(message, key * (-1)) 
    else: 
     print("Bad answer, try again.") 

def encrypt(message, key): 
    cipherText = "" 
    for letter in message: 
     if letter in abc: 
      newPosition = (abc.find(letter) + key) % 26 
      cipherText += abc[newPosition] 
     else: 
      cipherText += letter 
    print(cipherText) 
    return cipherText 

main() 

失踪的消息,在加密

+0

是的,对不起。我已经在事先请求中解决了这个问题。只是忘了添加。即使有2个参数后,它不起作用:/ – Kieran

虽然我同意@glibdud,但还有一个错误。 您正在模拟26键的值+位置abc。 但abc是52个字符长 - 这样才能够解密你加密的东西,你需要改变,要newPosition = (abc.find(letter) + key) % 52

如果你想加密串更加随心所欲,说包括一些标点符号或数字字符,替代26或52与计算出的加密字符串的长度进行比较。

+0

非常感谢您的帮助!没有意识到答案基本上在我面前这一整天xd。 – Kieran

(abc.find(letter) + key) % 26 

因为abc既有大写也有小写混合。应用于字符“C”的键(例如:2)将导致“D”而不是“E”。

+0

谢谢,在上面的评论中,它说'键* 2)%52'这是有效的。所以通过添加'* 2'解决了问题:D – Kieran