RSA(客户端加密/服务器解密)

RSA (client side encryption/ server decryption)

这是此 question 中项目的延续,但没有充气城堡。

所以我决定废弃 Bouncy Castle(可惜,我喜欢这个名字)

无论如何

我有一个服务器和一个客户端。客户端需要发送一个序列化的对象给服务器,服务器会处理这个对象。

它会这样做,但是我想在过程中添加加密。但是没有存储文件或类似的东西。该过程需要基于会话(在某种意义上)

因此,客户端会向服务器请求一个密钥,服务器会生成一个密钥对并将密钥发送给客户端。

客户端然后使用此密钥加密对象

string key = ASCIIEncoding.ASCII.GetString(RequestKey(tcpclnt));
var RsaClient =new RSACryptoServiceProvider(2048);
while (key.Length > 0) {
     RsaClient.FromXmlString(key);
     var transmit = ASCIIEncoding.ASCII.GetBytes(stringtosend);
                  var encrypted = RsaClient.Encrypt(transmit,false);

服务器然后接收这些加密字节并尝试解密它们

 raw = Receive(clientSocket);
 byte[] r = TrimBytes(ASCIIEncoding.ASCII.GetBytes(raw),256);
 var sdecrypted = ASCIIEncoding.ASCII.GetString(RsaServer.Decrypt(r, false));

但是,唉,服务器不能这样做。解密时会抛出错误

Key does not exist.

所以,我的问题是,我做错了什么?

非常感谢您提供的任何帮助。

UPDATE

更改了服务器中的代码

var RSAKeyInfo = new RSACryptoServiceProvider(2048, new CspParameters(1)).ExportParameters(true);

新错误

The parameter is incorrect

虽然作为使用密码学的练习很好,但使用基本的密码算法来构建您自己的安全通信系统是一种不安全因素。对于您在自己的系统中解决的每一个弱点,可能有 10 个(或更多!)您甚至都没有想到。

因此,我强烈建议使用 SSL/TLS 来保护您的通信。这应该提供您需要的所有安全性,同时还可以直接集成为连接的 .NET Framework SslStream has the necessary functionality to operate as either the server or client 端。

这样做还允许您在将来有选择地使用其他安全机制,例如基于证书的客户端身份验证,只需最少的额外工作。