代码之家  ›  专栏  ›  技术社区  ›  Richard Dabel

解密密码块链异或“加密”

  •  -1
  • Richard Dabel  · 技术社区  · 7 年前

    我收到了朋友的挑战。 但是,我花了几个小时思考逻辑以及如何在代码中写出我的想法。

    def hash_cbc(input):
        initial = 'a'
        key = 'netsos'
    
        output = [ord(initial)]
    
        def enc(c, key, i):
            z = key[i % len(key)]
            return (c + ord(z)) ^ ord(z)
    
        for i in range(len(input)):
            prev_char = output[i]
            next_char = enc(prev_char, key, i) ^ ord(input[i])
            output.append(next_char)
    
        return output
    

    该算法的输出必须为:

    97, 194, 299, 411, 533, 654, 768, 873, 965, 1066, 1164, 1272, 1399, 1512, 1603, 1706, 1792, 1895, 1994, 2110, 2215, 2310, 2404, 2517, 2645, 2762
    

    我需要反转函数,以便获得输入。输入必须是字符串。

    请帮帮我,我已经被困了几个小时,没有结果。 我想反转异或函数,但真的很困惑如何编写它。


    我在想这些算法是怎么做的

    enc(prev_char, key, i) ^ 1st ordinal input = 1st output
    enc(prev_char, key, i) ^ 2nd ordinal input = 2nd output
    enc(prev_char, key, i) ^ 3rd ordinal input = 3rd output
    

    但我不知道如何扭转,因为有

    我还试着制作自己的反向代码

    def enc(c, key, i):
    Awalan = input("Insert numbers: ")
    Awalan_split = Awalan.split (', ')
    Awalan_len = len(Awalan_split)
    
    initial = 'a'
    key = 'netsos'
    output = [ord(initial)]
    z = key[i % len(key)]
    return (c + ord(z)) ^ ord(z)
    
    for i in range(Awalan_len):
        prev_char = output[i]
        next_char = int(Awalan_split[i]) ^ enc(prev_char, key, i)
        char_convert = chr(next_char)
        return(char_convert)
    
    print(char_convert)
    

    1 回复  |  直到 7 年前
        1
  •  0
  •   Mark Tolonen    7 年前

    异或反转自身。A^B=C,C^B=A。示例:

    >>> 123 ^ 456
    435
    >>> 435 ^ 456
    123
    

    enc() 函数,所以用 函数应产生原始值。记住这一点 initial 'a' enc 0 :

    >>> 194 ^ enc(ord('a'),'netsos',0)
    99
    >>> chr(99)
    'c'
    

    结果的第三个值299使用序列的前一个值和下一个字符与加密函数异或,因此再次与加密函数异或应产生它:

    >>> 299 ^ enc(194,key,1) # index (last parm) incremented
    105
    >>> chr(105)
    'i'
    

    output = []
    for i in range(len(inp) - 1): # original will be one shorter.
        prev_char = inp[i]
        next_char = enc(prev_char, key, i) ^ inp[i+1]
        output.append(next_char)
    

    然后只需将生成的序数转换回字符:

    return ''.join(chr(n) for n in output)
    

    以下是所有联系在一起的内容:

    # factor out common stuff
    initial = 'a'
    key = 'netsos'
    def enc(c, key, i):
        z = key[i % len(key)]
        return (c + ord(z)) ^ ord(z)
    
    def hash_cbc(inp):
        output = [ord(initial)]
    
        for i in range(len(inp)):
            prev_char = output[i]
            next_char = enc(prev_char, key, i) ^ ord(inp[i])
            output.append(next_char)
    
        return output
    
    def unhash_cbc(inp):
        output = []
        for i in range(len(inp) - 1):
            prev_char = inp[i]
            next_char = enc(prev_char, key, i) ^ inp[i+1]
            output.append(next_char)
    
        return ''.join(chr(n) for n in output)
    
    expected_result = [97, 194, 299, 411, 533, 654, 768, 873, 965, 1066, 1164, 1272, 1399, 1512, 1603, 1706, 1792, 1895, 1994, 2110, 2215, 2310, 2404, 2517, 2645, 2762]
    
    u = unhash_cbc(expected_result)
    h = hash_cbc(u)
    print(h == expected_result)
    print(u)
    

    True
    cipheringblockingchaining