使用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#中正确地完成我想做的事情吗?

使用C#中的RSA加密实现安全通信

这里有两个问题:

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#中的文件(巨大数据)