我想实现一个场景,两个端点可以使用公钥/私钥加密安全地相互通信。场景如下:
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#中做的事情吗?