Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 为什么此unhash函数不反转此哈希?_Actionscript 3_Hash_Actionscript_Cryptography_Bit Manipulation - Fatal编程技术网

Actionscript 3 为什么此unhash函数不反转此哈希?

Actionscript 3 为什么此unhash函数不反转此哈希?,actionscript-3,hash,actionscript,cryptography,bit-manipulation,Actionscript 3,Hash,Actionscript,Cryptography,Bit Manipulation,我编写了一个用于生成密码和密钥的散列函数,但很快就意识到能够反转散列是非常有价值的,因此我编写了一个相反的函数,但是它不起作用。我不明白为什么这不起作用 function hash64(n:uint):uint { n = (~n) + (n << 21); n = n ^ (n >> 24); n = (n + (n << 3)) + (n << 8); n = n ^(n >> 14); n

我编写了一个用于生成密码和密钥的散列函数,但很快就意识到能够反转散列是非常有价值的,因此我编写了一个相反的函数,但是它不起作用。我不明白为什么这不起作用

function hash64(n:uint):uint
{
    n = (~n) + (n << 21);
    n = n ^ (n >> 24);
    n = (n + (n << 3)) + (n << 8);
    n = n ^(n >> 14);
    n = (n + (n << 2)) + (n << 4);
    n = n ^ (n >> 28);
    n = n + (n << 31);
    return n;
}

function unhash64(n:uint):uint
{
    n = (~n) - (n >> 21);
    n = n ^ (n << 24);
    n = (n - (n >> 3)) - (n >> 8);
    n = n ^ (n << 14);
    n = (n - (n >> 2)) - (n >> 4);
    n = n ^ (n << 28);
    n = n - (n >> 31);
    return n;
}

第一个明显的问题是它没有及时反映出来。这有时是可行的(如果操作顺序一开始并不重要的话),但一般来说,
y=f(g(x))
的倒数是
x=g⁻1(f)⁻CharStyle(y))
。f是最后应用的,因此必须先撤消。比较:如果你先穿袜子,然后穿鞋子,你可能应该先脱鞋,然后再脱袜子

此外,许多相反的说法一开始就错了。例如,

m=n^(n>>24)
n=m^(m>>24)
,并且
m=(n+(n散列)的倒数是不可逆的。如果您想要一个隐藏原始输入的可逆函数,那么就改用加密。加密被设计为可逆的,只要您有正确的密钥


密码和密钥生成已经有了众所周知的技术。如果你试图设计自己的版本,那么它们将是不安全的。没关系,你只想对你的弟弟隐瞒事情。如果你在商业领域工作,那么你可能会被起诉,所以使用所有现有的标准安全方法。你可能想研究像PBKDF2或argon2这样的密钥派生函数。

你期望什么?1000?是的,这不可能吗?这就是密码学的要点,实际上:不可能从散列中重新创建原始数据。除非经过多年的暴力,否则它是正确的。Organi是正确的:对于密码和密钥基因如果您使用安全哈希,则安全哈希应该是不可逆的。您生成的不是安全哈希(答案转换为注释,harold在解释主要问题方面做得更好)。
Hashed from 1000:           1221775646
Unhash output:              1963490760
n = n * 0x80000001;
n = n ^ (n >> 28);
n = n * 0x3cf3cf3d;
n = n ^ (n >> 14) ^ (n >> 28);
n = n * 0x1c03dd39;
n = n ^ (n >> 24);
n = (n + 1) * 0xffdfffff;