首页 > 解决方案 > 如何使用非对称密钥对加密和使用对称密钥

问题描述

我有消息需要在发送时进行加密。它们应该只能由接收方解密。

最初,我有一个结构,其中使用接收者的公钥对消息进行加密,然后接收者使用他们的私钥解密他们的消息。但是,由于我使用的是 RSA,因此消息的大小非常有限。

我在想象两种潜在的解决方案,但不太确定如何实施更好的解决方案(选项 2)。

  1. (简单)只需将每条消息分成许多较小的部分,加密并存储它们。这只会改变我的应用程序的查询结构,但不会改变加密结构。

  2. 我可以使用对称密钥对消息进行加密,这样更快并且适用于任何大小。但是,然后我需要用非对称密钥加密该对称密钥。那么问题就变成了我只能在提供非对称私有密钥时解密对称密钥,即当接收者想要读取他们的消息时。那么在那种情况下,我将如何真正加密消息?因为我不希望发件人也能够访问用于解密的密钥。

标签: encryptionrsaprivate-key

解决方案


那么问题就变成了我只能在提供非对称私有密钥时解密对称密钥,即当接收者想要读取他们的消息时。那么在那种情况下,我将如何真正加密消息?

这很简单,您使用临时的、特定于消息的、完全随机的对称密钥进行数据加密,然后再使用公钥对其进行加密。最好在此之后显式销毁对称密钥。您可以在消息的密文之前为已包装(加密)的对称密钥添加前缀,因为它始终具有与模数相同的字节大小(即 RSA 密钥大小,以字节为单位)。

您正在考虑的系统,它比为 RSA 拆分消息要好得多,称为混合密码系统。还有各种其他方法可以完成相同的事情,例如 RSA-KEM 和 - 对于椭圆曲线 - ECIES。不过,两者都不经常出现在加密库中。

如果您决定使用 RSA/AES发送密码,那么我建议您使用 OAEP,例如 AES-CTR 而不是 AES-CBC,因为 RSA PKCS#1 v1.5 填充和 CBC 填充都容易受到填充预言攻击。


强烈建议对消息进行签名,否则攻击者可以加密虚假消息。加密仅用于实现消息的机密性,而不是消息的完整性和真实性。如果可以发送任何消息,对手甚至可以尝试明文预言机攻击。如果您不允许使用您控制的一组私钥,那么您应该先签名然后加密,而不是加密然后签名

与往常一样,如果可以选择传输安全性,则更喜欢 TLS 或其他显式安全传输协议。


推荐阅读