3

C# と PHP の間で単純な RSA 暗号化解読プロセスを構築しようとしています。私はphpseclib(http://phpseclib.sourceforge.net/)を使用して、PHPでの暗号化と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コード:

$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

4 に答える 4

2

ええ、私は自分で解決策を見つけました。暗号化の行を変更しました:

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

また、@ Ryanが言ったように:

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

お試しいただきありがとうございます。

于 2013-04-04T10:57:02.940 に答える
0

あなたはC#でやっているので、PHPは不要Array.Reverseだと推測するのは危険です。strrev

また、phpseclib の Crypt_RSA にはloadKeyfromXML. どこからそれを得ていますか?する$rsa->loadKey()だけで十分です。

最後に、私の推測では、PKCS1 が必要です。使っているとどんなエラーが出ますか?

于 2013-04-03T18:16:06.443 に答える