15

Ich möchte eine Daten mithilfe der öffentlichen/privaten Schlüsseltechnik verschlüsseln. Ich meine, mit dem öffentlichen Schlüssel des Empfängers verschlüsseln und der Empfänger kann mit seinem eigenen privaten Schlüssel entschlüsseln.So verwenden Sie die Verschlüsselungstechnik für öffentliche und private Schlüssel in C#

Wie kann ich das tun? Haben Sie einen Vorschlag oder Beispielcode oder etwas anderes?

+3

[? Was haben Sie versucht] (http://mattgemmell.com/2008/12/08/what-have-you-tried/) – ntoskrnl

Antwort

21

Code-Beispiel:

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

Die RSACryptoServiceProvider nicht beabsichtigt ist, verschlüsselte zufällige Blobs von Daten (Datengröße ist auf Keysize beschränkt). Im Allgemeinen sollten Sie das OAEP-Padding verwenden und es nicht explizit in PCKS1v1.5 umschalten, um sich vor ausgewählten Ciphertext-Angriffen zu schützen. Niemand sollte diesen Beispielcode verwenden. – jbtule

+9

@ jbtule: also sagen Sie uns, was wäre am besten zum Verschlüsseln entschlüsseln große Daten mit privaten und öffentlichen Schlüssel Konzept? – Mou

+0

@Mou Von dem, was ich gesammelt habe, generieren Sie einen symmetrischen Schlüssel und übertragen ihn dann mit dem öffentlichen Schlüssel des Empfängers. Der Empfänger entschlüsselt sie dann mit ihrem privaten Schlüssel, und dann werden Ihre großen Daten mit dem gemeinsamen symmetrischen Schlüssel verschlüsselt. Sie könnten den symmetrischen Schlüssel alle n Übertragungen aktualisieren. Ich denke, so funktioniert SSL (ich bin mir sicher, dass das eine sehr vereinfachte Beschreibung ist). – MikeJansen

Verwandte Themen