У меня есть сертификат x509 с открытым и закрытым ключом, который хранится на USB-токене safenet.
У меня есть данные, которые я хочу подписать. Мне нужно использовать открытый ключ сертификата для проверки подписи.
Окончательный код, подписывающий мой собственный самоподписанный сертификат:
RSACryptoServiceProvider rsa1 = (RSACryptoServiceProvider)useCertificate.PrivateKey;
byte[] digitalSignature = rsa1.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));
И код для проверки с использованием открытого ключа сертификата:
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)useCertificate.PublicKey.Key;
Verified = rsa.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), digitalSignature);
С самоподписанным сертификатом это работает нормально. Подпись, которую я получаю, составляет 256 байтов.
С токеном, использующим этот код для получения подписи, а затем для ее проверки, я получаю только 128-байтовую подпись, и проверка не выполняется:
CspParameters csp = new CspParameters(1, "SafeNet RSA CSP");
csp.Flags = CspProviderFlags.UseDefaultKeyContainer;
csp.KeyNumber = (int)KeyNumber.Signature;
RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider(csp);
Проверьте код так же, как указано выше.
Замечу, что сертификат, который я хочу использовать, является сертификатом по умолчанию в токене. Почему я получаю только 128-байтовую подпись вместо 256? Подозреваю, поэтому не проверяет.
Нужны ли мне другие параметры и настройки в моем csp?
Спасибо
* Обновление на основе комментариев *
Понятно, что я использую 1024 бита, когда указываю csp.keyNumber = (int) KeyNumber.Signature, но это единственный способ, которым токен действительно что-то возвращает. Несмотря на то, что размер ключа токена составляет 2048 бит, а спецификация ключа - AT_KEYEXCHANGE. Когда я использую номер ключа обмена, который, по моему мнению, действительно правильный, тогда, когда я пытаюсь вычислить подпись, мне предлагается войти в систему, но затем я получаю исключение «Параметр недействителен». Итак, насколько я могу судить, мне нужна одна из двух вещей:
1 - как использовать открытый ключ для проверки подписи с использованием 1024 бит (без токена - нам нужно проверить на машине без токена).
or
2 - как установить все, что неверно, чтобы мы могли передать исключение - что, на мой взгляд, является лучшей идеей.
Есть ли у кого-нибудь совет о том, что я могу сделать с этим исключением или что может его вызывать?
Полная информация об исключении ниже:
HResult = -2147024809 Сообщение = Неверный параметр. Трассировки стека
в System.Security.Cryptography.CryptographicException.ThrowCryptographicException (Int32 hr) в System.Security.Cryptography.Utils.SignValue (SafeKeyHandle hKey, Int32 keyNumber, Int32 calgKey, Int32 calgHash, Int32 [] хэш .Security.Cryptography.Utils.SignValue (SafeKeyHandle hKey, Int32 keyNumber, Int32 calgKey, Int32 calgHash, Byte [] hash) в System.Security.Cryptography.RSACryptoServiceProvider.SignHash (Bytecurity [] rgbHash). Cryptography.RSACryptoServiceProvider.SignHash (Byte [] rgbHash, String str) в TE.Program.Main (String [] args) в z: \ Work \ compusolve \ enctest \ TE \ TE \ Program.cs: строка 77
RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider(2048, csp);
Но это не повлияло на результат - мне вернули только 128 байт. Это должно было потребовать использования 2048-битного ключа. - person user2709214   schedule 31.03.2017(Int)KeyNumber.Exchange
вместоSignature
, тогда я получу желаемый размер ключа 2048, однако, когда я прошу устройство вычислить подпись, я получаю исключение Параметр недействителен. KeySize на устройстве составляет 2048 бит. - person user2709214   schedule 31.03.2017