c# - 在 C# 中使用 RSA 加密套接字通信

标签 c# sockets encryption

我目前正在尝试实现一个套接字服务器,使客户端能够发送一些命令来启动和停止服务器提供的各种服务。我让客户端和服务器之间的通信运行起来,并让服务器响应客户端发送的命令。下一步是加密客户端和服务器之间的通信。我正在尝试使用 RSACryptoServiceProvider 完成此操作。

这是我用来加密数据的代码:

CspParameters parameter = new CspParameters();
parameter.KeyContainerName = "keycontainer";
rsaProvider = new RSACryptoServiceProvider(parameter);
StreamReader r = new StreamReader(@"C:\tmp\rsakey.xml");
rsaProvider.FromXmlString(r.ReadToEnd());
string command = "server reply goes here";
ASCIIEncoding bc = new ASCIIEncoding();
byte[] cmd = rsaProvider.Encrypt(bc.GetBytes(command), false);
handler.Send(cmd);

这是我用来解密命令的代码

rsaProvider = new RSACryptoServiceProvider(parameter);
StreamReader r = new StreamReader(@"C:\tmp\rsakey.xml");
string xml = r.ReadToEnd();
rsaProvider.FromXmlString(xml);
ASCIIEncoding bc = new ASCIIEncoding();
string test = bc.GetString(state.buffer);
byte[] tmp = rsaProvider.Decrypt(bc.GetBytes(test), false);

我尝试在加密后直接解密我的字符串,并且成功了。但是从客户端到服务器的传输或反向传输不起作用,Decrypt 函数抛出一个异常,告诉我要解密的数据超过模块的最大值。

加密客户端和服务器之间流量的正确方法是什么?

最佳答案

非对称加密(例如使用 RSA)仅适用于短消息。使用 1024 位 RSA key (典型大小),最大输入消息大小为 117 字节。

“正常”设置是选择一个随 secret 钥(即一堆随机位),使用 RSA 加密该 key ,然后对称加密消息的其余部分(即使用对称使用该 key 的密码,例如 AES)。对称密码没有这样的大小限制,而且无论如何都比非对称加密快得多。

现在碰巧的是,即使理论看起来很简单,也有很多细节可能会导致实现在许多方面出错,包括使代码看起来正常运行,同时对攻击持开放态度(使用密码学的目的是抵御攻击)。因此,正确的方法是使用已经涵盖这些细节的现有协议(protocol),以及为此设计和调整的实现。最常见的协议(protocol)是 TLS(也称为 SSL)。 C#/.NET 似乎带有 System.Net.Security.SslStream 类,这可能正是您想要的。

关于c# - 在 C# 中使用 RSA 加密套接字通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2468979/

相关文章:

c# - 表达混合彩色区域

c# - cocoaasynsocket到C Sharp服务器

c# - 从 View 模型 (WPF) 调用 View 中的动画

java - FileUtils.readFileToString() 如何处理换行符?

java - Retrofit2拦截器在Android中将特殊字符转换为问号

c# - 使用 WebBrowser Winforms 控件通过 SSL 访问内网

node.js - 为什么在 Node.js 中尝试重新连接 TCP 连接后会收到 ECONNREFUSED 错误?

c++ - 鉴于此示例,与使用多线程或进程相比,轮询设计对我有何好处?

c - Linux errno 23 和 Linux errno 24 的区别

math - 如何创建自己的密码,而不是使用常见的密码(例如 AES 或河豚双鱼)?