尝试创建加密程序但变量似乎正在重置

时间:2017-05-23 15:30:55

标签: python-3.x encryption

我尝试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;

1 个答案:

答案 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|2CJ‌​O925O2O=:EE=6O=2>3[O‌​:E DO7=6646OH2DOH9:E6O2DOD?@H]'
print(i)
print(caesar_decrypt(i, -13))

不幸的是,这并不好看,因为加密的解决方案并没有提供符合逻辑的东西。

注意:我们不能像第一眼看到的那样使用string.maketrans()

我希望它有所帮助,