Подтвердить что ты не робот

System.Security.Cryptography.CryptographicException: набор ключей не существует

Когда я делаю сертификат x509 для сообщения encypt и decypt, я получил некоторую информацию об ошибке и не смог исправить эту проблему. Может ли кто-нибудь когда-нибудь решить эту ошибку? спасибо.

Описание: Необработанное исключение возникло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительной информации об ошибке и ее возникновении в коде.

Сведения об исключении:

System.Security.Cryptography.CryptographicException: набор ключей не существует.

Ошибка источника:

Линия 53: использование (RSACryptoServiceProvider rsaProviderDecrypt = (RSACryptoServiceProvider) cerDecrypt.PublicKey.Key) Строка 54:
{Строка 55: plainHashBytes = rsaProviderDecrypt.Decrypt(encryptedHashBytes, false); Строка 56:
rsaProviderDecrypt.Clear(); Строка 57:
rsaProviderDecrypt.Dispose();

Исходный файл: E:\PayUSite\PayMvcApp\Controllers\HashMessageController.cs Строка: 55

Трассировка стека:

[CryptographicException: набор ключей не существует. ]
System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 ч) +41
System.Security.Cryptography.RSACryptoServiceProvider.DecryptKey(SafeKeyHandle pKeyContext, Byte [] pbEncryptedKey, Int32 cbEncryptedKey, Boolean fOAEP, ObjectHandleOnStack ohRetDecryptedKey) +0
System.Security.Cryptography.RSACryptoServiceProvider.Decrypt(байт [] rgb, Boolean fOAEP) +579

исходный код:

string docFile = Server.MapPath("~/docx/DirectAccess_StepByStep.doc");
HashAlgorithm hash = HashAlgorithm.Create("SHA1");
byte[] hashedBytes;
using (FileStream fs = new FileStream(docFile, FileMode.Open))
{
    //compute message hash value
    hashedBytes = hash.ComputeHash(fs);
    hash.Dispose();
    fs.Close();
}

string hashedString = Convert.ToBase64String(hashedBytes);

//encrypt message digest
string priKeyFile = Server.MapPath("~/certificate/WosMiddle.pfx");
X509Certificate2 certEncrypt = new X509Certificate2(priKeyFile, "123456");
byte[] encryptedHashBytes;
using (RSACryptoServiceProvider rsaProviderEncrypt = (RSACryptoServiceProvider)certEncrypt.PrivateKey)
{
    encryptedHashBytes = rsaProviderEncrypt.Encrypt(hashedBytes, false);
    rsaProviderEncrypt.Dispose();
}

//decrypt message digest
string pubKeyFile = Server.MapPath("~/certificate/WosMiddle-pubkey.cer");
X509Certificate2 cerDecrypt = new X509Certificate2(pubKeyFile);
byte[] plainHashBytes;
using (RSACryptoServiceProvider rsaProviderDecrypt = (RSACryptoServiceProvider)cerDecrypt.PublicKey.Key)
{
    //***will throw error message here...***
    plainHashBytes = rsaProviderDecrypt.Decrypt(encryptedHashBytes, false);
    rsaProviderDecrypt.Dispose();
}

//verify message whether was modified
string docFile2 = Server.MapPath("~/docx/DirectAccess_StepByStep.doc");
HashAlgorithm hash2 = HashAlgorithm.Create("SHA1");
byte[] hashedBytes2;
using (FileStream fs2 = new FileStream(docFile2, FileMode.Open))
{
    //compute message hash value
    hashedBytes2 = hash.ComputeHash(fs2);
    fs2.Close();
}

//compare hash value
bool isEqual = plainHashBytes.SequenceEqual(hashedBytes2);
4b9b3361

Ответ 1

Этот вопрос старый, но для тех, кто ищет решение, продолжая использовать Encrypt и Decrypt, вот как мне удается решить эту ошибку:

База - это мой сертификат, установлен неверный путь, дважды щелкнув файл .pfx и выбрав хранилище.

Неправильный способ установки сертификата

1. Дважды щелкните сертификат:

certificate file

2. Мастер откроется, нажмите следующую кнопку:

wizard 0

3. Мастер показывает расположение сертификатов, нажмите следующую кнопку:

wizard 1

4. Введите пароль и нажмите "Далее" :

wizard 2

5. Выберите магазин и нажмите "Далее" :

