【问题标题】:Get the public key from RSACryptoServiceProvider?从 RSACryptoServiceProvider 获取公钥?
【发布时间】:2012-12-12 10:07:01
【问题描述】:

我正在尝试使用公钥加密与客户端和服务器进行通信。服务器应该生成一个 1024 位的公钥并将其发送给客户端,客户端将使用该密钥将加密数据发送回服务器。到目前为止,我已经用这个初始化了 RSACryptoServiceProvider:

RSACryptoServiceProvider rsaEncryption = new RSACryptoServiceProvider(1024);

现在,我知道我可以使用ExportParameters 从 RSACryptoServiceProvider 获取指数和模数。但是,我想知道,我如何使用这些数据将公钥发送回客户端(这也将使用RSACryptoServiceProvider),以及客户端如何使用这些数据加密某些内容以发回给我? 还是我这样做完全错了?

【问题讨论】:

    标签: c# encryption rsa


    【解决方案1】:

    您的逻辑似乎没问题,您似乎只需要一些示例代码。

        using System;
        using System.Security.Cryptography;
        using System.Text;
    
        namespace RSA
        {
            class Program
            {
                static void Main(string[] args)
                {
                    try
                    {
                        var rsaServer = new RSACryptoServiceProvider(1024);
                        var publicKeyXml = rsaServer.ToXmlString(false);
    
                        var rsaClient = new RSACryptoServiceProvider(1024);
                        rsaClient.FromXmlString(publicKeyXml);
    
                        var data = Encoding.UTF8.GetBytes("Data To Be Encrypted");
    
                        var encryptedData = rsaClient.Encrypt(data, false);
                        var decryptedData = rsaServer.Decrypt(encryptedData, false);
    
                        Console.WriteLine(Encoding.UTF8.GetString(decryptedData));
    
                        Console.WriteLine("OK");
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                    Console.Read();
                }
            }
        }
    

    【讨论】:

      【解决方案2】:

      1 - 在您的密钥中使用 >= 2048 位来保护您的密钥,直到 2025 年。

      以上是 2012 年的,但我在尝试为 Putty / Linux 服务器连接创建 ssh-rsa 密钥时遇到了它。

      我刚刚解决了以正确格式创建公共 ssh-rsa 密钥以匹配 PuttyGen 的类似问题。

      对于 Microsoft .net RSACryptoServiceProvider,它看起来像这样

                  RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(3072);
                  byte[] sshrsa_bytes = Encoding.Default.GetBytes("ssh-rsa");
                  byte[] n = RSA.ExportParameters(false).Modulus;
                  byte[] e = RSA.ExportParameters(false).Exponent;
                  string buffer64;
                  using (MemoryStream ms = new MemoryStream())
                  {
                      ms.Write(ToBytes(sshrsa_bytes.Length), 0, 4);
                      ms.Write(sshrsa_bytes, 0, sshrsa_bytes.Length);
                      ms.Write(ToBytes(e.Length), 0, 4);
                      ms.Write(e, 0, e.Length);
                      ms.Write(ToBytes(n.Length+1), 0, 4); //Remove the +1 if not Emulating Putty Gen
                      ms.Write(new byte[] { 0 }, 0, 1); //Add a 0 to Emulate PuttyGen (remove it not emulating)
                      ms.Write(n, 0, n.Length);
                      ms.Flush();
                      buffer64 = Convert.ToBase64String(ms.ToArray());
                  }
      
                  string pubssh = string.Format("ssh-rsa {0} generated-key", buffer64);
      

      你可以看到我用于测试的私钥和putty gen源代码链接https://www.cameronmoten.com/2017/12/21/rsacryptoserviceprovider-create-a-ssh-rsa-public-key/

      我在 Microsoft 工作,但这是个人回答,不是 Microsoft 回答。

      BouncyCastle (Link) 的原始帖子

      【讨论】:

      • 您不必提及您在哪里工作,因为它与问题无关。除非另有说明来源,否则此处的任何答案都是个人的。
      猜你喜欢
      • 1970-01-01
      • 2019-05-28
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 2013-03-20
      • 1970-01-01
      相关资源
      最近更新 更多