簡體   English   中英

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

[英]RSACryptoServiceProvider, SSLStream(OpenSSL) - Encrypt, Decrypt

服務器身份驗證后,使用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”值,因此使用此方法可以清理所有這些零我不需要

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

問題是,我真的需要在客戶端使用相同的公鑰來解密此數據嗎?
如果是,我如何將該密鑰傳遞給服務器端,並正確解密信息?

要解密數據,您當然需要使用與用於加密數據的公鑰相對應的私鑰。 就目前而言,您正在服務器上生成一個新的(不同的)密鑰,該密鑰將無法用於解密數據。 至於如何將正確的密鑰傳達給服務器,答案是您沒有這樣做-服務器應生成密鑰,並將(僅)公共部分發送給客戶端,然后客戶端可以使用該部分來加密消息。

綜上所述,鑒於通信已經通過加密的SSL連接進行,因此似乎根本不需要對數據進行加密。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM