在python中创建一个Ascii加密函数,建议?

时间:2017-03-11 21:08:00

标签: python python-3.x encryption ascii

我尝试使用以下函数在Python中创建加密函数。

def code_char(c, key):
    adj = ord('a') if c.islower() else ord('A') 
    return chr(adj + (ord(c)-adj+int(key))%26)

^对角色进行编码

def isletter(c):
    if 65 <= ord(c) <= 90:
        return True
    elif 97 <= ord(c) <= 122:
        return True
    else:
        return False

^检查字符是否为字母

加密功能必须包含code_blockisletter(c)功能

我希望能够输入任何长度的字符串,并根据8位数密钥对其进行加密。

我也希望忽略任何空格,标点符号以及任何不是字母的内容。

非常感谢任何帮助

2 个答案:

答案 0 :(得分:0)

使用isletter

进行了一些更改
def isletter(c):
    if 65 <= ord(c) and ord(c) <= 90:
        return True
    elif 97 <= ord(c) and ord(c) <= 122:
        return True
    else:
        return False
旧代码中的

65<=ord(c)<=90

65<=ord(c)会给出一些布尔值,然后与90进行比较。 [AC:在python中不正确]

code_char功能更改:

def code_char(c, key):
    tmp=ord(c)+int(key)
    if(tmp>122):
        return chr(tmp-26)
    else:
        return chr(tmp) 

答案 1 :(得分:0)

您的问题与code_char一致,因为当您添加int(key)时需要修改%26以确保该字母保留为ascii字符:

def code_char(c, key):
    adj = ord('a') if c.islower() else ord('A')
    return chr(adj + (ord(c)-adj+int(key))%26)

结果:

>>> encrypt("This is  a   secret  message!!", "12345678")
'Ujlw ny  h   afeuiy  slatcji!!'

您当然可以改进代码,例如可以重写code_block

import itertools as it

def code_block(word, key):
    k = it.cycle(key)
    return "".join(code_char(c, next(k)) if isletter(c) else c for c in word)

您还可以重写isletter()

def isletter(c):
    return c in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

您可以利用已定义此内容的string模块:

import string
def isletter(c):
    return c in string.ascii_letters

最后,您encrypt()不必要地创建了一个列表''.join()而且只是:{/ p>

def encrypt(s, key):   # string is a module - may clash
    return code_block(s, key)

注意:if 65 <= ord(c) <= 90:完全合法,并且按照您的期望在Python中完成。