使用没有第三方库的Python反转已知算法

时间:2014-12-04 17:58:48

标签: python algorithm python-2.7 cryptography transformation

我有一个散列整数数组的方法,如下所示:

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

2 个答案:

答案 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
...

你明白了。它是完全可逆的,因为它具有这种特性。