15

Chcę szyfrować dane przy użyciu techniki klucza publicznego/prywatnego. To znaczy, zaszyfrować kluczem publicznym odbiornika, a odbiornik może odszyfrować za pomocą własnego klucza prywatnego.Jak korzystać z szyfrowania kluczy publicznych i prywatnych w języku C#

Jak mogę to zrobić? Czy masz jakieś sugestie lub przykładowy kod lub coś innego? Przykładem

+3

[? Co próbowałeś] (http://mattgemmell.com/2008/12/08/what-have-you-tried/) – ntoskrnl

Odpowiedz

21

Kod:

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 nie jest przeznaczony do zaszyfrowanych losowych obiektów danych (rozmiar danych jest ograniczony do klucza). Również ogólnie powinieneś używać dopełnienia OAEP i nie zamieniać go explicite PCKS1v1.5, aby pomóc chronić przed wybranymi atakami tekstu zaszyfrowanego. Nikt nie powinien używać tego przykładowego kodu. – jbtule

+9

@ jbtule: powiedz nam, co najlepiej zaszyfrować, odszyfruj duże dane za pomocą klucza prywatnego i publicznego? – Mou

+0

@Mou Z tego, co zebrałem, generujesz klucz symetryczny, a następnie transmitujesz to szyfrowanie za pomocą klucza publicznego odbiorcy. odbiornik odszyfrowuje go swoim kluczem prywatnym, a następnie wykonasz duże dane zaszyfrowane przy użyciu współdzielonego klucza symetrycznego. można zaktualizować klucz symetryczny co n transmisji. Myślę, że tak działa SSL (jestem pewien, że to bardzo uproszczony opis). – MikeJansen