这些加密算法之间有哪些区别?

11

MCRYPT_RIJNDAEL_128MCRYPT_RIJNDAEL_256MCRYPT_BLOWFISH有什么区别?在Web数据传输中哪一个最适合使用?


正在传输什么数据?它是在哪些设备之间进行传输? - user557846
这个问题非常广泛 - 你能缩小范围吗? - Duncan Jones
5个回答

19

Rijandel是当前的“优秀标准”算法AES的另一个名称。其中数字128或256代表密钥长度。

Blowfish是一种早期的64位块密码(而AES是128位块密码)。

你不能真正说它们哪个更“好”或“差”,因为它们都没有被破解,但通常情况下AES应该更优秀,大多数实现也更快。此外,最现代的CPU支持在硬件中使用AES,这将使其更快...所以很少有理由使用AES。

关于密钥长度,对称加密的128位已经足够安全了,除非您是负责保管国家核武器代码的人,在这种情况下,您将希望使用256位密钥。

请注意,如果要合理地使用256位密钥,则需要约40个字符的密码。这再次表明,密码算法不是安全链中的薄弱环节,而是人类自身。

编辑:想了一下,用256位密钥可能需要50-60个字符的密码才行。英语每个字符的熵值不到2比特,所以我们假设您使用更多随机的字母数字序列(但仍需记住),那么每个字符的熵值可能达到4-5比特(非常乐观!)。这将需要您输入51至64个字符,以使密码的熵值大致等于密钥的熵值。

现在的问题是:我们有多少人使用50个字符的密码呢? :-)

更新:
截至2011年底,存在一种对Rijndael/AES的密钥恢复攻击(Bogdanov、Khovratovich、Rechberger),它不属于“大多数理论性”或“可笑的减轮”攻击之一。该攻击可以适用于完整轮次的AES,并且比暴力破解快约4倍。因此,正式地说,可以认为Rijndael已经被“破解”了。
实际上,目前来看这种攻击是不相关的。即使采用最短支持的密钥长度,比暴力破解快四倍的攻击需要2126 次操作,即使通过大规模硬件实现也是不切实际的。但如果攻击得到改进,将来情况可能会有所改变。


1
谁说加密密钥(和IV)必须是可读的?openssl_random_pseudo_bytes(32)可以为您提供256位密码学上足够随机的比特,这恰好是AES-256中的最大密钥大小。它可以安全地存储为base64编码。 - Charles
2
数字128或256是密钥长度。不,它定义了块大小!http://php.net/manual/en/function.mcrypt-encrypt.php - binarious
@binarious:感谢您的投票,但在让自己显得愚蠢之前,请确保事实无误。Rijndael是一种128位块密码。块长度是算法设计的一部分,因此不可能使用不同的块大小。该算法仅有的可调参数是密钥长度和(原则上)轮数。密码常量中的数字128和256肯定不是指密码块的大小。 - Damon
3
“Rijndael支持128、192和256位的分组和密钥大小,但在AES中,分组大小总是128位。” https://en.wikipedia.org/wiki/Block_size_%28cryptography%29 官方PHP文档中写到,您可以使用相关的常量来设置分组大小。 - binarious
1
@Damon 有趣。你能引用一个“破解”的定义来源吗?我没有意识到它有如此严格的含义。例如,这个页面将“破解”定义为能够从密文中提取明文,并将你的情况描述为削弱。 - Duncan Jones
显示剩余12条评论

4
Rijndael和Blowfish都被认为是安全的。
MCRYPT_RIJNDAEL_128与MCRYPT_RIJNDAEL_256:
唯一的区别在于块大小。您可以使用128位、192位或256位密钥中的任何一个版本。
更大的密钥需要更长时间来进行暴力破解。
256位版本因此更安全。
注意:128位版本仍需要很长时间才能进行暴力破解。
目前,Rijndael是高级加密标准:
http://en.wikipedia.org/wiki/Advanced_Encryption_Standard 由于以下原因,AES通常比Blowfish更快:
- 算法本身对处理器更有效率(比特 vs 字节块)。
- 许多处理器支持AES的硬件加速。
结论:
- 这三个选项都足够安全用于数据传输。
- 选择取决于数据有多“机密”。
- Rijndael更广泛使用,因此在某些情况下更容易实现。

2
暴力破解128位密钥不现实,根本不可能。如果你有i7,每秒可以进行约4000万次AES操作。假设我的数字错了1000倍,并且假设攻击者拥有500亿个这样的机器巨型僵尸网络。现在将2^128除以这些数字,再除以(86400*365)。那仍然是10^11年。嘿,我们的星球甚至还没有存在10^11年。你的密码破解的可能性要大得多。 - Damon
这正是我提到需要“大量时间”的原因。目前蛮力攻击是解密AES加密数据的唯一方式,换句话说,没有比尝试每个可能性更快的方法。本质上,128位AES加密仍然非常安全,只是可能性太多了 :) - Anne
3
RIJNDAEL_256不是AES加密算法,只有RIJNDAEL_128才是。 - CodesInChaos

2

关于MCRYPT_RIJNDAEL_128和MCRYPT_RIJNDAEL_256,有人回答说"数字128或256是密钥长度",这是不正确的。这些数字指的是块大小,而不是密钥长度。然而,两种实现(使用128位或256位的块大小)都可以接受128位或256位的密钥。


1

这取决于您想要的答案类型:实现方面的差异仅涉及编程,而设计方面的差异通常是相当详细的数学证明。解释几种加密算法之间复杂的设计差异可能超出了本网站的范围。此外,每个算法都有弱点,有些已知,有些未知。现有算法中特定的弱点通常会导致它们被淘汰,但也可以找到一些方法来规避它们(经典案例:DES存在一些子集密钥,导致代码容易被破解。解决方法是不使用那些密钥)。


-1

RSA是一种非对称加密算法,最大密钥长度为2048,用于2030年提出。AES是一种对称算法,最大密钥长度为256位,用于2015年提出。Serpent加密算法也是一种对称算法,密钥长度为256位,用于2015年提出。


那并没有回答问题! - Nir Alfasi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接