Ошибка провайдера 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 исправило)).

Другие вопросы по тегам