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;