2012-12-26 2 views
4

클라이언트와 서버와의 통신에 공개 키 암호화를 사용하려고합니다. 서버는 1024 비트 공개 키를 생성하여 클라이언트로 전송합니다. 클라이언트는이 키를 사용하여 암호화 된 데이터를 다시 서버로 보냅니다. 지금까지, 나는이 함께 RSACryptoServiceProvider를 초기화했습니다RSACryptoServiceProvider에서 공개 키를 가져 옵니까?

RSACryptoServiceProvider rsaEncryption = new RSACryptoServiceProvider(1024); 

지금, 나는 내가 RSACryptoServiceProvider에서 지수 및 계수를 얻을 수 ExportParameters을 사용할 수 있습니다 알고 있어요. 그러나이 데이터를 사용하여 공개 키를 클라이언트 (예 : RSACryptoServiceProvider)에 다시 보내려면 어떻게해야하며 클라이언트가이 데이터를 사용하여 나에게 다시 보낼 암호화 할 수 있습니까? 아니면 완전히 잘못하고 있습니까?

답변

15

로직이 정상적으로 보이고 일부 샘플 코드 만 필요할 것으로 보입니다.

using System; 
    using System.Security.Cryptography; 
    using System.Text; 

    namespace RSA 
    { 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       try 
       { 
        var rsaServer = new RSACryptoServiceProvider(1024); 
        var publicKeyXml = rsaServer.ToXmlString(false); 

        var rsaClient = new RSACryptoServiceProvider(1024); 
        rsaClient.FromXmlString(publicKeyXml); 

        var data = Encoding.UTF8.GetBytes("Data To Be Encrypted"); 

        var encryptedData = rsaClient.Encrypt(data, false); 
        var decryptedData = rsaServer.Decrypt(encryptedData, false); 

        Console.WriteLine(Encoding.UTF8.GetString(decryptedData)); 

        Console.WriteLine("OK"); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex.Message); 
       } 
       Console.Read(); 
      } 
     } 
    } 
0

1- 사용은 사용자의 키> = 2048 비트는 2025 ~ 때까지 보호 할하시기 바랍니다.

위는 2012 년부터이지만, 퍼티/리눅스 서버 연결을위한 ssh-rsa 키를 만들려고 시도하면서 나왔습니다.

퍼티 진 (PermtyGen)과 일치시키기 위해 공개 ssh-rsa 키를 적절한 형식으로 작성하는 것과 비슷한 문제를 해결했습니다. 마이크로 소프트 .NET RSACryptoServiceProvider를 들어

는 당신은 내가 테스트 & 퍼티 세대 소스 코드 링크에 사용되는 내 개인 키를 볼 수있는이

  RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(3072); 
      byte[] sshrsa_bytes = Encoding.Default.GetBytes("ssh-rsa"); 
      byte[] n = RSA.ExportParameters(false).Modulus; 
      byte[] e = RSA.ExportParameters(false).Exponent; 
      string buffer64; 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       ms.Write(ToBytes(sshrsa_bytes.Length), 0, 4); 
       ms.Write(sshrsa_bytes, 0, sshrsa_bytes.Length); 
       ms.Write(ToBytes(e.Length), 0, 4); 
       ms.Write(e, 0, e.Length); 
       ms.Write(ToBytes(n.Length+1), 0, 4); //Remove the +1 if not Emulating Putty Gen 
       ms.Write(new byte[] { 0 }, 0, 1); //Add a 0 to Emulate PuttyGen (remove it not emulating) 
       ms.Write(n, 0, n.Length); 
       ms.Flush(); 
       buffer64 = Convert.ToBase64String(ms.ToArray()); 
      } 

      string pubssh = string.Format("ssh-rsa {0} generated-key", buffer64); 

과 같을 것이다 나는 마이크로 소프트에서 일 https://www.cameronmoten.com/2017/12/21/rsacryptoserviceprovider-create-a-ssh-rsa-public-key/

하지만, 이것은 Microsoft가 아닌 개인적인 대답입니다.

BouncyCastle (Link) 당신은 당신이 문제에 관련이 없기 때문에 일하는 곳 말할 필요가 없습니다

+0

에 대한 원래의 게시물. 다른 답변이없는 한 모든 대답은 여기에 개인적으로 표시됩니다. – Hexfire

관련 문제