Как конвертировать openssl_pkey_get_public и openssl_verify в C # .NET - PullRequest
2 голосов
/ 04 июня 2011

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 = * ----- END CERTIFICATEтиранидный ответ на

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

Этот код вызывает неверную подпись из банковского исключения.Проверка объекта сертификата в показывает данные сертификата.Как это исправить, чтобы подпись была проверена?Отладчик показывает, что срок действия банковского сертификата истек.Возможно, это приводит к ошибке или второй параметр 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);

Проверка подписи банка должна быть обратной к этому процессу, те же алгоритмыиспользуются.Как проверить подпись?

Ответы [ 2 ]

1 голос
/ 05 июня 2011

Если X509Certificate2 успешно импортировал файл сертификата, то вы получаете открытый ключ сертификата из параметра PublicKey.Key.

1 голос
/ 05 июня 2011

У вас установлен улучшенный поставщик криптографии?На самом деле, чтобы не зависеть от поставщиков криптографии, вы можете использовать другие библиотеки, которые реализуют все криптографические средства в нативном коде.Я знаю о EldoS SecureBlackbox (коммерческий) и Bouncy Castle (бесплатный), однако на рынке могут быть и другие библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...