使用C#中的RSA加密实现安全通信
本文关键字:实现 安全 通信 加密 RSA 中的 使用 | 更新日期: 2023-09-27 18:28:40
我想实现一个场景,其中两个端点可以使用公钥/私钥加密安全地相互通信。场景如下:
对于A向B:发送消息
A使用A的私钥对消息进行加密。
A使用B的公钥对消息进行加密。
A发送消息。
B收到消息。
B使用A的公钥对消息进行解密。
B使用B的私钥对消息进行解密。
B读到信息。
以下是我在C#中使用RSA加密的内容:
// Alice wants to send a message to Bob:
String plainText = "Hello, World!";
Byte[] plainData = Encoding.Default.GetBytes(plainText);
Byte[] cipherData = null;
RSACryptoServiceProvider alice = new RSACryptoServiceProvider();
RSACryptoServiceProvider bob = new RSACryptoServiceProvider();
var alicePrivateKey = alice.ExportParameters(true);
var alicePublicKey = alice.ExportParameters(false);
var bobPrivateKey = bob.ExportParameters(true);
var bobPublicKey = bob.ExportParameters(false);
RSACryptoServiceProvider messenger = new RSACryptoServiceProvider();
messenger.ImportParameters(alicePrivateKey);
cipherData = messenger.Encrypt(plainData, true);
messenger.ImportParameters(bobPublicKey);
cipherData = messenger.Encrypt(cipherData, true);
messenger.ImportParameters(alicePublicKey);
cipherData = messenger.Decrypt(cipherData, true);
messenger.ImportParameters(bobPrivateKey);
cipherData = messenger.Decrypt(cipherData, true);
String result = Encoding.Default.GetString(alice.Decrypt(cipherData, true));
显然,以下几行有问题:
messenger.ImportParameters(bobPublicKey);
cipherData = messenger.Encrypt(cipherData, true);
它抛出System.Security.Cryptography.CryptographyException,消息为{"Bad Length"}。
正如我所看到的,它不能仅仅使用bob密钥的公共部分来加密数据。
有人能告诉我如何在C#中正确地完成我想做的事情吗?
这里有两个问题:
A) 您的协议设计错误。如果你想使用RSA交换消息,算法是这样的:
A使用B的公钥加密消息
A发送消息
B使用B的专用密钥解密消息
(B处理)
B使用A的公钥加密消息
B发送消息
A使用A的专用密钥解密消息
等等。注意A不知道B的私钥,反之亦然。公钥和私钥以这样一种方式相关,即用公钥加密的消息(每个人都知道)只能用相应的私钥解密(只有加密消息的有意接收者知道)。实际上,这就是RSA的全部要点。
至于C#中的实现,一旦您真正理解了底层概念,就可以轻松地处理Crypto类。请参阅此处和此处的示例。
B) RSA非常适合交换少量数据。它用于在不安全的通道上进行密钥交换,而不需要共享秘密。为了交换"正常"数据,使用了对称算法,如AES。因此,我们的想法是从a生成一个随机密码短语和IV,并通过RSA将其发送给B,如a中所述;在双方都知道密码短语和IV之后,他们可以使用共享密钥使用AES加密数据。
这就是SSL的作用,您应该有充分的理由推出自己的SSL流,而不是使用标准的SSL流。
RSA用于加密小于密钥的数据。您使用对称密钥加密大量数据,然后使用RSA共享对称密钥。
有关更多详细信息,您可能会提到这个问题:如何使用RSA加密C#中的文件(巨大数据)