2013-08-28 122 views
15

我想用公鑰/私鑰技術加密數據。我的意思是,使用接收方的公鑰進行加密,接收方可以使用自己的私鑰進行解密。如何在C#中使用公鑰和私鑰加密技術

我該怎麼做?你有任何建議或示例代碼或其他東西?

+3

[?你嘗試過什麼(http://mattgemmell.com/2008/12/08/what-have-you-tried/) – ntoskrnl

回答

21

代碼示例:

private static string _privateKey; 
private static string _publicKey; 
private static UnicodeEncoding _encoder = new UnicodeEncoding(); 

private static void RSA() 
{ 
    var rsa = new RSACryptoServiceProvider(); 
    _privateKey = rsa.ToXmlString(true); 
    _publicKey = rsa.ToXmlString(false); 

    var text = "Test1"; 
    Console.WriteLine("RSA // Text to encrypt: " + text); 
    var enc = Encrypt(text); 
    Console.WriteLine("RSA // Encrypted Text: " + enc); 
    var dec = Decrypt(enc); 
    Console.WriteLine("RSA // Decrypted Text: " + dec); 
} 

public static string Decrypt(string data) 
{ 
    var rsa = new RSACryptoServiceProvider(); 
    var dataArray = data.Split(new char[] { ',' }); 
    byte[] dataByte = new byte[dataArray.Length]; 
    for (int i = 0; i < dataArray.Length; i++) 
    { 
    dataByte[i] = Convert.ToByte(dataArray[i]); 
    } 

    rsa.FromXmlString(_privateKey); 
    var decryptedByte = rsa.Decrypt(dataByte, false); 
    return _encoder.GetString(decryptedByte); 
} 

public static string Encrypt(string data) 
{ 
    var rsa = new RSACryptoServiceProvider(); 
    rsa.FromXmlString(_publicKey); 
    var dataToEncrypt = _encoder.GetBytes(data); 
    var encryptedByteArray = rsa.Encrypt(dataToEncrypt, false).ToArray(); 
    var length = encryptedByteArray.Count(); 
    var item = 0; 
    var sb = new StringBuilder(); 
    foreach (var x in encryptedByteArray) 
    { 
    item++; 
    sb.Append(x); 

    if (item < length) 
     sb.Append(","); 
    } 

    return sb.ToString(); 
} 
+12

的的RSACryptoServiceProvider無意到加密的隨機數據塊(數據大小僅限於密鑰大小)。另外一般情況下,您應該使用OAEP填充,而不是明確地切換PCKS1v1.5以幫助防止選擇的密文攻擊。沒有人應該使用這個示例代碼。 – jbtule

+9

@ jbtule:那麼告訴我們什麼是最好的加密解密與私人和公共密鑰概念的大數據? – Mou

+0

@Mou從我收集的內容中,生成一個對稱密鑰,然後使用接收方的公鑰將其加密。接收者用自己的私鑰解密,然後用共享對稱密鑰加密大數據。您可以每n次傳輸更新對稱密鑰。我認爲這就是SSL的工作原理(我敢肯定這是一個非常簡單的描述) – MikeJansen