带有公钥的RSA C#加密用于PHP openssl_private_decrypt():Chilkat,BouncyCastle,RSACryptoServiceProvider

我正在尝试加密C#应用程序中的字符串,以便在PHP端使用openssl_private_decrypt()对其进行解密。 我试图解密的初始公钥是从PHP的openssl_pkey_get_details($ privateKey)中获得的; 提前说,我能够使用chilkat,但它在iOS下的单触function中无效,所以它对我来说没用(而且它的成本也相当高)。 有代码示例我是如何做到的:

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 

我错过了什么?

好吧,在用铃鼓做一些萨满舞之后,我得到了一些令人满意的解决方案。 请记住,这一切都是在使用PHP的openssl_private_decrypt()函数完成的。

所以我接下来:

  1. 加密BouncyCastle只是做得不对

  2. 我不知道如何从私钥获取模数与RSACryptoServiceProvider一起使用它

  3. 为什么不尝试使用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); 

实际上,奇怪的是,我已经想出了解决方案,因为这些细节。 我希望有一天它会对某人有所帮助。

Interesting Posts