【发布时间】:2012-10-05 12:42:10
【问题描述】:
我正在尝试使用 C# RSACryptoProvider.VerifyData 验证 OpenSSL 签名 (created using openssl_sign with SHA1 in PHP)。它使用正确的公钥证书返回 false。
知道如何成功地做到这一点吗?
编辑:
我尝试使用 BouncyCastle 使用以下代码验证 OpenSSL SHA1 签名,但验证失败。签名的计算方式是否不同?如何使用 OpenSSL 创建可由 .NET 验证的签名?
byte[] signatureBytes = UTF8Encoding.Default.GetBytes(signature);
byte[] dataBytes = UTF8Encoding.Default.GetBytes(data);
StreamReader sr = new StreamReader(Path.Combine(@"C:\test", @"test\test.crt"));
PemReader pr = new PemReader(sr);
Org.BouncyCastle.X509.X509Certificate cert = (Org.BouncyCastle.X509.X509Certificate)pr.ReadObject();
ISigner sig = SignerUtilities.GetSigner("SHA1WithRSAEncryption");
sig.Init(false, cert.GetPublicKey());
sig.BlockUpdate(dataBytes, 0, dataBytes.Length);
if (sig.VerifySignature(signatureBytes)) {
Console.WriteLine("all good!");
}
PHP 代码:
function signTokenWithPrivateKey($message, $keyLocation) {
try {
if (file_exists($keyLocation)) {
$privateKey= openssl_get_privatekey(file_get_contents($keyLocation));
$signature = '';
if (!openssl_sign($message, $signature, $privateKey)) {
die('Failed to encrypt');
}
openssl_free_key($privateKey);
}
}
catch (Exception $ex) {
}
return $signature;
}
【问题讨论】:
-
嗨,您能否在问题中包含您要验证的密钥和签名? php代码也可能有帮助
-
这里有 PHP 代码。稍后将发布密钥和签名。
-
@theringostarrs 你解决过这个问题吗?我有我认为是同样的问题:stackoverflow.com/questions/38792111/…
标签: c# php openssl bouncycastle rsacryptoserviceprovider