我可以从网上读到:Blowfish算法是对称的。 而来自PHP.net的crypt函数是一种加密方式.Crypt函数也允许Blowfish作为散列算法。
因此,当我将对称加密与双向加密程序联系起来时,我是正确的。 我看到了矛盾。
当然,使用crypt()+ Blowfish会让某人有机会解密字符串, 如果他知道秘密盐? (我实际上并不认为,因为我可以从加密的字符串中看到加密盐包括在内)
非常感谢
答案 0 :(得分:2)
像blowfish这样的密码算法可以用作散列算法的一部分。 Blowfish只是一个"构建块"并可用于不同的目的。它可以实现为加密/解密工具,也可以实现为哈希算法的加密原语。这并不意味着您突然能够反转散列算法。
哈希算法的输出始终是一个恒定长度的明显事实是无法逆转的赠品。您无法以可逆方式将无限数量的潜在输入值加密为固定长度输出。该算法必然是有损。
作为一个简单的例子,河豚可以像这样使用加密数据(随后可以解密):
ABCD EFGH IJKL MNOP ...
| | | |
v v v v
NPCQ JQ0C MPZW LKAQ
输入的每个块由blowfish单独转换为密文。这就是为什么blowfish被称为块密码(而不是流密码,它将输入作为流处理,而不是作为一组固定长度的块)。该操作的结果是一堆可以反转的块。输出与输入的长度相同(加上填充以填充必要的块)。
使用blowfish的哈希函数的工作原理如下:
ABCD EFGH IJKL MNOP ...
| | | |
v v v v
NPCQ JQ0C MPZW LKAQ
| | | |
+----+--> PMQZ --+--> OLMQ --+--> UALG ...
每个块的输出通过压缩函数运行,该函数将两个块合并为一个。前两个块的输出被组合(进入PMQZ
),然后该值与第三个块的输出(进入OLMQ
)组合,依此类推。最后一次压缩的输出是散列的结果。
如您所见,blowfish在内部用作加密密码,但其输出与有损压缩功能相结合,这使得无法反转输出。
答案 1 :(得分:1)
加密的东西是可解密的,如果它不可解密,则称为哈希,散列是单向的。
答案 2 :(得分:0)
你的想法是错误的; salt和密码一起用作密钥,而有一个魔术字符串是数据(密码不是数据)。没有密钥,没有解密。然后迭代(这是bcrypt所做的)。
请参阅sha512 vs blowfish vs bcrypt以获得非常好的答案。