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