2013-12-20 6 views
-1

openssl_private_decrypt()를 사용하여 PHP 측에서 해독 할 수 있도록 C# 응용 프로그램에서 문자열을 암호화하려고합니다. 해독하려고하는 초기 공개 키는 PHP의 openssl_pkey_get_details ($ privateKey); 앞서 이야기하면 chilkat을 사용하여 할 수 있지만 IOS 용 모노 터치에서는 작동하지 않으므로 나를 위해 쓸모가 없습니다 (비용도 많이 듭니다). 내가 그것을하고있어 방법 코드 예제가있다 :openssl_private_decrypt()와 함께 사용하는 공개 키가있는 RSA C# 암호화 : Chilkat, BouncyCastle, RSACryptoServiceProvider

void TestEncryption(string publicKey, string data) 
{ 
     var bytes = Encoding.UTF8.GetBytes(data); 

     //by using chilkat 
     var key = new Chilkat.PublicKey(); 
     var result = key.LoadOpenSslPem(publicKey); 
     var ck = new Chilkat.Rsa(); 
     ck.UnlockComponent("blablabla"); 
     var keyXml = key.GetXml(); 
     ck.ImportPublicKey(keyXml); 
     var ckBytes = ck.EncryptBytes(bytes, false); 

     //by using BouncyCastle 
     Object obj; 
     using (TextReader sr = new StringReader(publicKey)) 
     { 
      PemReader pem = new PemReader(sr); 
      obj = pem.ReadObject();    
     } 
     var par = obj as Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters; 
     RsaEngine e = new RsaEngine(); 
     e.Init(true, par);   
     var bcBytes = e.ProcessBlock(bytes, 0, bytes.Length); 

     //RSACryptoServiceProvider. don't know exectly how to initialize it, one way that must work i think is from chilkat's xml, just to test 
     RSACryptoServiceProvider csp = new RSACryptoServiceProvider(1024); 
     csp.FromXmlString(keyXml); 

     //also tryed to initialize like this: 
     //var pp = csp.ExportParameters(false); 
     //pp.Modulus = byteKey; //this one is publicKey, stripped from --begin-- and --end-- sections and encoded from base64 to byte array (162 bytes) 
     //csp.ImportParameters(pp); 
     // 
     //or if i do 
     //var pp = new RSAParameters(); 
     //pp.Exponent = Convert.FromBase64String("AQAB"); 
     //pp.Exponent array is the same: {1, 0, 1}; 

     var cspBytes = csp.Encrypt(bytes, false); //or (bytes, true), doesn't matter   

     //this function sends request to php and returns result of decryption attempt   
     Debug.WriteLine(ExecRequest(ckBytes)); 
     Debug.WriteLine(ExecRequest(bcBytes)); 
     Debug.WriteLine(ExecRequest(cspBytes)); 
} 

출력은 : 나는 무엇을 놓치고

success 
decryption failed 
decryption failed 

은?

+0

-1 그리고 보류 중입니까? 롤. 내가 뭘 묻는 지 분명하다 :이 데이터가 PHP의 openssl_private_decrypt()로 해독되도록 C# 응용 프로그램 내에서 RSA를 사용하여 데이터를 암호화하는 방법. 그것을 위해 chilkat을 사용하지 마십시오. BouncyCastle의 암호화가 작동하지 않는 이유와 RSACryptoServiceProvider와 함께 사용하기위한 공개 키 모듈을 얻는 방법이 명확하지 않습니다. –

+0

일반적으로 도움이 될 두 가지 유형의 사람들이 있습니다. 당신이하는 일을 정확히 수행 한 사람들이 있으며, 따라서 "실종 된 것"을 쉽게 발견 할 수 있습니다. 그리고 문제를 보여주는 코드를 붙잡고 작업 할 수 있다면 도움을주고 자하는 사람들이 있습니다. 첫 번째 카테고리는 일반적으로 * 매우 * 작기 때문에 두 번째 카테고리를 목표로하고 싶으므로 해당 도메인의 전문가가 아닌 사람이라도 이해할 수있는 문제에 대한 충분한 정보를 1) 2) 필요한 모든 데이터가 포함 된 완전한 예. –

+0

일부 데이터가 누락되면 미안하지만 코드 샘플을 최대한 접근하기 쉽도록 만들려고했습니다. 심지어 크기를 최소화하면서 테스트 샘플을 다시 작성했지만 여전히 완료되었습니다. 두 번째 범주의 사람들이 누락 된 정보를 알려주십시오. 필요한 데이터는 무엇입니까? 이 코드는 PHP, C# IDE 및 bouncy castle 라이브러리에서 생성 된 공개 키와 개인 키를 사용하여 테스트 할 수 있습니다. http://www.visualstudio.com/en-US/products/visual-studio-express-vs http://www.bouncycastle.org/csharp/ –

답변

3

탬버린으로 일부 무속 춤을 한 후에 다소 만족스러운 해결책을 찾았습니다. PHP의 openssl_private_decrypt() 함수로 작업하는 컨텍스트에서 모두 수행된다는 것을 명심하십시오.

  1. BouncyCastle 암호화 그냥 잘 작성하지

  2. 내가 RSACryptoServiceProvider

  3. 와 함께 사용하는 개인 키에서 계수를 얻는 방법을 모르는 일 :

    그래서 나는 다음있어

  4. BouncyCastle의 주요 데이터를 사용하고 RSACryptoServiceProvider를 초기화하려고하지 마십시오.

    Object obj; 
    using (TextReader sr = new StringReader(publicKey)) 
    { 
        PemReader pem = new PemReader(sr); 
        obj = pem.ReadObject();    
    } 
    var par = obj as Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters; 
    
    RSACryptoServiceProvider csp = new RSACryptoServiceProvider(1024);   
    //var pp = csp.ExportParameters(false); //works on native .NET, doesn't work on monotouch 
    var pp = new RSAParameters(); 
    pp.Modulus = par.Modulus.ToByteArrayUnsigned(); //doesn't work with ToByteArray() 
    pp.Exponent = par.Exponent.ToByteArrayUnsigned();       
    csp.ImportParameters(pp); 
    var cspBytes = csp.Encrypt(bytes, false); 
    

사실, 나는 이상하게도 솔루션을 생각해 냈습니다. 언젠가 누군가에게 도움이되기를 바랍니다.