【问题标题】:Implement secure communication using RSA encryption in C#在 C# 中使用 RSA 加密实现安全通信
【发布时间】:2012-04-07 18:20:26
【问题描述】:

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

让 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# encryption cryptography rsacryptoserviceprovider


    【解决方案1】:

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

    更多细节你可以参考这个问题:how to use RSA to encrypt files (huge data) in C#

    【讨论】:

    • 这意味着,我不能使用 RSA 来实现我希望实现的场景。你能举出一个很好的例子来说明如何在 C# 中实现给定的场景吗?
    • 该示例用于对称密钥加密。我想实现公钥/私钥加密。
    • 我相信这个想法是使用公钥/私钥加密来共享对称密钥。
    • 你的意思是说,我应该使用这个算法来共享一个对称密钥,一旦它被共享,使用该共享密钥使用对称密钥加密开始通信?
    • 这有帮助。谢谢你,Manoj。
    【解决方案2】:

    这里有两个问题:

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

    A 使用 B 的 public 密钥加密消息

    A 发送消息

    B 使用 B 的 private 密钥

    解密消息

    (B做处理)

    B 使用 A 的 public 密钥对消息进行加密

    B 发送消息

    A 使用 A 的 private 密钥

    解密消息

    等等。注意 A 是如何不知道 B 的私钥的,反之亦然。公钥和私钥以这样一种方式相关,即使用公钥(每个人都知道)加密的消息只能用相应的私钥(只有加密消息的预期接收者知道)才能解密。实际上,这就是 RSA 的全部意义所在。

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

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

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

    【讨论】:

    • “注意 A 不知道 B 的私钥,反之亦然。” - 我同意。但是,请注意 A 不会尝试访问 B 的私钥。 A 使用 1) B 的公钥加密消息,以便 B 可以使用其私钥和 2) A 的私钥,以便 B 可以使用 A 的公钥解密并确保它来自 A。
    • 我知道 SSL 并且我更喜欢使用它而不是任何自定义实现。但是,就我而言,我正在尝试创建一个可用于安全 IPC 通信的工作原型。我的原型针对的是单机场景。
    • 但你是说'A 使用 A 的私钥加密 X' - 这不是它的工作方式。公钥用于加密,私钥用于解密。
    • 双重加密(在问题中)意味着有一个隐式签名(基于用A的私钥加密)。
    • Alice 用 Alice 的私钥和 Bob 的公钥加密消息是完全合法的。当 Bob 用他的私钥解密消息时,他知道只有他可以阅读该消息。当他用 Alice 的公钥解密得到的消息时,他知道它来自 Alice。然而,通常 Alice 会改为对消息进行 hash,用她的私钥对 hash 进行签名,然后将签名后的 hash 发送给 Bob。
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 2011-12-20
    相关资源
    最近更新 更多