C# 仅使用公钥创建非对称密码密钥对

C# 仅使用公钥创建非对称密码密钥对,c#,encryption,bouncycastle,C#,Encryption,Bouncycastle,我有点问题。我正在尝试编写一个客户机-服务器应用程序(实际上更像是POC),客户机从服务器请求公钥,然后服务器生成这个密钥asymmetricipherkeypair,如下所示 private static AsymmetricCipherKeyPair GenerateKeyPair() { RsaKeyPairGenerator g = new RsaKeyPairGenerator(); g.Init(new KeyGenerationParameters(

我有点问题。我正在尝试编写一个客户机-服务器应用程序(实际上更像是POC),客户机从服务器请求公钥,然后服务器生成这个密钥
asymmetricipherkeypair
,如下所示

    private static AsymmetricCipherKeyPair GenerateKeyPair() {
      RsaKeyPairGenerator g = new RsaKeyPairGenerator();
      g.Init(new KeyGenerationParameters(new SecureRandom(), 1024));
      var pair = g.GenerateKeyPair();
      return pair;
}
 static string EncryptString(string key, string message) {
        string res = "";
        using (var rsa = new RSACryptoServiceProvider(128)) {
            try {
                rsa.FromXmlString(string.Format("<RSAKeyValue>{0}</RSAKeyValue>", key));
                byte[] b = Encoding.ASCII.GetBytes(message);
                var encryptedData = rsa.Encrypt(b, true);
                var base64Encrypted = Convert.ToBase64String(encryptedData);
                res = base64Encrypted;
            }
            catch (Exception ex) {
            }
            finally {
                rsa.PersistKeyInCsp = false;
            }
            return res;
        }
    }
这会正确地生成并可以正确地加密(在服务器端,但这不符合目的)

然后我向客户端发送一个序列化公钥

    private static byte[] SerialisePublic(AsymmetricCipherKeyPair keypair) {
    SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keypair.Public);
    byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
    return serializedPublicBytes;
}
    private static void SendBytes(TcpClient client, byte[] send) {
    NetworkStream stream = client.GetStream();
    stream.Write(send, 0, send.Length);
    stream.Flush();
}
但是现在,当我尝试初始化另一端的
密钥对时,我需要一个私钥(这也会破坏目的)

我尝试了以下方法

    private static AsymmetricCipherKeyPair GenerateKeyPair() {
      RsaKeyPairGenerator g = new RsaKeyPairGenerator();
      g.Init(new KeyGenerationParameters(new SecureRandom(), 1024));
      var pair = g.GenerateKeyPair();
      return pair;
}
 static string EncryptString(string key, string message) {
        string res = "";
        using (var rsa = new RSACryptoServiceProvider(128)) {
            try {
                rsa.FromXmlString(string.Format("<RSAKeyValue>{0}</RSAKeyValue>", key));
                byte[] b = Encoding.ASCII.GetBytes(message);
                var encryptedData = rsa.Encrypt(b, true);
                var base64Encrypted = Convert.ToBase64String(encryptedData);
                res = base64Encrypted;
            }
            catch (Exception ex) {
            }
            finally {
                rsa.PersistKeyInCsp = false;
            }
            return res;
        }
    }

更新3

所以这不起作用,
PublicKeyFactory
似乎不喜欢返回的密钥 正在GetInstance:Org.BouncyCastle.Asn1.DerApplicationSpecific中抛出:
未知对象

我认为这可能是服务器端序列化和客户端反序列化的问题

因此,当客户端连接到服务器时,可以使用
加密流来传输公钥和附加身份验证(密码短语、秘密敲门或笑话)

请继续关注



我不明白,您是否希望客户端和服务器同时拥有公钥和私钥?为什么?嗨,安德鲁,不,我不知道。我的意图是将公钥传递给客户机,然后客户机使用公钥加密数据并将其发送回服务器。然后服务器解密这些数据并对其进行处理。这是我第一次尝试使用加密和Bouncy Castle库。要初始化AsymmetricipherKeyPair,它需要两个参数(公钥和私钥),这两个参数都是只读的(因此需要另一个快速破解)。我对BouncyCastle库一无所知。但是,它必须允许您仅使用公钥加密消息。否则就没有意义了。请看这个问题:您的评论让齿轮转动,用正确的加密引擎初始化代码更新。我不明白,您是否希望客户端和服务器同时拥有公钥和私钥?为什么?嗨,安德鲁,不,我不知道。我的意图是将公钥传递给客户机,然后客户机使用公钥加密数据并将其发送回服务器。然后服务器解密这些数据并对其进行处理。这是我第一次尝试使用加密和Bouncy Castle库。要初始化AsymmetricipherKeyPair,它需要两个参数(公钥和私钥),这两个参数都是只读的(因此需要另一个快速破解)。我对BouncyCastle库一无所知。但是,它必须允许您仅使用公钥加密消息。看这个问题:你的评论让齿轮转动,用正确的加密引擎初始化代码更新。