2014-06-24 78 views
1

服務器認證之後,使用OpenSSL的證書:
的RSACryptoServiceProvider,SSLStream(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

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

回答

0

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

這就是所有情況,假設通信已經發生在加密的SSL連接上,似乎根本不需要加密數據。