Cifrado RSA C # con clave pública para usar con PHP openssl_private_decrypt (): Chilkat, BouncyCastle, RSACryptoServiceProvider

Estoy tratando de cifrar la cadena en la aplicación C # para que se descifre en el lado de PHP con openssl_private_decrypt (). la clave pública inicial con la que estoy tratando de descifrar se obtiene desde el archivo openssl_pkey_get_details de PHP ($ privateKey); Hablando de antemano, puedo hacerlo utilizando chilkat, pero no funciona en monotouch en iOS, por lo que es inútil para mí (y también cuesta bastante). Hay un ejemplo de código de cómo lo estoy haciendo:

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)); } 

la salida es:

 success decryption failed decryption failed 

¿Qué me estoy perdiendo?

ok, después de hacer algunos bailes chamánicos con pandereta, he llegado a una solución un tanto satisfactoria. tenga en cuenta que todo se hace en el contexto de trabajar con la función openssl_private_decrypt () de PHP.

así que tengo el siguiente:

  1. cifrado de BouncyCastle simplemente no hacerlo bien

  2. No sé cómo obtener módulo fuera de la clave privada para usarlo con RSACryptoServiceProvider

  3. ¿por qué no intentar utilizar los datos clave de BouncyCastle e inicializar 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); 

en realidad, es extraño que se me haya ocurrido una solución, primo de estas sutilezas. Espero que algún día sea útil para alguien.