Python简单加密程序:如何将Z循环回A

时间:2015-11-19 22:11:50

标签: python python-3.x encryption

我正在尝试创建一个加密明文消息的加密函数,但问题是如果我输入的密钥太大而超过'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:
    ???

3 个答案:

答案 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实用程序而不是加密实用程序。