I am transferring some data (1-2 MB) between a php application and a C # program. The information must be encrypted, and I used Rijndael encryption, but the encryption was very slow. I am trying to switch to openssl_seal on the php side and it works fine:
PHP code
<!-- language: lang-php --> str = 123; $fp = fopen("/home/prod/publickey.pem", "r"); $cert = fread($fp, 8192); fclose($fp); $pk1 = openssl_get_publickey($cert); openssl_seal($str, $sealed, $ekeys, array($pk1)); openssl_free_key($pk1); $sealed = base64_encode($sealed); $Xevk = base64_encode($ekeys[0]); echo $Xevk."\n\n\n".$sealed;
But I am having problems with decryption at the end of C #.
C # code
<!-- language: c# --> public static string DecryptSSL(string str) { string[] strs = System.Text.RegularExpressions.Regex.Split(str, "\n\n\n"); X509Certificate2 myCert2 = null; RSACryptoServiceProvider rsa = null; try { myCert2 = new X509Certificate2(Properties.Resources.mycertkey, ""); rsa = (RSACryptoServiceProvider)myCert2.PrivateKey; } catch(Exception e) { Console.WriteLine(e.Message); } byte[] xkey = rsa.Decrypt(Convert.FromBase64String(strs[0]), false); byte[] content = Convert.FromBase64String(strs[1]); EncDec.RC4(ref content, xkey); return System.Convert.ToBase64String(content); } public static void RC4(ref Byte[] bytes, Byte[] key) { Byte[] s = new Byte[256]; Byte[] k = new Byte[256]; Byte temp; int i, j; for(i = 0; i < 256; i++) { s[i] = (Byte)i; k[i] = key[i % key.GetLength(0)]; } j = 0; for(i = 0; i < 256; i++) { j = (j + s[i] + k[i]) % 256; temp = s[i]; s[i] = s[j]; s[j] = temp; } i = j = 0; for(int x = 0; x < bytes.GetLength(0); x++) { i = (i + 1) % 256; j = (j + s[i]) % 256; temp = s[i]; s[i] = s[j]; s[j] = temp; int t = (s[i] + s[j]) % 256; bytes[x] ^= s[t]; } }
Where DecryptSSL is called with the ascii line containing the response from the php page.
I never get the original string, '123' in this case, returned from the decryption function. What else am I missing?
source share