Jump to content
DmitriyB

Ошибка при создании ключа шифрования на основе данных пользователя CryptDeriveKey.

Recommended Posts

Добрый день!

Не получается создать ключ на основе данных пользователя, ключ создается для шифрования ГОСТ 28147 89 (CPCSP_ENCRYPT_ID), используемые данные пользователя - результат действия хэш-функции ГОСТ Р 34.11-2012 (CSP_HASH_2012_256BIT_ID). Причем при использовании хэш функции ГОСТ Р 34.11-94 (CPCSP_HASH_ID) создание ключа проходит корректно.
Привожу код своей программы. Архив всего проекта - в приложении.

// Генерация ключа шифрования на основе хэша пароля
#include "importitccsp.h"
#include <string>

void HandleError(char* s);

int main()
{
    HCRYPTPROV hCryptProv = 0;
    HCRYPTHASH hHash = 0;
    HCRYPTKEY hKey = 0;
    BYTE password[] = { 0, 1, 2, 3, 4, 5, 6 };
    ALG_ID hashIds[] = { CPCSP_HASH_ID, CSP_HASH_2012_256BIT_ID, CPCSP_HASH_ID };
    DWORD dwData = 0;
    DWORD dwLen = 0;

    if( !CryptAcquireContext( &hCryptProv, NULL, VPN_DEF_PROV, VPN_PROV_TYPE, CRYPT_VERIFYCONTEXT ) ) {
        HandleError("Error during CryptAcquireContext.");
    }

    for( int i = 0; i < sizeof(hashIds)/sizeof(ALG_ID); i++ ) {

        printf( "Hash ID: 0x%X\n", hashIds[i] );

        if( !CryptCreateHash( hCryptProv, hashIds[i], 0, 0, &hHash ) ) {
            HandleError("Error during CryptCreateHash.");
            goto next_iter;
        }

        if( !CryptHashData( hHash, password, sizeof(password), 0 ) ) {
            HandleError("Error during CryptHashData.");
            goto next_iter;
        }

        if( !CryptDeriveKey( hCryptProv, CPCSP_ENCRYPT_ID, hHash, 0, &hKey ) ) {
            HandleError("Error during CryptDeriveKey.");
            goto next_iter;
        }

        dwLen = sizeof(DWORD);
        if( !CryptGetKeyParam( hKey, KP_KEYLEN, (BYTE*)(&dwData), &dwLen, 0 ) ) {
            HandleError("Error during CryptGetKeyParam.");
            goto next_iter;
        }

        printf( "Key correct, length = %u\n", dwData );

next_iter:
        if( hHash )
            CryptDestroyHash( hHash );
        if( hKey )
            CryptDestroyKey( hKey );
    }

    CryptReleaseContext( hCryptProv, 0 );

    return 0;
}

void HandleError(char *s)
{
    DWORD err = GetLastError();
    printf("Error number     : 0x%x\n", err);
    printf("Error description: %s\n", s);
}

 

Вывод программы:
Hash ID: 0x801E
Key correct, length = 256
Hash ID: 0x8021
Error number     : 0x80090027
Error description: Error during CryptDeriveKey.
Hash ID: 0x801E
Key correct, length = 256

Окружение - Win7 x64, установлен ViPNet_CSP_RUS_4.2.2.36190.

Помогите пожалуйста разобраться, с чем связано получение этой ошибки.

 

С уважением,

Дмитрий

test_vipnet.7z

Share this post


Link to post
Share on other sites

Дмитрий, добрый день!

В настоящее время код создания производных ключей не работает для новых алгоритмов.

 

Share this post


Link to post
Share on other sites
On 9/7/2016 at 8:25 PM, BRV said:

Дмитрий, добрый день!

В настоящее время код создания производных ключей не работает для новых алгоритмов.

 

Здравствуйте.

Реализована ли данная функциональность на данный момент? (v4.2.10.51307)

Если нет, то когда планируется?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site, you agree to our Terms of Use.