在-Python-中实现凯撒密码
在 Python 中实现凯撒密码
原文:
towardsdatascience.com/implementing-the-caesar-cipher-in-python/
凯撒密码在其工作方式上相当基础。它通过将待加密消息中的所有字母按固定数量(称为密钥)进行位移来实现。接收者知道密钥,并使用它来解密消息,从而提供了一种简单而智能的私人通信方式。
理解项目
在本文中,我们将学习如何在 Python 中实现凯撒密码。这是一个适合初学者的项目,我们将使用条件语句、循环和函数来编码和解码用户输入的数据。
以下是程序的工作方式:程序会要求用户输入要编码或解码的消息。用户选择加密或解密。程序会要求用户输入用于加密消息的密钥。一旦用户提供了密钥,程序就会根据密钥将消息进行转换,通过将消息中的每个字母根据密钥进行转换,如果编码则向前移动字母,如果解密则向后移动字母。
让我们首先使用流程图来定义项目步骤。

流程图(图片由作者提供)
第 1 步:定义字母表列表
首先,我们将使用 Python 中的 列表 数据类型来创建一个包含字母表中字母的列表。Python 列表是有序项的序列,并具有多个内置函数。程序将使用这个列表作为参考,根据编码或解码的选择向前或向后移动字母。让我们定义这个列表,alphabet。
alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
'v', 'w', 'x', 'y', 'z']
第 2 步:询问用户输入
下一步是获取用户的输入。我们将询问用户:
-
他们是否想要编码或解码一条消息
encode_or_decode -
他们想要编码或解码的相应消息
secret_message,以及 -
将消息编码或解码的位移数
key。
encode_or_decode = input("Type 'encode' to encrypt, type 'decode' to decrypt:\n").lower()
secret_message = input("Type your message here:\n").lower()
key = int(input("Type the key:\n"))
确保将 key 转换为 int 数据类型,否则在根据键移动字母时可能会遇到问题,因为 Python 会将输入视为字符串而不是整数类型。同时,请记住将用户输入的 secret_message 和 encode_or_decode 转换为小写,以匹配列表 alphabet 和即将到来的条件语句。
第 3 步:定义函数和使用取模运算符
下一步是定义encode和decode函数,这些函数将在稍后调用。当用户在encode_or_decode输入提示中选择encode时,将调用encode函数,当用户在encode_or_decode输入提示中键入decode时,将调用decode函数。
两个函数的编码都非常直接。它将获取secret_message,遍历所有字母,然后对于我们在前面定义的字母表列表中的所有字母,它将获取它们的索引位置,将其与key相加,并给出shifted_position。我们将使用这个shifted_position作为字母的索引,并将它们添加到output_text中,这将是我们编码或解码的消息。
但是这里有一个问题! 如果通过移动字母,索引位置超出了字母表列表怎么办?嗯,这个问题的解决方案是使用一个有趣的 Python 运算符,称为“模”。模运算符是一个在 Python 中表示为%的运算符,它给出除法后的余数。所以 8 % 5 等于 3,因为 3 是 8 除以 5 后的余数。
我们将在编码和解码函数中使用这个运算符。所以,考虑到字母表有 26 个项目,如果用户要编码消息“vampire”和键“10”,如果我们只是将键号加到字母v的索引位置上,22 + 10 = 32,我们将有一个错误,因为在字母表列表中没有第 32 个位置的项。然而,如果我们想从z之后重新开始字母表,第 32 个字母将落在f上,这是字母表中的第 6 个项目。我们可以使用模运算符达到相同的字母和索引位置;对于 32 的移动值,字母将位于 32 % 26 = 第 6 个位置。所以我们将使用相同的逻辑来编写我们的编码和解码函数。
下面是编码函数:
def encode(message, keynumber, operation):
output_text = ""
for letter in message:
if letter in alphabet:
shifted_position = alphabet.index(letter) + keynumber
shifted_position = shifted_position % len(alphabet)
output_text = output_text + alphabet[shifted_position]
else:
output_text += letter
print("Here is the encoded text : ", output_text)
所以如果我想用键号6来编码“我有只宠物猫”,我将得到以下编码消息:

编码消息(图片由作者提供)

图片由Bogdan Farca在Unsplash提供
对于解码函数,由于我们要解码,我们必须按key的相反顺序移动字母,即向后移动。所以如果我想解码上面的消息:“o ngbk g vkz igz”,我必须将键号乘以-1,这样就不是添加键,而是减去key,shifted_position将通过向后移动索引位置来获得。
让我们定义解码函数:
def decode(message, keynumber, operation):
keynumber = keynumber * -1
output_text = ""
for letter in message:
if letter in alphabet:
shifted_position = alphabet.index(letter) + keynumber
shifted_position = shifted_position % len(alphabet)
output_text = output_text + alphabet[shifted_position]
else:
output_text += letter
print("Here is the decoded text : ", output_text)
下面是我们的解码消息:

解码消息(图片由作者提供)
第 4 步:调用函数
一旦我们定义了函数,我们将在需要时调用它们。如果用户想要加密一条消息,我们将调用encode函数;如果他们想要解密一条消息,我们将调用decode函数。让我们使用条件语句 if、elif 和 else 在我们的代码中实现这一点:
if encode_or_decode == 'encode':
encode(message=secret_message, keynumber=key, operation=encode_or_decode)
elif encode_or_decode == 'decode':
decode(message=secret_message, keynumber=key, operation=encode_or_decode)
else:
print("Error")
第 5 步:程序连续性
这个程序的最后一步是询问用户他们是否想要继续进行加密和解密程序,还是结束。我们将使用一个变量continue_program来实现这一点,该变量初始为 True,并且当用户想要继续程序时将保持 True。如果用户想要结束,变量将变为 False,程序将结束。我们将把这个条件包含在一个while循环中,只要变量保持True,循环就会运行。
continue_program = True
while continue_program:
encode_or_decode = input("Type 'encode' to encrypt, type 'decode' to decrypt:\n").lower()
secret_message = input("Type your message here:\n").lower()
key = int(input("Type the key:\n"))
if encode_or_decode == 'encode':
encode(message=secret_message, keynumber=key, operation=encode_or_decode)
elif encode_or_decode == 'decode':
decode(message=secret_message, keynumber=key, operation=encode_or_decode)
else:
print("Error")
restart = input("Type 'yes' if you want to continue with the program.\nOtherwise, type 'no'.\n").lower()
if restart == "no":
continue_program = False
结论
通过包含上述的while循环,我们已经成功地在 Python 中实现了凯撒密码程序。这个项目探讨了条件语句if、elif和else、for和while循环,以及定义和调用函数。此外,我们还在这个程序中引入了取模运算符来处理异常。
您可以在这里找到这个项目的完整源代码。
如果您有任何问题或想分享不同的方法,请随意在此文章下评论。我期待着您的反馈。祝您编码愉快! 🙂

浙公网安备 33010602011771号