PKI和对称加密在性能上有何区别?

16

我们计划在项目中实施高强度的安全要求,需要进行大量高性能的加密操作。

我认为公钥基础设施(PKI)比对称加密更慢、更复杂,但是我找不到数据来支持我的想法。

7个回答

32

纯非对称加密比对称加密(如DES或AES)慢得多,这就是为什么真实应用中使用混合加密的原因:昂贵的公钥操作仅用于加密(和交换)用于加密实际消息的对称算法所需的加密密钥。

公钥加密解决的问题是没有共享密钥。使用对称加密时,您必须信任所有相关方保持密钥机密。这个问题比性能问题更加重要(可以通过混合方法来缓解性能问题)。


32
在运行OS X 10.5.5和一个原始版本的OpenSSL的Macbook上,“openssl speed”将AES-128-CBC时钟速度计为每秒46,000个1024位块。同一台电脑将1024位RSA时钟速度计为每秒169个签名。AES-128-CBC是“教科书”块加密算法,而RSA 1024是“教科书”公钥算法。“苹果和橙子”之间的比较,但答案是:RSA要慢得多
然而,这并不是您不应该使用公钥加密的原因。以下才是真正的原因:
  1. 公钥密码操作不适用于原始数据加密。像Diffie-Hellman和RSA这样的算法被设计为交换块密码算法的密钥。因此,例如,您可以使用安全的随机数生成器生成一个128位的随机密钥用于AES,并使用RSA加密这16个字节。

  2. 像RSA这样的算法比AES不太“用户友好”。使用随机密钥,您提供给AES的明文块将对没有密钥的任何人都是随机的。但这并不适用于RSA,它与AES相比只是一个数学方程式。因此,除了正确存储和管理密钥外,您还必须非常小心地格式化RSA明文块的方式,否则就会出现漏洞。

  3. 没有密钥管理基础设施公钥是无法工作的。如果您没有验证公钥的计划,攻击者可以将他们自己的密钥对替换为真实的密钥对,以发起“中间人”攻击。这就是为什么SSL强制您通过证书的复杂程序的原因。块密码算法例如AES也会遇到这个问题,但是如果没有PKI,则AES的安全性与RSA一样。

  4. 公钥加密操作比AES更容易受到实现漏洞的影响。 例如,RSA事务的双方都必须就要传递给RSA方程的参数达成一致。攻击者可以替换恶意值来悄悄地禁用加密。Diffie Hellman同样如此,而Elliptic Curve则更加如此。另一个例子是在多个高端SSL实现中发生的RSA签名伪造漏洞,该漏洞发生在两年前。

  5. 使用公钥是表明你正在做一些“不寻常”的事情的证据。在密码学中超出寻常范围的事情正是您绝对不想做的事情;除了算法之外,密码学设计在被视为安全之前要经过数年的审核和测试。

对于想要在其应用程序中使用密码学的客户,我们提出两个建议:

  • 对于“静态数据”,请使用PGP。真的!PGP已经被批评了十多年,并被认为是免受愚蠢的实现错误的安全方式。它有开源和商业版本。

  • 对于“动态数据”,请使用TLS / SSL。世界上没有比TLS更为了解和经过更好的测试的安全协议;金融机构普遍接受它作为移动最敏感数据的安全方法。

这里有一篇不错的文章 [matasano.com],我和专业的密码学家Nate Lawson在几年前写过。它详细介绍了这些要点。


2
看起来你的写作链接已经失效了。 - skiwi
RSA 1024不能提供AES-128的安全性。您不应该为RSA原语自己构建消息;找到一个能正确执行此操作的库。我不明白您在RSA上下文中所说的参数是什么意思。您能否提供RSA“恶意”参数的具体示例?公钥加密是当今最普遍的加密方式,用于每个HTTPS请求。使用混合加密是不寻常的,当CMS或TLS等标准支持它时,通常会被忽视,并且不太可能得到实现的支持。 - erickson

12

使用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

4
实用的PKI加密系统使用非对称加密来加密对称密钥,然后使用该密钥进行对称加密以加密数据(话虽如此,有人会指出反例)。
因此,与对称加密相比,非对称密码算法所带来的额外开销是固定的 - 它不取决于数据大小,而只取决于密钥大小。
上次我测试时,在运行速度为100MHz左右的ARM处理器上验证大约3个X.509证书链[编辑添加:和它们签署的数据]只需要花费不到一秒钟的时间(显然是平均多次重复)。我记不清具体细节了,但总之除非你在一个非常受限制的系统上或者需要执行大量加密操作(比如想要每秒接受尽可能多的SSL连接),否则NIST批准的非对称加密方法是快速的。

在2013年Bullrun事件曝光后,“NIST认证”这个词几乎成了一个笑话。它们虽然快速(但也许会泄露你的数据给NSA)。 - polkovnikov.ph
我的意思是那个答案现在看来已经过时了 :) - polkovnikov.ph
是的,我认为我只提到NIST是为了将话题领域限制在“人们”大多使用的PKI上。当然可以挖掘或发明极其缓慢的PKI协议(我不知道,添加一个密钥拉伸步骤或其他方式使其尽可能缓慢)。但是,2008年实际使用的这些性能有时对管理数百或数千个连接的服务器构成问题,但对处理少数连接的客户端并不真正构成问题。2008年的任何给定算法是否仍然适用于现在完全是另一回事。 - Steve Jessop

2

0

是的,像PGP、TLS和CMS这样的标准加密方案提供的混合加密确实会对每个消息或会话产生固定的性能成本。这种影响有多大取决于所选算法以及您所讨论的操作。

对于RSA,解密和签名操作相对较慢,因为它需要使用具有大私有指数的模幂运算。另一方面,RSA加密和签名验证非常快,因为它使用小的公共指数。这种差异随着密钥长度的增加呈二次比例。

在ECC下,由于同级别的人使用相似大小的密钥进行相同的数学计算,因此操作比RSA更平衡。在集成加密方案中,可以生成一个临时的EC密钥,并在密钥协商算法中使用;这需要发送者进行一些额外的工作。ECDH密钥协商比RSA加密要慢得多,但比RSA解密要快得多。

就相对数字而言,使用AES进行解密可能比使用RSA进行解密快100,000倍。就绝对数字而言,根据硬件的不同,AES可能需要每个块几个纳秒,而RSA则需要1到2毫秒。这引发了一个问题,为什么有人会使用非对称算法呢?

答案是这些算法在混合加密方案中一起使用,用于不同的目的。像AES这样快速的对称算法用于保护消息本身,而RSA这样慢速的非对称算法则用于保护对称算法所需的密钥。这就允许之前从未共享过任何秘密信息的各方(比如你和搜索引擎)之间进行安全通信。

0

也许您可以添加一些关于您的项目的详细信息,以便获得更高质量的答案。您试图保护什么?来自谁?如果您能解释安全要求,您将得到更好的答案。如果加密机制没有保护您认为应该保护的内容,那么性能就没有多大意义。

例如,X509证书是保护客户端/服务器端点的工业标准方式。PGP装甲可用于保护许可文件。对于简单性而言,使用Perl或Java中的Cipher block chaining和Blowfish(以及其他密码)易于使用,如果您控制两个端点。

谢谢。


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