使用openssl_public_encrypt验证RSA签名时,.NET签名字符串失败

时间:2012-08-26 23:13:26

标签: c# php openssl rsa rsacryptoserviceprovider

我正在尝试将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)自签名证书,然后创建了一个.pfx,用作.NET代码中的私钥。

我想知道这里有什么问题。我在.NET和PHP服务器上使用加密/解密的默认设置。当您使用.pfx加密某些内容时,加密/解密机制的情况是否相同?或者openssl_public_decrypt是否期望与RSACryptoServiceProvider提供的加密方式不同?

任何帮助都会很棒,因为我不确定问题出在哪里。

1 个答案:

答案 0 :(得分:2)

openssl_public_decrypt对于公钥的格式非常肛门,并且不支持与openssl_private_decrypt一样多的填充方案。

我的建议:使用phpseclib, a pure PHP RSA implementation。一个例子:

<?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);
?>

它支持比OpenSSL更多的密钥格式,从XML签名格式化密钥到PuTTY密钥等。