我有一个散列整数数组的方法,如下所示:
def digestm(message):
digest = []
for i in xrange(0,len(message),1):
digest.append(0)
if i != 0:
digest[i] = ( (129 * message[i]) ^ message[i-1]) % 256
else:
digest[i] = ( (129 * message[i]) ^ 0) % 256
return digest
我想要反转这个算法。
示例:
>>>message = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
>>>digestm(message)
[0, 129, 3, 129, 7, 129, 3, 129, 15, 129, 3, 129, 7, 129, 3, 129]
我想知道如何将返回的数组转换回消息数组。
到目前为止,这是我提出的代码,但它肯定是不对的:
def answer(digest):
message=[]
for i in xrange(0,len(digest)-1,1):
message.append(0)
if i!= 0:
message[i] = ((digest[i] ^ digest[i-1])*129)%256
else:
message[i] = ((digest[i] ^ 0)*129)%256
return message
答案 0 :(得分:3)
hash function是一种单向有损函数。你不能扭转它。由于模%
运算符而导致丢失。您将丢失商(如果您将使用大于255的值)。
在你的情况下,它只是通过函数替换相同范围内的值。
答案 1 :(得分:2)
更改
message[i] = ((digest[i] ^ digest[i-1])*129)%256
到
message[i] = ((digest[i] ^ message[i-1])*129)%256
由于在digestm
期间您对当前和之前的明文块进行异或运算,您必须在answer
期间使用明文块进行异或而不使用密文块。
此外,您需要移除-1
for i in xrange(0,len(digest)-1,1):
这是一个非常糟糕的哈希函数。以b = 129 * a % 256
:
a => b 0 => 0 1 => 129 2 => 2 3 => 131 4 => 4 5 => 133 ... 129 => 1 130 => 130 131 => 2 ...
你明白了。它是完全可逆的,因为它具有这种特性。