这里有人提到非对称加密可能不适合批量数据,并给出了一个 100 字节的 RSA 示例。当然,我知道这是一个粗略的例子。但这让我很好奇——各种公钥加密一般可以处理多少数据,以及像 OpenPGP.js 这样的 JavaScript 库具体可以处理多少。在后一种情况下,浏览器环境是否增加了更多限制?
补充:
是否有任何知名的在线资源对各种公钥密码的数据大小限制进行讨论/比较?
这里有人提到非对称加密可能不适合批量数据,并给出了一个 100 字节的 RSA 示例。当然,我知道这是一个粗略的例子。但这让我很好奇——各种公钥加密一般可以处理多少数据,以及像 OpenPGP.js 这样的 JavaScript 库具体可以处理多少。在后一种情况下,浏览器环境是否增加了更多限制?
补充:
是否有任何知名的在线资源对各种公钥密码的数据大小限制进行讨论/比较?
为了回答你的问题,首先必须纠正你的误解。在大多数情况下,RSA 中的填充会为消息添加 11 个字节。因此,使用 1024 位密钥,您将有 117 个字节可用于消息。这就是为什么 RSA 通常不用于加密消息,它主要用于加密用于加密消息的对称密钥。这称为混合密码系统。
例如,在 PGP 中,创建了一个对称密钥(sK),消息用sK加密,然后sK用公钥加密,两者(加密的消息和加密的sK)都发送给接收者。接收者将使用他的私钥来解密sK并使用它来解密消息。
从技术上讲,PGP(因此,OpenPGP.js)可以处理的消息大小没有限制。限制可能来自可用内存量、浏览器可利用的内存量等。
每种算法都有其自身的局限性。正如@Adnan 所引用的那样,RSA(带有 PKCS#1 v1.5 填充)的顶部比 RSA 模数大小少 11 个字节。其他算法可能具有不同的属性。
特别是,使用Diffie-Hellman,您根本不加密,但您仍然可以将其用于非对称加密。考虑 DH 的一种方法是,它是一种非对称加密算法,您无法选择加密的内容:当您运行算法时,加密的一方最终会了解他实际“加密”的内容。然而,这对于混合加密来说已经足够了:共享密钥非常适合用作对称加密的密钥。这个过程已经以自己的名称形式化:IES(具有称为 ECIES 的椭圆曲线变体)。
请注意,您加密是因为您想保持数据机密性,并且大多数重视保密性的攻击模型也是重视完整性的攻击模型(仅被动攻击者很少见)。单独的加密并不能完成全部工作,因此无论如何通常都需要算法的组合。