我的学校作业是在旋转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}$
是的,你把解决方案复杂化了。rot13(或任何循环密码)的问题是,如果你在加法,结果超出了给定的区间,你应该从低端开始。因此,无论允许哪一组输入字符,都应该在同一组中生成输出。所以,假设我们限制密码来处理大写字母A-Z,那么所有加密字符也应该在这个范围内。在
现在,转到您的解决方案;您的
ascii_cipher
dict没有添加任何值。chr
在相同的值(包括标点符号)上工作得非常好。但是,我认为这些字符应该从加密字符中排除。因此,假设我们要使用rot13加密字母a-Z的消息,那么加密函数可以类似于:然后我们可以通过负旋转加密来推导解密函数:
^{pr2}$请尝试理解我编写的代码,因为它包含一些很好的python构造,例如列表理解。在
相关问题 更多 >
编程相关推荐