wizard 3

6. Мастер отобразит информацию о сертификате, нажмите кнопку Готово

wizard 4

7. Отображается диалог Succes:

wizard 5

Итак, в этот момент у меня была ошибка "Ключ не существует" .


Чтобы решить это, я продолжил этот путь (правильный путь)

1. Выполните консоль Microsoft Management Console (mmc.exe):

execute mmc

2. Простой экземпляр MMC показал:

mmc showed

3. Нажмите "Файл" → "Добавить/удалить оснастку"...

add snap-in

4. Выберите оснастку сертификата щелчком по кнопке Добавить:

add certificate snap-in

5. Выберите Аккаунт компьютера, затем нажмите кнопку Далее:

<Т411 >

6. Выберите Локальный компьютер, затем нажмите кнопку Готово:

selecct local computer

7. Теперь добавлена ​​оснастка сертификата, нажмите кнопку ОК:

certificate snap-in shows

8. Выберите личный магазин, затем щелкните правой кнопкой мыши и выберите Импорт:

select personal store and import

9. Просмотрите сертификат и нажмите "Далее" :

browse certificate

10. Введите пароль, затем нажмите кнопку Далее:

enter image description here

11. Автоматически выберите хранилище сертификатов:

automatically select the store

12. Информация о сертификате показывает:

certificate information

13. Диалоговое окно "Успешное диалоговое окно" показывает:

enter image description here

14. Обновите MMConsole, чтобы показать сертификат:

refresh mmc

15. Щелкните правой кнопкой мыши по сертификату, затем нажмите Управление приватными ключами...:

manage private keys

16. Добавьте идентификатор пула или пользователь IIS в моем случае, я добавил IIS_IUSRS:

add iis_iusrs

17. Пользователь добавлен, нажмите кнопку ОК:

user added

И он завершен, теперь клавиша существует!

Ответ 2

Приложение может пытаться выполнить запись в следующий путь к папке: C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys

Если ваше приложение использует олицетворение или использует пользователя IUSR_MACHINENAME, настройте учетные записи в папке MachineKeys и дайте пользователю прочитать и выполнить, сохранить содержимое списка, прочитать, записать. Если это не сработает, попробуйте предоставить каждому пользователю те же права.

Ответ 3

Я считаю, что при использовании Encrypt и Decrypt он ожидает открытый ключ для шифрования и закрытый ключ для дешифрования. Таким образом, он терпит неудачу, потому что вы пытаетесь расшифровать без закрытого ключа и что вызывает исключение.

Вы действительно должны использовать метод SignData для создания подписи и VerifyData для проверки.

Ответ 4

Я столкнулся с той же проблемой. Сообщение не является идеальным, и в моем случае у моего пользователя не было разрешения на доступ к закрытому ключу. Вы можете исправить это, выполнив следующие действия:

  1. Открыть MMC
  2. Добавить оснастку сертификата
  3. выберите сертификат, который вы хотите использовать
  4. щелкните его правой кнопкой мыши и выберите "Все задачи"/"Управление личными ключами..."
  5. Добавьте своего пользователя в список авторизованных пользователей и разрешите "Полный доступ"

Ответ 5

Я столкнулся с этой ошибкой, когда я не загружал в PrivateKey из моего сертификата в мой подписанный XML-элемент SigningKey при попытке подписать ответ SAML.

signedElement.SigningKey = myCertificate.PrivateKey;

Ответ 6

Я получил ту же ошибку, что и OP: "System.Security.Cryptography.CryptographicException: набор ключей не существует"

Решение (для меня) было: Visual Studio должна быть (запускаться от имени администратора)

Как мне объяснили (YMMV), VS должен быть запущен от имени администратора, чтобы извлечь закрытый ключ сертификатов из хранилища ключей, чтобы согласовать аутентификацию/рукопожатие с keyvault.

Ответ 7

Попробуйте запустить vs от имени администратора. Работал для меня

Ответ 8

В моем случае закрытый ключ был сохранен в "C:\ProgramData\Microsoft\Crypto\Keys", а не в папке machinekeys - вы можете проверить с помощью certutil, чтобы узнать "Уникальное имя контейнера", которое будет закрытым ключом.

Сейчас я сканирую крипто-каталог, чтобы найти совпадение. С этим соответствием я могу установить правильный ACL на соответствующий файл