6

I am passing some data (1-2MB) between a php app and a c# program. The info needs to be encrypted and I was using a Rijndael encryption, but encryption was very slow. I am trying to switch to openssl_seal on the php side and have that working 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 issues trying to decrypt on the c# end.

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 being called with an ascii string containing the response from the php page.

I never get the original string, '123' in this case, returned from the decrypt function. What else am I missing?

1 Answer 1

2

Found the issue here myself. In the c# code I was doing an extra encoding to base64 to get it back to a string rather than just converting the bytes to a string.

replacing

return System.Convert.ToBase64String(content);

with

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

at the end of the DecryptSSL function got everything working!

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.