凯撒密码不正确旋转字母? (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的初学者,而且我一点都不了解。
谢谢!
的问题主要论点是,你在交织字符集大写和小写字母。所以当你试图用角色替换一个角色,比如说前面5个角色时,你实际上是在翻转角色并提前2-3个角色(取决于你开始的情况)。实现这一点有更好的方法,但事实证明,一个简单的变化可以使你的代码按预期方式工作:
newPosition = (abc.find(letter) + key * 2) % 52
如果您双击,当你发现你的替换字符的关键,那么你会被跳过两字符集中的大写和小写字母。而且由于你的加倍钥匙将永远是平衡的,你最终会得到同样的情况。您还需要按照R.Sharp指出的方式将模数相应更改为52。
谢谢,这解决了我的问题!并感谢所有人帮助我!我不知道这是一个明显的解决方案哈哈! – 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()
失踪的消息,在加密
是的,对不起。我已经在事先请求中解决了这个问题。只是忘了添加。即使有2个参数后,它不起作用:/ – Kieran
虽然我同意@glibdud,但还有一个错误。 您正在模拟26键的值+位置abc
。 但abc
是52个字符长 - 这样才能够解密你加密的东西,你需要改变,要newPosition = (abc.find(letter) + key) % 52
如果你想加密串更加随心所欲,说包括一些标点符号或数字字符,替代26或52与计算出的加密字符串的长度进行比较。
非常感谢您的帮助!没有意识到答案基本上在我面前这一整天xd。 – Kieran
(abc.find(letter) + key) % 26
因为abc既有大写也有小写混合。应用于字符“C”的键(例如:2)将导致“D”而不是“E”。
谢谢,在上面的评论中,它说'键* 2)%52'这是有效的。所以通过添加'* 2'解决了问题:D – Kieran
看看[ask] – pvg
你没有将'key'或'message'传递给'encrypt'方法。 – KDecker
'encrypt'方法有两个参数。 – GAVD