gpt4 book ai didi

c# - 在C#中使用RSA加密实现安全通信

转载 作者:太空宇宙 更新时间:2023-11-03 20:27:21 25 4
gpt4 key购买 nike

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

A给B发消息:

A encrypts the message using A's private key.

A encrypts the message using B's public key.

A sends the message.

B receives the message.

B decrypts the message using A's public key.

B decrypts the message using B's private key.

B reads the message.

这是我在 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 key 的公共(public)部分无法加密数据。

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

最佳答案

这里有两个问题:

A) 你的协议(protocol)设计是错误的。如果要使用RSA来交换消息,算法是这样的:

A 使用 B 的公钥加密消息

A发送消息

B 使用 B 的私钥解密消息

(B做处理)

B 使用 A 的公钥加密消息

B发送消息

A 使用 A 的私钥解密消息

等等。注意 A 是如何不知道 B 的私钥的,反之亦然。公钥和私钥的关联方式是,用公钥(每个人都知道)加密的消息只能用相应的私钥(只有加密消息的预期接收者知道)才能解密。实际上,这就是 RSA 的重点。

至于在 C# 中的实现,一旦您真正理解了底层概念,使用 Crypto 类就非常简单了。参见示例 herehere .

B) RSA 适用于交换少量数据。它旨在通过不安全的 channel 进行 key 交换,而无需共享 secret 。为了交换“正常”数据,使用了 AES 等对称算法。所以这个想法是从 A 生成一个随 secret 码和 IV,然后按照 A 中讨论的那样通过 RSA 将其发送给 B;双方知道密码和 IV 后,他们可以使用 AES 和共享 key 加密数据。

这就是 SSL 的作用,您应该有充分的理由推出自己的而不是使用标准 SSL 流。

关于c# - 在C#中使用RSA加密实现安全通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9834984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com