Ошибка провайдера CryptoAPI RSA Schannel
Я пытаюсь сгенерировать цифровую подпись с помощью "Microsoft RSA SChannel Cryptographic Provider". После получения дескриптора контейнера, я создаю подпись с помощью CryptGenKey(). Но эта функция возвращает FALSE.
Ошибка dwError для CryptGenKey () возвращает 80090008.
То же самое работает для любого другого типа провайдера. Кроме того, когда я пытаюсь создать пару обмена ключами для одного и того же провайдера, она работает нормально. Что я делаю неправильно?
#include <Windows.h>
#include <wincrypt.h>
int main()
{
HCRYPTPROV phProv = 0;
LPTSTR pszContainer = NULL;
DWORD dwFlags = 0;
bool flag;
DWORD_PTR dwError;
HCRYPTKEY phKey;
flag = CryptAcquireContext(&phProv, pszContainer,
MS_DEF_RSA_SCHANNEL_PROV, PROV_RSA_SCHANNEL, dwFlags);
if (!flag)
{
flag = CryptAcquireContext(&phProv, pszContainer,
MS_DEF_RSA_SCHANNEL_PROV, PROV_RSA_SCHANNEL, CRYPT_NEWKEYSET);
}
dwError = GetLastError();
flag = CryptGenKey(phProv, AT_SIGNATURE, CRYPT_EXPORTABLE, &phKey);
dwError = GetLastError();
flag = CryptGetUserKey(phProv, AT_SIGNATURE, &phKey);
dwError = GetLastError();
return 0;
}
Благодарю.
1 ответ
Поставщик SChannel не поддерживает AT_SIGNATURE
Только ключи RSA AT_EXCHANGE
, Это в основном пережиток раннего TLS (когда он еще был SSL), когда ключи обменивались с использованием шифрования RSA вместо согласования с использованием соглашения о ключе Диффи-Хеллмана, подписанного с подписью RSA... и затем, по-видимому, "все знают, как SChannel провайдер ведет себя, зачем его менять?". (Наиболее близким к тому, что записывается, является https://msdn.microsoft.com/en-us/library/windows/desktop/aa387690(v=vs.85).aspx, который показывает CALG_RSA_KEYX и не говорит о CALG_RSA_SIGN.)
В CAPI AT_EXCHANGE
ключ может делать как шифрование и подпись, так и AT_SIGNATURE
Ключ можно только подписать.
В целом команда криптографии Windows не рекомендует новый код, написанный на CAPI (у меня нет письменных свидетельств, отличных от того, что я только что написал; в основном это связано с их встречами). У CNG гораздо более удобный API, и он более мощный. СПГ поставляется обратно в Windows Vista, поэтому он доступен во всех поддерживаемых версиях Windows. CAPI больше не служит цели "хорошо, у него больше покрытия", это просто "старый, грубый, унаследованный API" (если вы не пишете код для неподдерживаемых ОС, таких как XP).
Если вы используете CAPI, я не знаю, почему вы хотите использовать провайдера SChannel. PROV_RSA_AES через MS_ENH_RSA_AES_PROV является наиболее функциональным RSA, который имеет CAPI (сигнатуры PKCS на основе SHA-2). Но он устарел по сравнению с поставщиком программного обеспечения в CNG (сигнатура PSS, OAEP с SHA-2 и поддерживает значения открытых показателей больше 2^32 (хорошо, это не обычная необходимость, но это что-то, что CNG исправило)).