C#使用RSA加密PHP解密

时间:2013-04-03 15:43:17

标签: c# php rsa phpseclib

我正在尝试在C#和PHP之间构建一个简单的RSA加密decrpytion过程。 我已经完成了PHP中的加密和使用phpseclib(http://phpseclib.sourceforge.net/)在C#中的decrpyt。但是我得到了 “第2103行C:\ xampp \ htdocs \ Crypt \ RSA.php中的解密错误”是这部分:

if ($lHash != $lHash2) {
        user_error('Decryption error', E_USER_NOTICE);
        return false;
    }

C#中的加密我使用了这堆代码:

RSACryptoServiceProvider rsaCryptoServiceProvider = new RSACryptoServiceProvider(dwKeySize);
        rsaCryptoServiceProvider.FromXmlString(publickey);
        int keySize = dwKeySize / 8;
        byte[] bytes = Encoding.UTF32.GetBytes(inputString);
        // The hash function in use by the .NET RSACryptoServiceProvider here is SHA1
        // int maxLength = ( keySize ) - 2 - ( 2 * SHA1.Create().ComputeHash( rawBytes ).Length );
        int maxLength = keySize - 42;
        int dataLength = bytes.Length;
        int iterations = dataLength / maxLength;
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i <= iterations; i++)
        {
            byte[] tempBytes = new byte[(dataLength - maxLength * i > maxLength) ? maxLength : dataLength - maxLength * i];
            Buffer.BlockCopy(bytes, maxLength * i, tempBytes, 0, tempBytes.Length);
            byte[] encryptedBytes = rsaCryptoServiceProvider.Encrypt(tempBytes, true);
            // Be aware the RSACryptoServiceProvider reverses the order of encrypted bytes after encryption and before decryption.
            // If you do not require compatibility with Microsoft Cryptographic API (CAPI) and/or other vendors.
            // Comment out the next line and the corresponding one in the DecryptString function.
            Array.Reverse(encryptedBytes);
            // Why convert to base 64?
            // Because it is the largest power-of-two base printable using only ASCII characters
            stringBuilder.Append(Convert.ToBase64String(encryptedBytes));
        }
        string ciphertext = stringBuilder.ToString();

和我的基本PHP代码decrpyt:

$rsa->loadKeyfromXML($privatekey);  
$ciphertext = file_get_contents('cipher.txt');
$ciphertext = base64_decode(strrev($ciphertext));

//$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);

$plaintext = $rsa->decrypt($ciphertext);

我已经尝试过PKC1,它在Crypt / RSA.php中也给出了另一个错误

4 个答案:

答案 0 :(得分:1)

我刚刚找到解决方案。我更改了加密线:

byte[] bytes = Encoding.UTF32.GetBytes(inputString);  ==> byte[] bytes = Encoding.Default.GetBytes(inputString);

并且@Ryan说:

$ciphertext = base64_decode(strrev($ciphertext));  ==> $ciphertext = strrev(base64_decode($ciphertext));

感谢您的尝试。

答案 1 :(得分:0)

由于您在C#中执行Array.Reverse,我可能会猜测PHP中的strrev是不必要的。

此外,phpseclib的Crypt_RSA没有loadKeyfromXML。你从哪里得到的?做$rsa->loadKey()就足够了。

最后,我的猜测是PKCS1是必需的。你使用它时会得到什么错误?

答案 2 :(得分:0)

在我看来,在PHP中,您正在使用Base64编码的密文,将其反转,然后尝试对其进行Base64解码?我想你想先解码它,然后反转结果。它们不是一回事。

首先,是否有必要进行任何逆转,我不能说。

答案 3 :(得分:0)

我不得不说我没有完全解决你的问题,但似乎是如何在C#和PHP中结合使用RSA加密。我也遇到了一些麻烦,对于每个仍然感兴趣的人,我写了一个工作项目,C#程序和PHP脚本都创建RSA密钥并交换它们然后加密通信(参见here)。