使用带有Blowfish哈希算法的crypt PHP函数,它是否是对称加密?

时间:2014-07-14 10:57:29

标签: php blowfish encryption-symmetric crypt

我可以从网上读到:Blowfish算法是对称的。 而来自PHP.net的crypt函数是一种加密方式.Crypt函数也允许Blowfish作为散列算法。

因此,当我将对称加密与双向加密程序联系起来时,我是正确的。 我看到了矛盾。

当然,使用crypt()+ Blowfish会让某人有机会解密字符串, 如果他知道秘密盐? (我实际上并不认为,因为我可以从加密的字符串中看到加密盐包括在内)

非常感谢

3 个答案:

答案 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以获得非常好的答案。