在密码学中,Blowfish是一种带密钥的对称块密码,由Bruce Schneier于1993年制作,自1993年以来,Blowfish被包含(拼凑)在大量的加密产品中。Blowfish在软件中具有很好的加密率,直到2008年还没有发现对它的密码分析攻击模型。不过,现在AES块加密算法受到了更多的关注。
施耐尔将Blowfish作为一种通用算法,用来替代旧的DES算法,消除其他加密算法的问题和困难。在Blowfish发布的时候,很多其他算法都是专有的,或者是秘密。施奈尔曾表示:"Blowfish是没有专利的,在所有国家都将保持这种状态。该算法在此被置于公共领域,任何人都可以自由使用。"
该设计的主要特点包括依赖于密钥的S盒和一个非常复杂的密钥时间表。Blowfish是很多人使用的最快的块密码器之一,除了更换密钥的时候。每一个新的密钥都需要进行预处理,这与加密大约4千字节的文本所需的时间相同,这与其他块状密码相比非常缓慢。这就阻止了它在某些应用中的使用(如在最小的嵌入式系统中,如早期的智能卡),但在其他应用中并不是问题。在其中一个应用中,它实际上是好的:OpenBSD中使用的密码加密方法使用了一种来自Blowfish的算法,它利用了缓慢的密钥时间表;其想法是,所需的额外的计算努力给了防止字典攻击的保护。参见密钥加强。
Blowfish的块大小为64位,密钥长度从0到448位不等,它是一个16轮的Feistel密码,使用大的密钥依赖性S-box。它的结构与CAST-128类似,后者使用固定的S-box。
1996年,Serge Vaudenay发现了一种已知明文攻击,需要28r+1个已知明文才能破解,其中r是回合数。此外,他还发现了一类弱密钥,只需要24r+1个已知明文,就可以通过同样的攻击来检测和破解。这种攻击不能用来对付常规的Blowfish,它假设了密钥依赖性S盒的知识。Vincent Rijmen在他的博士论文中介绍了一种二阶差分攻击,可以破除四轮,再无其他。但除了蛮力搜索外,仍然没有已知的方法可以破解全部16轮。1996年已发现已发表的C代码中的一个符号扩展错误。
直到2008年,还没有公开的关于Blowfish全轮版本的良好密码分析。然而,在2007年,Bruce Schneier指出,虽然Blowfish仍在使用,但他建议使用新的Twofish算法来代替。