0

X509Certificate2 と RSACryptoServiceProvider を PHP OpenSSL コマンドと一緒に使用して、双方向の相互セキュリティを実装しようとしています。

PHP から C# にメッセージを送信しても問題ないようです。.NET サーバー上の RSACryptoServiceProvider は、独自の秘密鍵を使用してメッセージを復号化し、PHP サーバーの公開鍵を使用して署名を検証できます。

しかし、逆に .NET から PHP に移行すると、「openssl_public_decrypt」を使用して .NET サーバーの署名を検証する際に問題が発生します。false を返すだけです。'openssl_private_decrypt' は正常に機能し、暗号化されたデータを PHP サーバーの秘密鍵で復号化します。

openssl (.key および .crt) を使用して両方のサーバー用の RSA (2048) 自己署名証明書を作成し、.NET コードで秘密鍵として使用する .pfx を作成しました。

ここで何が問題なのか疑問に思っています。.NET サーバーと PHP サーバーの両方で、暗号化/復号化のデフォルト設定を使用しています。.pfx で何かを暗号化した場合、暗号化/復号化メカニズムは同じではありませんか? または、openssl_public_decrypt は、RSACryptoServiceProvider が提供するものとは異なる暗号化を期待していますか?

問題がどこにあるのかよくわからないので、どんな助けも素晴らしいでしょう。

4

1 に答える 1

2

openssl_public_decrypt は、公開鍵の形式についてはかなり肛門的であり、openssl_private_decrypt ほど多くのパディング スキームをサポートしていません。

私の推奨事項:純粋な PHP RSA 実装である phpseclib を使用してください。例:

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey('...'); // public key

$plaintext = '...';

$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$ciphertext = $rsa->encrypt($plaintext);

$rsa->loadKey('...'); // private key
echo $rsa->decrypt($ciphertext);
?>

XML署名形式のキーからPuTTYキーなど、OpenSSLよりも多くのキー形式をサポートしています.

于 2012-08-27T00:34:15.297 に答える