2

データに AES 256 ビット暗号化を使用したいのですが、それは "MS_ENH_RSA_AES_PROV" によって提供されます。そのために、CryptAcquireContext の 3 番目のパラメーターとして pszProviderName=TEXT("MS_ENH_RSA_AES_PROV") を使用して以下のコードを実行しようとすると、エラー番号 80090019 のような出力が得られます。 .このエラー コードは、「要求されたプロバイダーが存在しない」ことを意味します。

#include <windows.h>
#include <Wincrypt.h>

#pragma comment(lib, "crypt32.lib")

void main(void) 
{ 
    // Handle for the cryptographic provider context.
    HCRYPTPROV hCryptProv;

    // The name of the container.
    LPCTSTR pszContainerName = TEXT("MyFilter_Container");

    // The name of the provider
    LPCTSTR pszProviderName = TEXT("MS_ENH_RSA_AES_PROV");

    // Begin processing. Attempt to acquire a context
    if(CryptAcquireContext(
        &hCryptProv,
        pszContainerName,
        pszProviderName,
        PROV_RSA_FULL,
        0))
    {
        _tprintf(TEXT("A crypto context acquired"));

        // Release the CSP.
        if(hCryptProv)
        {
            if(!(CryptReleaseContext(hCryptProv, 0)))
            {
                 _tprintf(TEXT("Error during CryptReleaseContext."));
            }
        }
    }
    else
    {
        _tprintf(TEXT("An error occurred in the program. \n"));
        _tprintf(TEXT("Error number %x.\n"), GetLastError());
        exit(1); 
    }
}

また、pszProviderName=TEXT("Microsoft Enhanced RSA and AES Cryptographic Provider") を使用すると、エラー番号 0x8009001b が表示されます。これは、「dwProvType で指定されたプロバイダー タイプが、見つかったプロバイダー タイプと一致せず、このエラーは pszProviderName が指定した場合にのみ発生する可能性がある」ことを意味します上記のエラー番号は、msdn の CryptAcquireContext ドキュメントで指定されています。なぜこれが起こっているのかわかりません。このパラメータが Null の場合、デフォルトの CSP を使用することを意味し、その場合はすべて正常に動作します。windows7を使用しています。この CSP は利用できませんか、それとも他の理由がありますか?誰か助けてください。よろしくお願いします。

4

1 に答える 1

2

これがまさにあなたが必要としているものかどうかはわかりませんが、MSDN の例に従って、 2 つの変更を加えることでコードを成功させることができます。

まず、MSDN によると、これMS_ENH_RSA_AES_PROVは Windows XP では別の名前であり、コード内ではPROV_RSA_AESなくのプロバイダー タイプで使用する必要がありPROV_RSA_FULLます。

次に、最初のエラーをトラップし、新しいキー コンテナーを作成する必要がある状況で取得操作を繰り返します。

以下は、MSDN の例に従って適用された元のコードであり、私の Windows 8 システムで正常に動作します。

int _tmain(int argc, _TCHAR* argv[])
{
    // Handle for the cryptographic provider context.
    HCRYPTPROV hCryptProv;

    // The name of the container.
    LPCTSTR pszContainerName = TEXT("MyFilter_Container");

    // Begin processing. Attempt to acquire a context
    if(CryptAcquireContext(
        &hCryptProv,
        pszContainerName,
        MS_ENH_RSA_AES_PROV,
        PROV_RSA_AES,
        0))
    {
        _tprintf(TEXT("A crypto context acquired"));

        // Release the CSP.
        if(hCryptProv)
        {
            if(!(CryptReleaseContext(hCryptProv, 0)))
            {
                _tprintf(TEXT("Error during CryptReleaseContext."));
            }
        }
    }
    else
    {
        DWORD dwError = GetLastError();
        if (dwError == NTE_BAD_KEYSET)
        {
            if(CryptAcquireContext(
                &hCryptProv,
                pszContainerName,
                MS_ENH_RSA_AES_PROV,
                PROV_RSA_AES,
                CRYPT_NEWKEYSET))
            {
                _tprintf(TEXT("A crypto context acquired"));

                // Release the CSP.
                if(hCryptProv)
                {
                    if(!(CryptReleaseContext(hCryptProv, 0)))
                    {
                        _tprintf(TEXT("Error during CryptReleaseContext."));
                    }
                }
            }
            else
            {
                _tprintf(TEXT("Unable to create a new key container. \n"));
                _tprintf(TEXT("Error number %x.\n"), dwError);
                exit(1); 
            }
        }
        else
        {
            _tprintf(TEXT("An error occurred in the program. \n"));
            _tprintf(TEXT("Error number %x.\n"), dwError);
            exit(1); 
        }
    }

    return 0;
}

成功したら、使用CryptGetProvParamされているプロバイダーを見つけるために使用できます。これは、私のシステムでは提供されます

Microsoft Enhanced RSA and AES Cryptographic Provider

于 2013-06-30T06:58:03.077 に答える