15

Genel/özel anahtar tekniği kullanarak bir veri şifrelemek istiyorum. Yani, alıcının ortak anahtarı ile şifrelemek ve alıcı kendi özel anahtarı ile şifresini çözebilir.Genel ve özel anahtar şifreleme tekniği C# içinde kullanmak için #

Bunu nasıl yapabilirim? Herhangi bir öneriniz veya örnek kodunuz var mı yoksa başka bir şey var mı?

+3

[? Eğer denedi Ne] (http://mattgemmell.com/2008/12/08/what-have-you-tried/) – ntoskrnl

cevap

21

Kod örnek:

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 tasarlanmamıştır şifrelenmiş rastgele veri bloğu (veri boyutu anahtar boyutu ile sınırlıdır). Ayrıca, genel olarak, OAEP dolgularını kullanmalı ve seçmiş olduğunuz şifreli metin saldırılarına karşı korunmak için PCKS1v1.5'i açıkça değiştirmemelisiniz. Bu örnek kodu kimse kullanmamalıdır. – jbtule

+9

@ jbtule: özel ve genel anahtar konseptiyle büyük verileri şifrelemek için en iyi şeyin ne olacağını bize söyleyin. – Mou

+0

@Mou Topladığımdan simetrik bir anahtar oluşturup bunu alıcının ortak anahtarı ile şifreleyerek iletirsiniz. Alıcı daha sonra kendi özel anahtarıyla şifresini çözer ve daha sonra paylaştığınız simetrik anahtarla şifrelenmiş büyük verilerinizi yaparsınız. simetrik anahtarı her n şanzıman ile güncelleyebilirsiniz. Bence SSL nasıl çalışır (eminim ki bu çok basitleştirilmiş bir tanımlamadır) – MikeJansen