使用 openssl_seal 加密的 php 数据。如何在c#中解码?

发布于 2024-11-08 03:31:54 字数 2209 浏览 1 评论 0原文

我正在 php 应用程序和 ac# 程序之间传递一些数据(1-2MB)。信息需要加密,我使用的是 Rijndael 加密,但加密速度非常慢。我正在尝试在 php 端切换到 openssl_seal 并使其工作正常:

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

,其中使用包含 php 页面响应的 ascii 字符串调用 DecryptSSL。

我从来没有得到解密函数返回的原始字符串,在本例中为“123”。我还缺少什么?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

郁金香雨 2024-11-15 03:31:54

我自己在这里发现了这个问题。在 C# 代码中,我对 Base64 进行了额外的编码,以将其返回为字符串,而不仅仅是将字节转换为字符串。

替换

return System.Convert.ToBase64String(content);

为使一切正常!

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

在 DecryptSSL 函数末尾

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!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文