解密密码块链 XOR "encryption"
Decrypting cipher-block-chain XOR "encryption"
我收到了朋友的挑战。
他说我要反函数,我要找输入。
但是,我花了好几个小时思考逻辑以及如何在代码中编写我的想法。
他给了我这个算法:
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
等等循环执行
但我不确定如何反转,因为有
"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)
但运气不好,它只是给我空输出。
我的代码有什么问题?
XOR 反转自身。 A^B=C,C^B=A。示例:
>>> 123 ^ 456
435
>>> 435 ^ 456
123
结果的第二个值 194 是通过对未知原始字符与 enc()
函数的结果进行异或运算计算得出的,因此再次对 194 与 enc()
函数进行异或运算应该会产生原始字符价值。请记住 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
我收到了朋友的挑战。 他说我要反函数,我要找输入。 但是,我花了好几个小时思考逻辑以及如何在代码中编写我的想法。
他给了我这个算法:
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
等等循环执行
但我不确定如何反转,因为有
"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)
但运气不好,它只是给我空输出。 我的代码有什么问题?
XOR 反转自身。 A^B=C,C^B=A。示例:
>>> 123 ^ 456
435
>>> 435 ^ 456
123
结果的第二个值 194 是通过对未知原始字符与 enc()
函数的结果进行异或运算计算得出的,因此再次对 194 与 enc()
函数进行异或运算应该会产生原始字符价值。请记住 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