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

时间:2015-08-06 13:46:47

标签: c# encryption cryptography rsa

这是此question项目的延续,但没有Bouncy城​​堡。

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

ANYWAY

我有一台服务器和一台客户端。客户端需要将序列化对象发送到服务器,然后服务器将处理该对象。

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

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

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

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.

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

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

  

更新

修改服务器中的代码

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

新错误

The parameter is incorrect

1 个答案:

答案 0 :(得分:1)

虽然使用加密技术很好,但使用基本加密算法构建自己的系统以进行安全通信是一种不安全因素。对于你在自己的系统中遇到的每一个弱点,你可能已经想到了10个(或更多!)。

因此,我强烈建议使用SSL / TLS来保护您的通信。这应该提供您所需的所有安全性,同时也可以直接集成,因为.NET Framework SslStream具有必要的功能,可以作为serverclient的一部分运行。连接。

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