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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

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