对称加密中,根据对明文的处理方式,又可以分为流加密(Stream Cipher)跟块加密(Block Cipher)
流加密,简单来说就是根据密钥产生一串跟明文长度一样的数据流,然后xor一下,速度快。可能有的人觉得流加密不够安全,也不尽然,只不过在使用流加密的时候需要格外的小心,一点小小的疏漏就可能导致很严重的安全问题。
块机密,就是针对一个固定大小的数据块进行加密,常见的有des, 3des, aes,blowfish等等。
这里就不依依详细介绍了,拿前3个用的比较多的说说,大家有兴趣可以自己去研究研究。关于他们具体的算法思想实现原理,也不在本文的讨论范围之内,这些东西网上一查有很多,而且讲的都很详细,这里只说说一些需要注意的东西或者不太好查的东西
DES:
des一个块的大小是64bits,密钥是56bits,块的大小及密钥的长度都不能满足现在的安全需求了,抛开块大小及密钥长度不谈,des也有几个与生俱来的weakness。
- weak keys:des每一个回合的key(这里叫做round key)都是由加密key(这里叫做cipher key)里的一些bit位组合成的,如果cipher key全是0的话,所有的round key都一样,加密跟解密的过程也都一样了,除了全是0这样的weak key还存在其他的weak key
- complementation property(取反属性/补属性):E(^K, ^P) == ^E(K,P)
会不会有点太吹毛求疵了,第一个缺点可以避免,第二个即使避免不了,但是似乎也没什么太大的影响,但是这不是一个理想的块加密该有的属性,在密码学安全里容不得一点小小的瑕疵,所谓道高一尺魔高一丈,你永远想不到黑客们会采用什么样的攻击手段,这不是一个安全漏洞但也是一个安全隐患,所以实际的开发中尽量不要用des。
3DES:
为了挽救des,毕竟他也是曾将的王者,出现了3des,也就是三重des,块的长度没变依旧是64bits,密钥扩展到56*2bits,56*3bits,虽然密钥长度变长了,加强了一定的安全性,但是块的大小没变,而且依旧存在des那几个与生俱来的weakness。这里补充一下块的大小对安全性的影响,类似md5,sha-1等哈希算法,位数过少的话导致的一个问题就是碰撞,对于哈希算法来说,产生碰撞了基本可以说这个算法已经走到尽头了,对于块加密来说,两个不同的明文块对应的密文块相同,这也是一个不小的安全隐患。如果块的大小有n bits,从密码学的角度讲,他可提供的安全性只有n/2 bits(这里涉及到生日攻击,有兴趣的朋友可以去研究研究)。
AES: