Данные php зашифрованы с помощью openssl_seal.Как декодировать в C #? - PullRequest
6 голосов
/ 17 мая 2011

Я передаю некоторые данные (1-2 МБ) между приложением php и программой на c #. Информация должна быть зашифрована, и я использовал шифрование Rijndael, но шифрование было очень медленным. Я пытаюсь перейти на openssl_seal на стороне php, и это работает нормально:

PHP-код

<!-- 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;

Но у меня возникают проблемы при попытке расшифровки на конце c #.

C # код

<!-- 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];
        }
    }

Где DecryptSSL вызывается с помощью строки ascii, содержащей ответ со страницы php.

Я никогда не получал исходную строку, в данном случае '123', возвращенную из функции расшифровки. Что еще мне не хватает?

1 Ответ

2 голосов
/ 17 мая 2011

Нашел проблему здесь сам. В коде c # я делал дополнительное кодирование для base64, чтобы вернуть его обратно в строку, а не просто конвертировал байты в строку.

замена

return System.Convert.ToBase64String(content);

с

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

в конце функции DecryptSSL все заработало!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...