2017-01-06 1 views
1

해결책을 찾고 있었지만 기능적 해결책을 찾을 수 없습니다. C# 응용 프로그램에서 PHP 서버로 문자열 (AESkey)을 전송해야합니다. 클라이언트 (C#에서)는 key.public.pem 파일 (공개 키)을 다운로드하고 패스를 암호화 한 다음 나중에 서버로 보냅니다. 서버에서 key.pem 파일 (개인 키)을 가져옵니다. PHP에서C#으로 암호화하고 PEM 파일을 사용하여 PHP에서 암호 해독

서버 : C#에서

function RSADecryption($text) { 
    //re() reads a document an return it as string 
    openssl_private_decrypt(base64_decode($text), $decrypted,re("key.pem")); 
    return $decrypted; 
} 

클라이언트 :

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


namespace myApp 
{ 
    class MyRSA 
    { 
     public static MyRSA getMyRSA() 
     { 
      if (_Instance == null) 
      { 
       _Instance = new MyRSA(); 
      } 
      return _Instance; 
     } 
     public Boolean setPubKey(string url) 
     { 
      System.Net.WebClient wc = new System.Net.WebClient(); 
      try 
      { 
       publicKey = wc.DownloadString(url); 
      } 
      catch(Exception e) 
      { 
       return false; 
      } 
      return true; 

     } 
     public string crypt(string text) 
     { 
      RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
      RSAParameters rsaParam = rsa.ExportParameters(false); 
      rsaParam.Modulus = Convert.FromBase64String(publicKey.Replace("-----BEGIN PUBLIC KEY-----", "").Replace("-----END PUBLIC KEY-----", "")); 
      rsa.ImportParameters(rsaParam); 
      byte[] encValue = rsa.Encrypt(Encoding.UTF8.GetBytes(text), false); 

      return Convert.ToBase64String(encValue); 
     } 


     private static MyRSA _Instance; 
     private static string publicKey; 

     private MyRSA() {} 
    } 
} 

그리고 나중에 내가 주에서 그런 일을 수행

MyRSA rsa = MyRSA.getMyRSA(); 
rsa.setPubKey(site+"key.public.pem"); 
sendData(rsa.crypt(user)); 

나는 문제가에 생각 decrypter (PHP 함수) 아무것도 반환하지 않기 때문에. 잘 모르겠습니다 만, 문제는 RSACryptoServiceProvider를 사용하여 암호화하고 openssl로 해독 할 수 없다는 것입니다. 그들은 다른 매개 변수 또는 다른 유사한 것들을 사용하기 때문에?

예를 들어,이 키 AES 생성 :

CA uW이다 = kImEYGsgu I이 공개 키

----- BEGIN PUBLIC KEY-를 사용

? ---- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApxjhdfvCuafPZmE // COM OVxBZvMXjwlcyaCfnTuVdbewQ5ITu6hlJ3vX/oTMbik7DprsWoc2tGk3Rx7RdAPd n3VnPm62 QjaKtETWJ8/5Nzf + MxlVD0t5tzqzhniZ5BKZTtvCI6STbrFYnKcJwTyI eaEDNtre5EaqEBbrYhlGTRxNmz2SdRi9Im9iCSw9pjDVDDJdzmhENhASmFQMeo7N IS8AY3zJSjOQPKFymZrSa8hxWp88K1/igxs12IhhpqNjMiUi29gH2T + QLPTDzwEq EHTY1K6B0zlNuyp8HR5pNOqYymdnoSpCV3z0deTobAF7KiFYp2pXvoNo8Pc19Yl0 mQIDAQAB ----- END의 PUBLIC 키 -----

그리고 암호화 된 암호이었다 :

CgG33ytbS3CuK + rOpJRamQ6e8xCj7Q35m6YxWXc44r/D03VubXZO1f5/zF7Zsc42UOOwqbYahApXBXL6o3J5MVu0cDkjstVoUnFJiPRHWmwq9AA0uvLC55gou + VzvmvRzFO38LMZ2BpsQLOjfv16LGWx7MLfKSVFG C8YVHgv6QlEbDFdd/HJDbqAKOoyQWlKXfVeMKmd8ORnq3 + B3Tmk57O3BHDVOlmezSgf + YN828u4ChZ08JzjgBo7MP2xCl6pLEeZxiFGjRwrTgRfLXQ7aMB/RyeMMHwInJiTS3/M2Mez8C3/+ ZA/DIfrLDA9LVdRYdy2n4AxbtyrLTun4mjDO + pYS3HqZlGn2MW5Orc9VH + 1CPn2omLVj/qqa6tIoFuJOdpxn/Y9 당신의 atencion에 대한

감사합니다. 감사합니다.

+1

이것은 잠재적으로 좋은 질문입니다. 적어도 매우 흥미 롭습니다. 문제를 스스로 해결하기 위해 무엇을했는지, 그리고 어떤 시점에서 문제가 발생했는지 설명해주십시오. (주석에 * 설명하지 말고 질문을 편집하십시오.) –

+0

개인 키가 프로덕션 환경에서 실제로 사용됩니까? 그렇지 않다면 나는 그것을 게시한다고 말하고 싶다. 그런 식으로 사람들은 그것을 당신을위한 대답으로 통합 할 수 있습니다. 전적으로 문제는 openssl이 개인 키가있는 형식을 지원하지 않는 것처럼 간단합니다. 개인 키가 없으면 말할 수 없습니다. – neubert

답변

0

.PEM 파일에 "BEGIN PUBLIC KEY"가 있으면 아마도 X.509 SubjectPublicKeyInfo 구조 일 것입니다. 즉, 모양을 의미합니다

30 xx // SEQUENCE (SubjectPublicKeyInfo) 
    30 0D // SEQUENCE (AlgorithmIdentifier) 
    06 09 2A 86 48 86 F7 0D 01 01 01 // OID (algorithm = rsaEncryption) 
    05 00 // NULL (parameters) 
    03 xx // BIT STRING (subjectPublicKey) 
    30 xx // SEQUENCE (RSAPublicKey) 
     02 xx [modulus value here] // INTEGER (Modulus) 
     02 xx [exponent value here] // INTEGER (Exponent) 

DER로 인코딩 된 blob은 다음과 같습니다. xx 값은 길이를 나타냅니다. 길이는 1 바이트 이상이 될 수 있습니다.

이 키를로드 할 때 오버 헤드/구조적 콘텐츠는 물론 계수 바이트 및 지수 바이트를 모두 가져 와서 해당 계수를 모두 호출합니다. 따라서 실제 효과는 해독하는 것과 다른 공개 키로 암호화하는 것입니다.

.NET에서는 PEM 키 내용을 쉽게 읽을 수 없습니다. 최선의 방법은이 키를 인증서로 변환하는 것입니다. 인증서를 아직 가지고 있지 않다면 openssl req -x509 -new -key theprivatekey.pem -out selfsignedcert.cer을 입력하고 (주제에 대해 원하는 답변을 입력하십시오).

그렇지 않으면 이제 How to load the RSA public key from file in C# (및 기타 관련 질문)으로 축소되었습니다.

관련 문제