我正在尝试创建一个加密明文消息的加密函数,但问题是如果我输入的密钥太大而超过'Z',那么它会转到更大的unicode值。
我的代码:
def encrypt(var1,var2):
var3 = ""
for i in range(0, len(var1)):
if ord(var1[i])>64 and ord(var1[i])<90:
var3=var3+chr((ord(var1[i])+var2))
elif ord(var1[i])+var2>90:
???
else:
continue
return(var3)
如何让它将'Z'循环回'A'。我想我必须做一个像这样的if语句,但我不知道该把它放进去。
elif ord(var1[i])+var2>90:
???
答案 0 :(得分:2)
这是我的!我使用模数运算符来包围每26个数字(a-z之间的字母数)。我也分别用小写字母处理鞋帮。
def encrypt(data, shift):
result = ''
for c in data:
c_num = ord(c)
# is the letter lower case a - z?
if (c_num >= ord('a')) and (c_num <= ord('z')):
# get the letter number from 0 - 26
c_num = c_num - ord('a')
# shift the number
c_num += shift
# wrap the number every 26 numbers
c_num = c_num % 26
# now increase a by the new amount
c_num += ord('a')
result += chr(c_num)
# is the letter upper case A - Z?
elif (c_num >= ord('A')) and (c_num <= ord('Z')):
# get the letter number from 0 - 26
c_num = c_num - ord('A')
# shift the number
c_num += shift
# wrap the number every 26 numbers
c_num = c_num % 26
# now increase a by the new amount
c_num += ord('A')
result += chr(c_num)
return result
encrypt('aAbB', 2)
'cCdD'
encrypt('afZz', 2)
'chBb'
以下是使用列表理解的代码高尔夫版本,只是为了好玩!
def encrypt(data, shift):
return ''.join([chr(((ord(c) - ord('a') + shift) % 26) + ord('a')) if ord(c) in range(ord('a'), ord('z')+1) else chr(((ord(c) - ord('A') + shift) % 26) + ord('A')) for c in data])
答案 1 :(得分:0)
一种直截了当的方法是检查你是否已超越Z,并在这种情况下修改角色:
...
if var1[i] >= 'A' and var1[i] <= 'Z':
translated_char = chr(ord(var1[i])+var2)
if translated_char > 'Z':
# If the resulting character is beyond Z,
# we go 26 characters back
translated_char = chr(ord(translated_char)-26)
# Append the translated character to the output string
var3 += translated_char
...
您可能需要考虑更具描述性的变量名称 - 如果您在两个月后重新访问代码,您会感谢自己: - )
答案 2 :(得分:0)
我建议使用模数运算符来做你想要的。在python中是%字符。在模数学中。 X%Y告诉我们X / Y的剩余部分是什么。例如。 27%26是1.使用这个你可以得到你想要的环绕。以下是加密单个字符的代码示例
def encrypt_character( valToEncrypt, keyVal ):
# Update the character to be our standard Alphabet mapping
# A -> 0; B->1 ... Z -> 25
x = ord(valToEncrypt) - ord('A')
# Perform the Encryption
retVal = ( x + keyVal ) % 26
# Translate back to the standard ASCII mapping of the character
# for display in python and translate it back into a string
retVal = chr(retVal + ord('A'))
return retVal
# end encrypt_character
现在,如果我们喂养角色&#34; A&#34;使用13的密钥进入我们的加密算法,我们得到&#34; N&#34;如图所示:
>>> encrypt_character("A", 13)
'N'
解密算法非常相似,除了你做减法而不是添加
def decrypt_character( valToDecrypt, keyVal ):
# Update the character to be our standard Alphabet mapping
# A -> 0; B->1 ... Z -> 25
x = ord(valToDecrypt) - ord('A')
retVal = ( x - keyVal ) % 26
# Translate back to the standard ASCII mapping of the character
# for display in python and translate it back into a string
retVal = chr(retVal + ord('A'))
return retVal
要加密字符串,您可以使用以下函数: 来自重新导入子 def encrypt_message(message,key): #将消息文本转换为包含所有空格的纯文本 #标点删除。 plainText = sub(r&#39; [^ A-Z]&#39;,&#39;&#39;,message.upper()) cipherText =&#34;&#34;
charIndex = 0
# Encrypt the message 1 character at a time
while charIndex < len(plainText):
cipherText += \
encrypt_character( plainText[charIndex], key)
charIndex += 1
return cipherText
可以调用此函数:
>>> encrypt_message("HELLO World!", key=23)
'EBIILTLOIA'
解密功能与加密功能非常相似,只是它调用了decrypt实用程序而不是加密实用程序。