1

我想实现一个场景,两个端点可以使用公钥/私钥加密安全地相互通信。场景如下:

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和 message { "Bad Length" }

正如我所看到的,它无法仅使用鲍勃密钥的公共部分来加密数据。

有人可以说明如何正确完成我想在C#中做的事情吗?

4

2 回答 2

4

这里有两个问题:

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 流。

于 2012-03-23T08:18:23.483 回答
1

RSA 用于加密小于密钥的数据。您使用对称密钥加密大量数据,然后使用 RSA 共享对称密钥。

有关更多详细信息,您可以参考这个问题:how to use RSA to encrypt files (huge data) in C#

于 2012-03-23T06:48:06.550 回答