6

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

RSACryptoServiceProvider rsaEncryption = new RSACryptoServiceProvider(1024);

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

4

2 回答 2

22

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

    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();
            }
        }
    }
于 2012-12-26T23:46:29.813 回答
3

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/

我在微软工作,但这是个人答案,不是微软的答案。

BouncyCastle 的原始帖子(链接

于 2017-12-21T03:25:38.817 回答