AES和Blowfish用于文件加密的比较

111
我希望加密一个二进制文件,我的目标是防止没有密码的人读取该文件。
在具有相同密钥长度的情况下,AES或Blowfish哪个更好?我们可以假设攻击者拥有强大的资源(软件、知识、金钱)来破解文件。

5
Blowfish已经有十多年的历史了,我想你的意思是AES vs Twofish。 - rook
你说得对,我本来可以问的。幸运的是,Jerry为我总结了这个话题。 - mimrock
1
@Rook "越老越好"是安全算法的经验法则。新算法更适用于那些更关注性能而非安全性的人。 - ceving
7个回答

191

很可能是AES。Blowfish是Twofish的直接前身。Twofish是Bruce Schneier提交的竞赛作品之一,但被评判为不如一种名为Rijndael的作品,后者成为了AES标准。

有趣的是,在比赛中的某个时刻,所有参赛者都被要求表达他们对密码算法排名的看法。也许毫不意外的是,每个团队都认为自己的作品是最好的,但其他团队却统一选择将Rijndael评为第二好。

尽管如此,Blowfish和AES在基本目标上仍有一些基本区别,这可以(有人认为)使Blowfish在绝对安全性上具有优势。特别地,Blowfish试图通过使初始密钥设置变得相当缓慢来防止暴力破解(即穷举攻击)。对于普通用户而言,这几乎没有影响(仍不到1毫秒),但如果你在试图每秒尝试数百万个密钥以进行破解,则其中的差异就相当大了。

最终,我并不认为这是一个主要的优势。我通常会建议使用AES。我的下一个选择可能是Serpent、MARS和Twofish。Blowfish将在这些之后,虽然还有一些其他的密码算法我可能会推荐在Blowfish之前。


12
我认为其他算法被认为比Rijndael更安全,但它在提供很好的性能的同时,其安全性被认为足够好。设计密码算法始终是安全与性能之间的权衡。 - CodesInChaos
10
根据视角不同,这种说法至少有点正确——Serpent 可能是最保守的设计之一。特别是,他们认为一个 16 轮版本就足够了,所以将其加倍到 32 轮。目前已知的最佳攻击只对 11 轮有效。如果原始问题没有明确限制选择 AES 和 Blowfish,而只是要求最安全、相当知名的密码,我可能会说 Serpent... - Jerry Coffin
此外,“有趣的旁注”在我准备CompTIA Security+考试时出现在多个问题和资料中。那些小细节也许并不是那么无用! - Everlight
Blowfish是最快的。 - user924

25

一个不常被承认的事实是块密码的块大小也是一个重要的安全考虑因素(虽然远不如密钥大小重要)。

Blowfish(以及大多数同一时代的块密码,如3DES和IDEA)的块大小为64位,这被认为对于现在普遍的大文件大小来说是不足的(文件越大,块大小越小,在密文中重复块的概率越高 - 而这些重复块在加密分析中极其有用)。

相反,AES的块大小为128位。仅考虑这个因素就足以证明使用AES而不是Blowfish是有理由的。


2
64位块大小的优势在于,它使得将新算法作为(3-)DES的替代品轻松地插入旧应用程序中变得更加容易。 - dajames
块大小是一个有趣的参数。几个月前,我写了一篇文章,理论上证明任何对称密码的块大小都可以扩展到任意长度:http://cubicspot.blogspot.com/2013/02/extending-block-size-of-any-symmetric.html - CubicleSoft

16
就算是算法本身,我也会选择AES。简单来说,因为它已经被NIST接受并将会被同行评审和密码分析多年。然而,在实际应用中,除非你要存储政府想保密的文件(在这种情况下,NSA可能会向您提供比AES和Blowfish更好的算法),否则使用这两个算法不会产生太大的差异。所有的安全性都应该体现在密钥上,这两个算法都能抵御暴力攻击。Blowfish只显示出在没有充分利用16轮的情况下实现弱点。虽然AES更加新颖,但这一事实应该使您更倾向于BlowFish(如果您只考虑年龄因素的话)。可以这样想,BlowFish自90年代以来一直存在,但我们并不知道有人已经破解它了...
我的建议是,与其看着这两个算法并试图在它们之间做出选择,不如关注您的密钥生成方案。潜在的攻击者不会坐在那里想出一组理论上可用的密钥,然后进行需要花费数月时间的暴力攻击来解密您的文件。相反,他会利用其他方式,例如攻击您的服务器硬件、反向工程汇编代码以查看密钥、尝试找到某个包含密钥的配置文件,或者勒索您的朋友从您的计算机复制文件。这些将是您最脆弱的地方,而不是算法。

