我们希望对我们的项目做一些严格的安全性要求,我们需要进行大量高性能的加密.
我认为我知道PKI比对称加密慢得多且复杂得多,但我找不到数字来支持我的感受.
是的,纯粹的非对称加密比对称密码(如DES或AES)慢得多,这就是真正的应用程序使用混合密码术的原因:昂贵的公钥操作仅用于加密(和交换)对称算法的加密密钥.将用于加密真实的消息.
公钥加密解决的问题是没有共享密钥.使用对称加密,您必须信任所有相关方以保持密钥的秘密.这个问题应该是一个比性能更大的问题(可以通过混合方法减轻)
在运行OS X 10.5.5的Macbook和OpenSSL的库存版本中,"openssl speed"以每秒46,000个1024位块为AES-128-CBC时钟.同一个盒子以每秒169个签名计时1024位RSA.AES-128-CBC是"教科书"块加密算法,而RSA 1024是"教科书"公钥算法.这是苹果到橙子,但答案是:RSA要慢得多.
但是,这不是您不应该使用公钥加密的原因.这是真正的原因:
公钥加密操作不适用于原始数据加密.像Diffie-Hellman和RSA这样的算法被设计为一种交换块加密算法的密钥的方法.因此,例如,您使用安全随机数生成器为AES生成128位随机密钥,并使用RSA加密这16个字节.
像RSA这样的算法比AES更"用户友好".使用随机密钥,您向AES提供的明文块将随机出现给没有密钥的任何人.实际情况并非RSA的情况,这比AES更多 - 只是一个数学方程式.因此,除了正确存储和管理密钥之外,您还必须非常小心格式化RSA纯文本块的方式,否则最终会遇到漏洞.
没有密钥管理基础结构,公钥不起作用.如果您没有验证公钥的方案,攻击者可以用自己的密钥对替换真正的密钥对来启动"中间人"攻击.这就是SSL强迫您通过证书的严格要求的原因.如AES块加密算法不存在这个问题了,但是没有一个PKI,AES不比RSA安全性较差.
公钥加密操作容易受到比AES更多的实现漏洞的影响.例如,RSA交易的双方必须就参数达成一致,这些参数是馈送到RSA方程的数字.攻击者可以替代恶意值来静默禁用加密.对于Diffie Hellman来说也是如此,对于Elliptic Curve来说更是如此.另一个例子是两年前在多个高端SSL实现中发生的RSA Signature Forgery漏洞.
使用公钥证明你正在做一些"与众不同"的事情.与众不同的是您从未想过的加密技术; 除了算法之外,加密设计在被认为是安全的之前已经过多年的审核和测试.
对于希望在其应用程序中使用加密技术的客户,我们提出两项建议:
对于"静止数据",请使用PGP.真!PGP已经被殴打了十多年,被认为是安全的,不会出现愚蠢的实施错误.它有开源和商业变体.
对于"飞行中的数据",请使用TLS/SSL.世界上没有任何安全协议比TLS更好理解和更好的测试; 各地的金融机构都认为它是移动最敏感数据的安全方法.
这是一篇不错的文章 [matasano.com]我和几年前写过的专业密码学家Nate Lawson.它更详细地介绍了这些要点.
使用OpenSSL speed
命令对算法进行基准测试并亲自查看.
[dave@hal9000 ~]$ openssl speed aes-128-cbc Doing aes-128 cbc for 3s on 16 size blocks: 26126940 aes-128 cbc's in 3.00s Doing aes-128 cbc for 3s on 64 size blocks: 7160075 aes-128 cbc's in 3.00s ... The 'numbers' are in 1000s of bytes per second processed. type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes aes-128 cbc 139343.68k 152748.27k 155215.70k 155745.61k 157196.29k [dave@hal9000 ~]$ openssl speed rsa2048 Doing 2048 bit private rsa's for 10s: 9267 2048 bit private RSA's in 9.99s Doing 2048 bit public rsa's for 10s: 299665 2048 bit public RSA's in 9.99s ... sign verify sign/s verify/s rsa 2048 bits 0.001078s 0.000033s 927.6 29996.5