Перейти к контенту

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


Рекомендуемые сообщения

Добрый день!

Не получается создать ключ на основе данных пользователя, ключ создается для шифрования ГОСТ 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

Ссылка на комментарий
Поделиться на других сайтах

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

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

 

Ссылка на комментарий
Поделиться на других сайтах

  • 2 года спустя...
On 9/7/2016 at 8:25 PM, BRV said:

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

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

 

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

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

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

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...

Важная информация

Продолжая пользоваться сайтом вы принимаете Условия использования.