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

时间:2014-06-24 12:52:54

标签: c# cryptography rsa

服务器身份验证后,使用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ó用这种方法我清理所有这些零,我不需要。

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

1 个答案:

答案 0 :(得分:0)

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

总而言之,考虑到通信已在加密的SSL连接上发生,似乎根本不需要加密数据。