【问题标题】:RSA (client side encryption/ server decryption)RSA(客户端加密/服务器解密)
【发布时间】:2015-10-29 16:55:45
【问题描述】:

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

所以我决定废弃充气城堡(可惜,我喜欢这个名字)

无论如何

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

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

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

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

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

【问题讨论】:

  • 服务器是否有相同的cryptoservice rsaclient密钥集?
  • @BugFinder :我假设是这样,它加载服务器提供的 xml var RsaClient =new RSACryptoServiceProvider(2048); while (key.Length > 0) { RsaClient.FromXmlString(key);
  • 听起来确实好像没有看到解密它的密钥
  • 它可能,但这取决于你如何处理服务器,我猜......因为你肯定有每个 tcpclient 的潜在密钥?以及“requestkey”中的内容
  • 为什么要使用自己的(不安全的)密码系统,而不是使用 SSL 等既定机制?

标签: c# encryption cryptography rsa


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多