PHP代码验证来自银行的iPizza签名:
$key = openssl_pkey_get_public (file_get_contents ($preferences['bank_certificate']));
if (!openssl_verify ($data, $signature, $key)) {
trigger_error ("Invalid signature", E_USER_ERROR);
} 我尝试将其转换为ASP .NET,使用
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
X509Certificate2 cert = new X509Certificate2(HttpContext.Current.Request.MapPath("~/App_Data/bankert.crt"), "");
RSACryptoServiceProvider rsaCryptoIPT = new RSACryptoServiceProvider();
rsaCryptoIPT.ImportCspBlob(cert.RawData);
if (!rsaCryptoIPT.VerifyData(data, CryptoConfig.MapNameToOID("SHA1"), signature))
throw new InvalidOperationException("Invalid signature from bank ");但是,行rsaCryptoIPT.ImportCspBlob(cert.RawData)会导致Cryptography.CryptographicException无效的提供程序版本:
StackTrace:
at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
at System.Security.Cryptography.Utils._ImportCspBlob(Byte[] keyBlob, SafeProvHandle hProv, CspProviderFlags flags, SafeKeyHandle& hKey)
at System.Security.Cryptography.Utils.ImportCspBlobHelper(CspAlgorithmType keyType, Byte[] keyBlob, Boolean publicOnly, CspParameters& parameters, Boolean randomKeyContainer, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
at System.Security.Cryptography.RSACryptoServiceProvider.ImportCspBlob(Byte[] keyBlob)
...怎么修?
bank_certificate文件
MIIDRTCCAq6gAwIBAgIBADANBgkqhkiG9w0BAQQFADB7MQswCQYDVQQGEwJFRTEO .
C82uR/wUZJDw9kj+R1O46/byG8yA+S9FVw== -端证书
UPDATE:我根据tyranid回答修改了代码
var cert = new X509Certificate2(HttpContext.Current.Request.MapPath("~/App_Data/banksert.crt"), "");
var rsaCryptoIPT = (RSACryptoServiceProvider)cert.PublicKey.Key;
var sha1 = new SHA1CryptoServiceProvider();
if (!rsaCryptoIPT.VerifyData(data, sha1, signature))
throw new InvalidOperationException("Invalid signature from bank ");此代码导致来自银行异常的无效签名。检查cert对象以显示cert数据。如何解决这个问题,以便验证签名?调试器显示银行证书有效日期已过期。可能这会导致错误,或者VerifyDate第二个参数是错误的。
我可以成功地签署数据,银行可以使用代码接受签名。
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
X509Certificate2 cert = new X509Certificate2(HttpContext.Current.Request.MapPath("~/App_Data/P12File.p12"), "");
RSACryptoServiceProvider rsaCryptoIPT = (RSACryptoServiceProvider)cert.PrivateKey;
byte[] binSignature = rsaCryptoIPT.SignData(binData, sha1);验证银行签名应该与此过程相反,使用相同的算法。如何验证签名?
发布于 2011-06-05 08:16:05
您是否安装了增强密码提供程序?实际上,为了不依赖于密码提供程序,您可以使用其他库,它在本机代码中实现了所有的加密功能。我知道EldoS SecureBlackbox (这是商业的)和Bouncy城堡(免费的),但是市场上还有其他的图书馆。
发布于 2011-06-05 10:59:44
如果X509Certificate2成功地导入了cert文件,那么您将从PublicKey.Key参数中获得cert的公钥。
https://stackoverflow.com/questions/6238244
复制相似问题