有没有比用Python中用ascii值创建字典更简单的方法来加密与标点符号兼容的基于ascii的代码?

2024-04-19 09:44:53 发布

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

我的学校作业是在旋转13的基础上生成一个新的密码,它使用ord()函数来获得字符的ASCII值,加上13,然后使用chr()将该ASCII值转换为文本。问题是它完全是按字母顺序排列的,所以标点符号不起作用。我的解决方案是创建一个包含ASCII值及其文本副本的字典,并使输入引用字典,添加13,然后使用chr()将值转换回文本。我也做了同样的解密,但是它减去了13。在我使用值为+13的字符超出范围之前,这一切都很好。发生这种情况时,字符不加密,因此为空。但是,对于字母字符,由于我使用了upper()函数,它们会被大写字符减去,而这些大写字符不会超出范围,因此它们会从这些字符中减去13,而不是正确的字符。一、 例如,小写的t-z被转换成大写,加密后变成大写的a-g。如果我解密它们,它们就会变成4,5,6,7,8,9,和:因为它们与小写值的位置不同。我尝试过做一个if-than语句,如果解密后的字符被解密为4-:,则将其转换为T-Z。我是不是过于复杂化了一个简单的解决方案?我没有,我怎样才能修正这些错误?在

加密代码:

ascii_cipher = {
 ' ' : '32',
 '!' : '33',
 '"' : '34',
 '#' : '35',
 '$' : '36',
 '%' : '37',
 '&' : '38',
 "'" : '39',
 '(' : '40',
 ')' : '41',
 '*' : '42',
 '+' : '43',
 ',' : '44',
 '-' : '45',
 '.' : '46',
 '/' : '47',
 '0' : '48',
 '1' : '49',
 '2' : '50',
 '3' : '51',
 '4' : '52',
 '' : '53',
 '6' : '54',
 '7' : '55',
 '8' : '56',
 '9' : '57',
 ':' : '58',
 ';' : '59',
 '<' : '60',
 '=' : '61',
 '>' : '62',
 '?' : '63',
 '@' : '64',
 'A' : '65',
 'B' : '66',
 'C' : '67',
 'D' : '68',
 'E' : '69',
 'F' : '70',
 'G' : '71',
 'H' : '72',
 'I' : '73',
 'J' : '74',
 'K' : '75',
 'L' : '76',
 'M' : '77',
 'N' : '78',
 'O' : '79',
 'P' : '80',
 'Q' : '81',
 'R' : '82',
 'S' : '83',
 'T' : '84',
 'U' : '85',
 'V' : '86',
 'W' : '87',
 'X' : '88',
 'Y' : '89',
 'Z' : '90',
 '[' : '91',
 '\\' : '92' ,
 ']' : '93',
 '^' : '94',
 '_' : '95',
 '`' : '96',
 'a' : '97',
 'b' : '98',
 'c' : '99',
 'd' : '100',
 'e' : '101',
 'f' : '102',
 'g' : '103',
 'h' : '104',
 'i' : '105',
 'j' : '106',
 'k' : '107',
 'l' : '108',
 'm' : '109',
 'n' : '110',
 'o' : '111',
 'p' : '112',
 'q' : '113',
 'r' : '114',
 's' : '115',
 't' : '116',
 'u' : '117',
 'v' : '118',
 'w' : '119',
 'x' : '120',
 'y' : '121',
 'z' : '122',
 '{' : '123',
 '|' : '124',
 '}' : '125',}
 reverse_ascii_cipher = {v: k for k, v in ascii_cipher.items()}
 def encrypt_extended_rot13(s, direction):
        s = s.upper()
        output = ""
        for ch in s:
          if direction == "encrypt":
           output = output + chr(int(Crypto.ascii_cipher[ch])+13)
          elif direction == "decrypt":
            output = output + chr(int(Crypto.ascii_cipher[ch])-13)

        return output

GUI代码:

^{2}$

Tags: 函数文本output字典字母ascii解决方案ch
1条回答
网友
1楼 · 发布于 2024-04-19 09:44:53

是的,你把解决方案复杂化了。rot13(或任何循环密码)的问题是,如果你在加法,结果超出了给定的区间,你应该从低端开始。因此,无论允许哪一组输入字符,都应该在同一组中生成输出。所以,假设我们限制密码来处理大写字母A-Z,那么所有加密字符也应该在这个范围内。在

现在,转到您的解决方案;您的ascii_cipherdict没有添加任何值。chr在相同的值(包括标点符号)上工作得非常好。但是,我认为这些字符应该从加密字符中排除。因此,假设我们要使用rot13加密字母a-Z的消息,那么加密函数可以类似于:

def encrypt_letter(ch, rot=13):
    if ch < 'A' or ch > 'Z':
        # This is outside the allowed range, just return the letter
        return ch
    else:
        # Normalise and modulus add rotation
        set_size = ord('Z') - ord('A') + 1
        return chr((ord(ch) - ord('A') + rot) % set_size + ord('A'))

def encrypt_msg(str, rot=13):
    return "".join([encrypt_letter(ch, rot) for ch in str])

然后我们可以通过负旋转加密来推导解密函数:

^{pr2}$

请尝试理解我编写的代码,因为它包含一些很好的python构造,例如列表理解。在

相关问题 更多 >