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

2024-04-20 13:00:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用以下函数在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位的关键。你知道吗

我也希望它忽略任何空格,标点符号和任何不是字母的东西。你知道吗

任何帮助都将不胜感激


Tags: key函数truereturnifdef字母code
2条回答

您的问题是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(),只是:

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

注意:if 65 <= ord(c) <= 90:是完全合法的,并且在Python中做您期望它做的事情。你知道吗

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) 

相关问题 更多 >