RSACryptoServiceProvider, SSLStream(OpenSSL) -加密,解密

本文关键字:加密 解密 OpenSSL SSLStream RSACryptoServiceProvider | 更新日期: 2023-09-27 18:10:01

服务器端认证后,使用openssl证书:

sslStream.AuthenticateAsClient(serverName); 

客户端的数据加密由以下代码完成:

    string messsage = "teste123.<EOF>";
    byte[] messageRSA = ConvertByte.GetBytes(messsage);
    RSACryptoServiceProvider asr = new RSACryptoServiceProvider(2048);
    var publicKey = asr.ExportParameters(false);
    var csp = new RSACryptoServiceProvider();
    csp.ImportParameters(publicKey);
    messageRSA = csp.Encrypt(messageRSA, false);


数据通过一个SSLStream,如下所示:

sslStream.Write(messageRSA);
sslStream.Flush();


服务器将接收数据。:

byte[] bytes = new byte[2048];
bytes = sslStream.Read(buffer, 0, buffer.Length);


我已经创建了一个方法来清理缓冲区,因为"2048"的大小,我将有很多我不需要的"0"值,só使用这个方法,我清理了所有我不需要的0

RSACryptoServiceProvider asr = new RSACryptoServiceProvider(2048);
var privateKey = asr.ExportParameters(true);
var csp = new RSACryptoServiceProvider();
csp.ImportParameters(privateKey);
decryptedMessage = FixBuffer(buffer);//method that cleans the buffer, and return a valid array, just with the information that i want.
decryptedMessage= csp.Decrypt(decryptedMessage, false);


当它尝试解密时,我得到一个CryptographicException,消息是Invalid Data

问题是,我真的需要在客户端使用相同的公钥来解密这些数据吗?
如果是,我如何将此密钥传递给服务器端,并正确解密信息?

RSACryptoServiceProvider, SSLStream(OpenSSL) -加密,解密

要解密数据,当然需要使用与用于加密数据的公钥相对应的私钥。目前,您正在服务器上生成一个新的(不同的)密钥,该密钥将无法用于解密数据。至于如何将正确的密钥传递给服务器,答案是你不需要——服务器应该生成密钥,并(仅)将公开部分发送给客户端,然后它可以使用它来加密消息。

话虽如此,考虑到通信已经通过加密的SSL连接进行,似乎根本没有必要对数据进行加密。