我曾尝试为我在学校的第一个Python项目制作一个Caesar Cipher。我有点复制了来自youtube视频的代码作为主密码段,但是当我加密用户输入的消息时,它会做一个随机密码而不是他输入shell的密钥。这是代码:
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 :(得分:1)
虽然我同意@glibdud,但还有另一个错误。
您正在以密钥值+ abc
中的位置取模26。
但abc
长度为52个字符 - 因此,为了能够解密您加密的内容,您需要将其更改为newPosition = (abc.find(letter) + key) % 52
如果您想使加密字符串更加随意,比如说要包含一些标点符号或数字字符,请将26或52替换为加密字符串的计算长度。
答案 1 :(得分:0)
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 :(得分:0)
问题在于你在字符集中交织大写和小写字母。因此,当你尝试用一个字符替换一个字符时,例如,前面的5个字符,你实际上正在翻转案例并向前移动2-3个字符(取决于你开始的情况)。有更好的方法来实现这一点,但事实证明,一个简单的更改可以使您的代码按预期工作:
newPosition = (abc.find(letter) + key * 2) % 52
如果在找到替换字符时将密钥加倍,那么您将跳过字符集中的大写和小写字母。而且,由于您的双键始终是均匀的,因此您最终会得到与您开始时相同的情况。您还需要根据R.Sharp指出将模数相应地更改为52。
答案 3 :(得分:0)
(abc.find(letter) + key) % 26
因为abc有大写和小写混合。应用于字符“C”的键(例如2)将导致“D”而不是“E”。