解密密码链XOR“加密”

时间:2017-09-17 14:00:43

标签: python function reverse

我接受了朋友的挑战。 他说我需要扭转这个功能,我需要找到输入。 但是,我坚持了几个小时思考逻辑以及如何在代码中编写我的想法。

他给了我这个算法:

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

我需要反转功能,以便获得输入。输入必须是一个字符串。

请帮助我,我已经被困了好几个小时但没有结果。 我正在考虑扭转XOR功能,但真的很困惑如何写它。

我在想这些算法正在做这个

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

等在循环中执行此操作

但我不知道如何扭转,因为有 “enc(prev_char,key,i)”让我感到困惑的一部分

我也尝试制作自己的反向代码

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 个答案:

答案 0 :(得分:0)

XOR自我反转。 A ^ B = C,C ^ B = A.例如:

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

结果的第二个值194是通过将未知原始字符与enc()函数的结果进行异或运算来计算的,因此再次使用enc()函数进行异或194应该产生原始值。请注意,initial'a'enc的最后一个参数是原始字符串的当前索引,因此0

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

结果的第3个值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