如何使用非对称密钥对加密和使用对称密钥
How to encrypt and use a symmetric key with an asymmetric key pair
我有一些消息在发送时需要加密。它们应该只能由接收者解密。
最初,我有一个结构,其中消息使用接收者的 public 密钥加密,然后接收者使用他们的私钥解密他们的消息。但是,由于我使用的是 RSA,因此邮件的大小非常有限。
我正在设想两种可能的解决方案,但不太确定如何实施更好的解决方案(选项 2)。
(简单)只需将每条消息拆分成许多较小的部分,加密并存储它们。这只会改变我的应用程序的查询结构,但不会改变加密结构。
我可以用对称密钥加密消息,这样速度更快并且适用于任何大小。但是,我随后需要使用非对称密钥对该对称密钥进行加密。那么问题就变成了我只能在提供非对称私有密钥时解密对称密钥,即当接收方想要读取他们的消息时。那么在那种情况下,我将如何真正加密消息?因为我不希望发件人也能够访问用于解密的密钥。
The problem then becomes that I can only decrypt the symmetric key when the asymmetric private one is provided, ie when the receiver wants to read their messages. So in that case, how would I actually encrypt the messages?
这很简单,您使用临时的、消息特定的、完全随机的对称密钥进行数据加密 ,然后 使用 public 密钥对其进行加密。最好在那之后明确销毁对称密钥。您可以在消息的密文之前加上包装(加密)对称密钥的前缀,因为它的字节大小始终与模数相同(即 RSA 密钥大小以字节为单位)。
您正在考虑的系统被称为混合密码系统,它比为 RSA 拆分消息要好得多。还有各种其他方法可以完成相同的事情,例如 RSA-KEM 和 - 对于椭圆曲线 - ECIES。不过,两者都不经常出现在加密库中。
如果您决定使用 RSA/AES 来 发送 密码,那么我建议您使用 OAEP,例如AES-CTR 而不是 AES-CBC,因为 RSA PKCS#1 v1.5 填充和 CBC 填充都容易受到填充 oracle 攻击。
强烈建议签署消息,否则对手可以加密虚假消息。加密仅用于实现消息机密性,而不是消息完整性和真实性。如果可以发送任何消息,对手甚至可能会尝试 纯文本 oracle 攻击 。如果您不允许您控制的一组私钥,那么您应该先签名然后加密,而不是加密-然后签名.
一如既往,如果传输安全是一种选择,则首选 TLS 或其他显式安全传输协议。
我有一些消息在发送时需要加密。它们应该只能由接收者解密。
最初,我有一个结构,其中消息使用接收者的 public 密钥加密,然后接收者使用他们的私钥解密他们的消息。但是,由于我使用的是 RSA,因此邮件的大小非常有限。
我正在设想两种可能的解决方案,但不太确定如何实施更好的解决方案(选项 2)。
(简单)只需将每条消息拆分成许多较小的部分,加密并存储它们。这只会改变我的应用程序的查询结构,但不会改变加密结构。
我可以用对称密钥加密消息,这样速度更快并且适用于任何大小。但是,我随后需要使用非对称密钥对该对称密钥进行加密。那么问题就变成了我只能在提供非对称私有密钥时解密对称密钥,即当接收方想要读取他们的消息时。那么在那种情况下,我将如何真正加密消息?因为我不希望发件人也能够访问用于解密的密钥。
The problem then becomes that I can only decrypt the symmetric key when the asymmetric private one is provided, ie when the receiver wants to read their messages. So in that case, how would I actually encrypt the messages?
这很简单,您使用临时的、消息特定的、完全随机的对称密钥进行数据加密 ,然后 使用 public 密钥对其进行加密。最好在那之后明确销毁对称密钥。您可以在消息的密文之前加上包装(加密)对称密钥的前缀,因为它的字节大小始终与模数相同(即 RSA 密钥大小以字节为单位)。
您正在考虑的系统被称为混合密码系统,它比为 RSA 拆分消息要好得多。还有各种其他方法可以完成相同的事情,例如 RSA-KEM 和 - 对于椭圆曲线 - ECIES。不过,两者都不经常出现在加密库中。
如果您决定使用 RSA/AES 来 发送 密码,那么我建议您使用 OAEP,例如AES-CTR 而不是 AES-CBC,因为 RSA PKCS#1 v1.5 填充和 CBC 填充都容易受到填充 oracle 攻击。
强烈建议签署消息,否则对手可以加密虚假消息。加密仅用于实现消息机密性,而不是消息完整性和真实性。如果可以发送任何消息,对手甚至可能会尝试 纯文本 oracle 攻击 。如果您不允许您控制的一组私钥,那么您应该先签名然后加密,而不是加密-然后签名.
一如既往,如果传输安全是一种选择,则首选 TLS 或其他显式安全传输协议。