Вопрос или проблема
«Набор ключей не существует». Я знаю, что существует множество вопросов по этой ошибке, но мой совершенно другой.
Я не собираюсь использовать ключ из хранилища сертификатов Windows, а загружать открытый ключ и закрытый ключ из двух простых строк, используя метод «fromXMLString».
rsa.fromXMLString "<RSAKeyValue><Modulus>......"
затем
rsa.SignData buffer, algSHA1
и Бум! : «Набор ключей не существует»
Может кто-нибудь сказать мне, что использование пары ключей rsa из двух xml-строк безопасно и совершенно не связано с хранилищем сертификатов Windows? У меня есть собственный подход к хранению и загрузке сертификатов/ключей.
PS: Другие ответы на вопросы по этой ошибке говорили спрашивающему установить правильные разрешения для закрытого ключа в хранилище сертификатов. Но в моем случае я не использовал ни одного файла закрытого ключа в этом хранилище, верно?
Я столкнулся с такой же проблемой, и теперь нашел решение.
Вы должны использовать тот же rsa, который вы использовали для генерации подписи, чтобы сгенерировать открытый ключ и закрытый ключ для общего пользования, а затем использовать этот открытый ключ и закрытый ключ для всех остальных действий: шифрование, расшифровка, проверка, вы не увидите этой ошибки.
Ответ или решение
Ошибка "Keyset does not exist" при использовании функции SignData с RSA
Ошибка "Keyset does not exist" может возникнуть по нескольким причинам, особенно когда вы работаете с криптографическими операциями, такими как подпись данных с использованием RSA. Ваша ситуация требует особого подхода, так как вы не используете хранилище сертификатов Windows, а вместо этого загружаете открытый и закрытый ключ из XML-строк.
Причины ошибки
-
Неправильная инициализация ключей: Ваша ошибка может возникнуть если ключи не были корректно загружены из строк XML. Убедитесь, что ваш метод
fromXMLString
действительно работает правильно и возвращает корректный объект RSA. -
Проблемы с форматом ключей: Убедитесь, что форматы открытого и закрытого ключей соответствуют стандартам, принятым в XML. Например, они должны быть закодированы в Base64 и правильно включены в теги
<Modulus>
и<Exponent>
для открытого ключа, а также в соответствующие теги для закрытого ключа. -
Отсутствие привязки к контексту ключей: Ошибка "Keyset does not exist" может указывать на то, что объект RSA не имеет необходимого контекста, связанного с ключами. Ваша реализация
SignData
должна работать с конкретным экземпляром ключа, и если ключи не были инициализированы должным образом, это может привести к ошибке.
Решения проблемы
-
Проверьте инициализацию ключей:
Убедитесь, что вы правильно инициализировали ключи с помощьюfromXMLString
и что объектrsa
корректно создался на основе предоставленных строк. Вот пример того, как это должно выглядеть:Dim rsa As New RSACryptoServiceProvider() rsa.FromXmlString("<RSAKeyValue><Modulus>......</Modulus><Exponent>.....</Exponent></RSAKeyValue>")
-
Используйте те же ключи для всех операций:
Как было упомянуто в вашем посте, убедитесь, что вы используете один комплект пары ключей для всех операций, таких как подпись данных и их верификация. Попробуйте сохранить ключи в одном месте и применять их при каждой необходимости:Dim signedData As Byte() = rsa.SignData(buffer, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1)
-
Обратите внимание на версию способа подписи:
Убедитесь, что версия методаSignData
, которую вы используете, поддерживает свой вариант библиотеки и полностью совместима с вашей реализацией. Иногда, если вы используете устаревший метод в новой среде, это может привести к непредсказуемым результатам. -
Ассоциация с контекстом ключей:
Убедитесь, что объект RSA, с которым вы работаете, был ассоциирован с корректным контекстом ключей. Некоторые функции могут требовать явного указания, какой именно ключ нужно использовать.
Заключение
При работе с криптографией важна аккуратность на всех этапах: от загрузки ключей до выполнения операций. Загружая ключи из строк XML, вы автоматически устраняете зависимость от хранилища сертификатов Windows, но также должны быть уверены, что ключи правильно инициализированы и связаны с необходимыми криптографическими операциями.
Если вы продолжаете сталкиваться с этой ошибкой, проверьте структуру ваших ключей, убедитесь в их корректной инициализации и согласованности в различных действиях. Это поможет вам избежать подобных проблем в будущем и обеспечит безопасное и надежное использование криптографических методов в вашем приложении.