我尝试2让这个代码工作,我的老师要我加密这些东西,以便它可以使用非字母chr像"。#34;(哈哈!引用的东西看起来像来自哈利波特的金色小报!)我认为制作一个带有chrs及其ascii值的字典可以工作,它可以用于加密。但是当我转换密码并试图将chrs转换回来时,它并不起作用。我认为一个变化正在重置,但idk在哪里。 PLS。帮助
a_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',
'5' : '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' : ' ',
'P' : '!',
'Q' : '"',
'R' : '#',
'S' : '$',
'T' : '%',
'U' : '&',
'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_cipher = {v: k for k, v in a_cipher.items()}
def encrypt(s, direction):
output = ""
encryptme=""
for ch in s:
if direction == "encrypt":
print('ch is '+ ch + ', a_cipher[ch] is '+ a_cipher[ch])
encryptme = output + a_cipher[ch]
print('output is ' + str(encryptme))
print(encryptme)
elif direction == "decrypt":
output= output + reverse_cipher[encryptme]
print('output is ' + str(output))
return output
a=encrypt(input("Encrypt"),"encrypt")
encrypt(a,"decrypt")
硬件分配:
扩展的旋转密码 在到目前为止的每个旋转密码练习中,您已将消息转换为上层 加密前的大小写字符。这简化了密码的设计,因为只有26 需要旋转的字符。 许多字符未正确加密或根本没有加密。这些包括标点符号,数字, 小写字母和许多特殊字符($&amp;#+和更多)。 在此程序中,您将创建一个新的旋转密码,它将使用更广泛的范围 字符。赋值是在ASCII表中包含所有可显示的字符 从一个空格“”开始,通过右大括号}。 必须将此旋转密码设计为具有与Rot13相同的主要优点 被放置在Crypto类中。修改您的encrypt4.py程序以调用新的旋转 密码。将新程序保存为encrypt5D.py。 1.加密以下消息: Han Solo报道,从Dagobah返回,带领Rebel部队与Ewoks超车 死星盾牌发电机。通过此安全通道传输所有新订单。 2.解密以下消息: | 2CJO925O2O =:EE = 60 = 2→3 [O =:EE = 60 = 2→3 [O =:EE = 60 = 2→3] OO | 2CJO925O2O =:EE = 60 = 2→3〔O:电子 DO7 = 6646OH2DOH9:E6O2DOD @H]? 奖励(5分):在密码中添加功能以正确处理“新行”字符(ASCII 代码10)。 奖励(1分):向教师发送一条额外的加密信息。 通过电子邮件将您的encrypt5D.py文件,您的crypto.py文件以及上面1.和2.的输出发送到您的 讲师。将上面1.和2.的输出复制并粘贴到电子邮件中。&#34;
答案 0 :(得分:0)
你可以避免所有这些词典。如果你想要一个字母的ASCII,你可以使用ord()。反过来你可以使用chr()。
chr(97)=&#39; a&#39;。
ord(&#39; a&#39;)= 97
为什么不创建2个函数而不是1个(加密和解密(代码))?这更容易理解,你可以避免“如果&#39; (此外,还会检查您案例中的每个字符)
最后一点,对于解密,你无法以这种方式去做(我的意思是简单的方式)。这是因为你的字符串结果也是一个字符串,你不能轻易检查你是否必须保留1,2或3个字符。
例如,&#39;加密&#39;用ord()加密得到6911099114121112116
当你解密时,你应该以无限的方式分裂,如: 6 - 9 - 110 - 99 - 11 - 41 -... 要么 69 - 110 - 99 - 114 - 12 - 11 - ...... 要么 6 - 91 - 109 - 91 - 14 - ......
所有这些分裂都不会提供相同的输出。为此,您应该查看复杂的词典树算法。
一种解决方案是创建一个元素来检测分割的位置(让#说#)
def encrypt(string):
output = "#".join([str(ord(char)) for char in string])
return output
def decrypt(code):
code = [int(x) for x in code.split("#")]
output = ""
for num in code:
output += chr(num)
return output
s = 'Encrypt'
a = encrypt(s)
print(a) # gives => 69#110#99#114#121#112#116
t = decrypt(a)
print(t)
编辑#1: 我忘了重播你的回答-_-&#39; 变量不会重置,但您没有正确使用它们#9;正确&#39;
在你的&#39;为&#39;循环你有:
encryptme = output + a_cipher[ch]
print('output is ' + str(encryptme))
进入循环时
输出=&#34;&#34; (你永远不会覆盖它)
encryptme =&#34;&#34; + c(c = a_cipher [ch] =加密的字母)
为每个循环更改了encryptme,因为你从不连接它。
如果你这样做:
encryptme = encryptme + c #(c = a_cipher[ch])
每个循环,encryptme将采用自己的值和新的代码片段。这也可以写成:encryptme += c
编辑#2 你的问题是我们称之为Caesar算法,可以这样做:
def caesar(s, offset):
a = [(ord(char) + offset)%255 for char in s]
output = ""
for num in a:
output += chr(num)
return output
print(caesar('code', 13)) # => VbWX
编辑#3: 通过完整的练习,我最终得到了:
def caesar_encrypt(s, offset):
output = ""
up_limit = max(ord('}'), ord(' '))
down_limit = min(ord('}'), ord(' '))
for char in s:
#if the element in included in the list of valid character
if up_limit >= ord(char) >= down_limit:
new_char = chr(ord(char) + offset) # Shift
output += new_char
else:
output += char
return output
def caesar_decrypt(s, offset):
output = ""
up_limit = max(ord('}'), ord(' '))
down_limit = min(ord('}'), ord(' '))
for char in s:
# if the character was included before the offset in the range of element possible to shift
if up_limit >= ord(char) + offset >= down_limit:
new_char = chr(ord(char) + offset)
output += new_char
else:
output += char
return output
s = 'Han Solo reporting in, returning from Dagobah, leading Rebel forces with Ewoks to overtake Death Star shield generator'
print(s)
print(caesar_encrypt(s, 13))
i = '|2CJO925O2O=:EE=6O=2>3[O=:EE=6O=2>3[O=:EE=6O=2>3]OO|2CJO925O2O=:EE=6O=2>3[O:E DO7=6646OH2DOH9:E6O2DOD?@H]'
print(i)
print(caesar_decrypt(i, -13))
不幸的是,这并不好看,因为加密的解决方案并没有提供符合逻辑的东西。
注意:我们不能像第一眼看到的那样使用string.maketrans()
我希望它有所帮助,