8.6 小结
对称加密算法提高数据安全性的同时带来了密钥管理的复杂性。消息收发双方若想发送加密消息,必须事先约定好加密算法并发放密钥。加密消息在传递过程中,难免会被窃听。如果窃听者破译了密钥,就可以破译、甚至篡改消息,而消息的收发双方却浑然不知。当然,我们可以通过消息摘要算法验证消息的完整性,但却不能避免消息被破译的可能。消息收发双方若要避免这种密钥被破解的风险,就必须频繁更换密钥,而密钥的发放又是一个敏感问题,操作起来具有一定的难度。
非对称加密算法构建了两把密钥:私钥保密,称为私钥;公钥公开,称为公钥。公钥与私钥一一对应,且不能相互推导得出,即便公钥在传输过程中被截获也不能推导出私钥。也就是说,即便公钥被截获或被破解,也无法推到出对应的私钥。非对称加密算法普遍遵从“公钥加密,私钥解密”和“私钥加密,公钥解密”这两种加密方式。
在非对称加密算法的发展史上主要包括DH、RSA、ElGamal和ECC共4种算法。
DH(Diffie-Hellman,密钥交换算法)算法由W.Diffie和M.Hellman提出,构建了最原始的非对称加密算法实现方式,为后续非对称加密算法实现奠定了基础。交互双方通过交换秘密密钥,使用对称加密算法完成加密消息传递。Java 6对DH算法提供了完善的支持,并将DH算法实现作为后续非对称加密算法实现的基础。
继DH算法提出后,国际上相继提出了两种基于数学问题求解的非对称加密算法:基于因子分解难题和基于离散对数难题。
基于因子分解难题的非对称加密算法目前仅有RSA算法一种。基于离散对数难题的非对称加密算法包括ElGamal和ECC算法。
RSA算法由美国麻省理工学院(MIT)的Ron Rivest, AdiShamir和Leonard Adleman三位学者提出,并以三位学者的姓氏开头字母命名。RSA算法是唯一被广泛接受并实现的通用公开加密算法,目前已经成为非对称加密算法的国际标准。不仅如此,RSA算法既可用于数据加密也可用于数字签名。我们熟知的电子邮件加密软件PGP就采用了RSA算法对数据进行加密/解密和数字签名处理。Java 6提供了完善的RSA算法支持,通过Bouncy Castle可以扩充相应的填充方式。
Taher ElGamal提出了ElGamal算法,并以自己的名字命名。该算法即可用于加密/解密,也可用于数字签名,并为数字签名算法形成标准提供参考。美国的DSS(Digital Signature Standard,数据签名标准)的DSA(Digital Signature Algorithm,数字签名算法)经ElGamal算法演变而来。Java 6本身没有提供ElGamal算法支持,我们可以通过Bouncy Castle扩充对概算法的支持。
ECC(Elliptical Curve Cryptography,椭圆曲线加密)算法以椭圆曲线理论为基础,在创建密钥时可做到更快、更小,并且更有效。ECC算法通过椭圆曲线方程式的性质产生密钥,而不是采用传统的方法利用大质数的积来产生。目前,对于该算法尚无基于Java语言的开源组件。
非对称加密算法的出现并不意味着对称加密算法要退出历史的舞台。非对称加密算法的安全性较高,但却无法回避加密/解密低效问题。
目前,非对称加密算法多应用于安全性要求较高的场合,如B2B、B2C等电子商务领域。