4
AES最近被加入维基百科上的“破译密码”列表,但对Blowfish的最严重攻击仅针对了四轮,而且明显未列入破解密码列表。Bruce对人们仍在使用Blowfish感到惊讶的评论是驱使实现者离开的原因。然而,Blowfish并没有被破解,它支持可变密钥大小,比AES支持更大的密钥大小,并且从编程角度来看,与大多数其他对称分组密码相比易于实现。Blowfish经受住了时间的考验,这也是任何对称密码的最大威胁。 - CubicleSoft
我同意AES目前并没有被破解。然而,在未来的10年左右,我们将需要一个新的标准。此外,任何一个AES的入围者都是非常出色的密码算法。实际上,许多人认为蛇形密码是最难破解的,但AES是最优雅的。(如果你看一下加密和解密的方式,它绝对是优雅的。) - nerdybeardo

7

AES.

(我假设你指的是twofish,而不是更早且较弱的blowfish)

无论如何,AES和twofish都是很好的算法。然而,即使它们在技术上相等或twofish稍微领先,我仍会选择AES。

为什么?宣传。AES是政府加密的标准,因此数百万其他实体也使用它。一个有才华的密码分析师在找到AES中的缺陷时可以获得更多的“回报”,而在不太知名且使用较少的twofish中则不然。

在加密中,隐秘性并不能提供保护。越多的人审查、研究、探索和攻击一个算法,越好。你需要最经过“验证”的算法,现在就是AES。如果一个算法不受到强烈而持续的审查,那么你应该对它的强度信心较低。当然,twofish还没有被攻破。这是因为密码本身强大,还是因为没有足够多的人仔细研究它呢......但是


5
算法的选择可能并不那么重要。我会使用AES,因为它的研究更加深入。更重要的是选择正确的操作模式和key derivation function
如果您想要快速随机访问,则可以查看TrueCrypt格式规范以获取灵感。如果您不需要随机访问,则XTS不是最佳模式,因为它具有其他模式没有的弱点。您可能还需要添加某种完整性检查(或消息认证码)。

1
绝对没错 - 使用一个好的密钥派生函数,如PBKDF2是至关重要的。 - caf

3

我知道这个答案违反了您的问题条款,但我认为您意图的正确答案很简单:使用允许您使用最长密钥长度的算法,然后确保选择一个非常好的密钥。大多数公认的算法(在加密和时间上)之间的性能差异被几个额外的密钥位数所压倒。


7
我不能同意。IBM的Lucifer密码(DES的前身)使用了128位密钥,但是一旦差分密码分析被重新发现,只有56位密钥的DES证明更加安全。 - Jerry Coffin
3
仅仅通过秘钥长度来衡量安全性是一个非常不充分的指标。 - Gerald Davis
2
这就是为什么我说“最受尊敬的算法”。如果你认为 Blowfish 128bit 比 AES 128bit 差,那么你必须同意 Blowfish 256bit 能够轻松超越 AES 128bit。同样,密钥生成和管理也同样重要。如果你的密钥是“password”,那么你使用任何算法都没有关系。我的意思是 OP 可能在看错东西。 - Mike Jones
2
问题中指出密钥将从密码派生。通过暴力破解密码来攻击系统可能比攻击这里提到的任何算法都要容易得多。当密钥从密码派生时,密钥长度几乎完全无关紧要。 - dajames
你给我的答案打了分,尽管你说的和我一样?我说了关键长度和选择一个非常好的密钥。如果一个密钥没有填满所有位,按“好”的定义,你会认为它是好的吗? - Mike Jones
在某个点之后,密钥大小就不再重要了。因此,我不会仅仅因为它支持更长的密钥就选择Blowfish而不是AES-256。 - CodesInChaos

3

两种算法(AES和twofish)都被认为非常安全。这在其他答案中已经广泛涵盖。

然而,由于AES现在在2016年被广泛使用,因此它已经在几个平台上进行了专门的硬件加速,例如ARM和x86。虽然在硬件加速之前与twofish相比没有显着提高,但由于专用CPU指令,现在AES要快得多。


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