Php data encrypted using openssl_seal. How to decode in C #?

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?

+6
source share
1 answer

Found the question here myself. In C # code, I did an extra encoding for base64 to return it to a string, and not just convert bytes to a string.

replacement

 return System.Convert.ToBase64String(content); 

from

 return System.Text.Encoding.ASCII.GetString(content); 

at the end of the DecryptSSL function, everything works!

+2
source

Source: https://habr.com/ru/post/888261/


All Articles