首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将openssl_pkey_get_public和openssl_verify转换为C# .NET

如何将openssl_pkey_get_public和openssl_verify转换为C# .NET
EN

Stack Overflow用户
提问于 2011-06-04 17:20:31
回答 2查看 2.6K关注 0票数 2

PHP代码验证来自银行的iPizza签名:

代码语言:javascript
复制
$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,使用

代码语言:javascript
复制
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无效的提供程序版本:

代码语言:javascript
复制
  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回答修改了代码

代码语言:javascript
复制
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第二个参数是错误的。

我可以成功地签署数据,银行可以使用代码接受签名。

代码语言:javascript
复制
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);

验证银行签名应该与此过程相反,使用相同的算法。如何验证签名?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-05 08:16:05

您是否安装了增强密码提供程序?实际上,为了不依赖于密码提供程序,您可以使用其他库,它在本机代码中实现了所有的加密功能。我知道EldoS SecureBlackbox (这是商业的)和Bouncy城堡(免费的),但是市场上还有其他的图书馆。

票数 1
EN

Stack Overflow用户

发布于 2011-06-05 10:59:44

如果X509Certificate2成功地导入了cert文件,那么您将从PublicKey.Key参数中获得cert的公钥。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6238244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档