15

Tôi muốn mã hóa dữ liệu bằng cách sử dụng kỹ thuật khóa công khai/riêng tư. Ý tôi là, mã hóa bằng khóa công khai của người nhận và người nhận có thể giải mã bằng khóa riêng.Cách sử dụng kỹ thuật mã hóa khóa công khai và riêng tư trong C#

Tôi có thể làm như thế nào? Bạn có bất cứ đề nghị hoặc mã mẫu hoặc cái gì khác?

+3

[? Bạn đã cố gắng gì] (http://mattgemmell.com/2008/12/08/what-have-you-tried/) – ntoskrnl

Trả lời

21

Mã dụ:

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

Các RSACryptoServiceProvider không có ý định cho các khối dữ liệu ngẫu nhiên được mã hóa (kích thước dữ liệu được giới hạn cho các khóa). Nói chung, bạn nên sử dụng OAEP padding và không explictly chuyển đổi nó PCKS1v1.5 để giúp bảo vệ chống lại các cuộc tấn công mã hóa được lựa chọn. Không ai nên sử dụng mã mẫu này. – jbtule

+9

@ jbtule: vì vậy hãy cho chúng tôi biết điều gì sẽ là tốt nhất để mã hóa giải mã dữ liệu lớn với khái niệm khóa công khai và riêng tư? – Mou

+0

@Mou Từ những gì tôi đã thu thập, bạn tạo ra một khóa đối xứng và sau đó truyền mã hóa nó bằng khóa công khai của người nhận. người nhận sau đó giải mã nó với khóa riêng của họ và sau đó bạn làm dữ liệu lớn của bạn được mã hóa với khóa đối xứng được chia sẻ. bạn có thể cập nhật khóa đối xứng mỗi lần truyền n. Tôi nghĩ rằng đây là cách SSL hoạt động (Tôi chắc chắn đó là một mô tả rất đơn giản) – MikeJansen

Các vấn đề liên quan