Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline ikarasik  
#1 Оставлено : 3 декабря 2014 г. 16:15:22(UTC)
ikarasik

Статус: Новичок

Группы: Участники
Зарегистрирован: 03.12.2014(UTC)
Сообщений: 1

Сказал(а) «Спасибо»: 1 раз
Каким образом можно используя функции КриптоПРО вызвать функцию диверсификации PBKDF2 (P, S, c, dkLen) c использованием в качестве PRF функции HMAC_GOSTR3411 в соответствии с дополнениями PKCS#5 для ГОСТ?

Мои соображения сейчас такие:
Код:

HCRYPTPROV hP = 0;
HCRYPTHASH hH = 0;
HCRYPTKEY hK = 0;
CHAR szPassword[] = "123456\0";
DWORD dwLength = (DWORD)strlen(szPassword);

CPCreateHash(hP, CALG_GR3411_HMAC, 0, 0, &hH);
CPHashData(hP, hH, szPassword, dwLength, 0);
CPDeriveKey(hP, CALG_G28147, hH, CRYPT_EXPORTABLE, &hK);


Правильный ли это подход?
Как указать значение Salt и число итераций алгоритма для PBKDF2?
Как получить строку с ключом? Использовать CPExportKey для hK? Какие параметры тогда нужны?
Offline Станислав Смышляев  
#2 Оставлено : 4 декабря 2014 г. 8:37:31(UTC)
Станислав Смышляев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 10.04.2013(UTC)
Сообщений: 186
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 81 раз в 62 постах
Здравствуйте!

В новых версиях 4.0 (начиная с 4.0 Euler, готовящегося к выходу) реализация PBKDF2 сделана автономным образом: добавлен алгоритм хэша CALG_PBKDF2_2012_512, с помощью которого формирование PBKDF2 может происходить следующим образом:

Код:

CPCreateHash(hProv, CALG_PBKDF2_2012_512, 0, 0, &hHash);
CPSetHashParam(hProv, hHash, HP_PBKDF2_SALT, salt_value_data, 0);
CPSetHashParam(hProv, hHash, HP_PBKDF2_PASSWORD, password_value, 0);
CPSetHashParam(hProv, hHash, HP_PBKDF2_COUNT, (BYTE*)&dwIterationsCount, 0);
CPDeriveKey(hProv, dwKeyAlgId, hHash, CRYPT_EXPORTABLE, &hKey);


Реализация без использования CALG_PBKDF2_2012_512 теоретически тоже возможна, но требует более тонкой работы с объектом хэша – реализация будет выглядеть примерно так (аспекты установки значения сессионного ключа (hKey – дескриптор ключа, значение которого равно паролю) и изъятия его значения не рассматриваю, так как использование подобных механизмов недопустимо при работе с КриптоПро CSP в соответствии с документацией):

Код:


	DWORD hmac_algid = CALG_GR3411_2012_512_HMAC;
	DWORD hmac_len = 64;
	DWORD hp_open = FALSE;		

    CPCreateHash(hProv, hmac_algid, hKey, CP_REUSABLE_HMAC, &hHash);
    CPHashData(hProv, hHash, salt_value_data, salt_value_len, 0);
    CPHashData(hProv, hHash, (BYTE*)&dwBlockNumber, sizeof(DWORD), 0);
    CPGetHashParam(hProv, hHash, HP_HASHVAL, tmp_val, &hmac_len, 0);
    memcpy(res_val, tmp_val, hmac_len);

    for (uint32_t i = 2; i <= dwIterationsCount; i++)
    {
			CPSetHashParam(hProv, hHash, HP_OPEN, (BYTE*)&hp_open, 0);
			CPHashData(hProv, hHash, tmp_val, hmac_len, 0);
			CPGetHashParam(hProv, hHash, HP_HASHVAL, tmp_val, &hmac_len, 0);
			for (DWORD j = 0; j < hmac_len; j++)
	  		  		res_val[j] = res_val[j] ^ tmp_val[j];
    }

Отредактировано пользователем 11 декабря 2014 г. 16:56:51(UTC)  | Причина: Не указана

С уважением,
Станислав Смышляев, к.ф.-м.н.,
Заместитель генерального директора ООО "КРИПТО-ПРО"
Техническую поддержку оказываем здесь.
Наша база знаний.
thanks 3 пользователей поблагодарили Станислав Смышляев за этот пост.
Юрий оставлено 04.12.2014(UTC), Андрей * оставлено 04.12.2014(UTC), ikarasik оставлено 04.12.2014(UTC)
Offline Eteri  
#3 Оставлено : 15 декабря 2015 г. 17:17:37(UTC)
Eteri

Статус: Новичок

Группы: Участники
Зарегистрирован: 15.12.2015(UTC)
Сообщений: 3

Поблагодарили: 1 раз в 1 постах
Здравствуйте!

Пытаюсь сформировать ключ на основе пароля новым способом, используя CALG_PBKDF2_2012_256.
Делаю всё полностью в соответствии с вашим примером, приведённым выше.
Мне выдаёт ошибку 8009000A NTE_BAD_TYPE.

Что может быть не так? На что следует обратить внимание?

Отредактировано пользователем 15 декабря 2015 г. 17:22:02(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#4 Оставлено : 15 декабря 2015 г. 18:24:39(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,691
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2045 раз в 1586 постах
Версия продукта - КриптоПРО CSP какая?
Техническую поддержку оказываем тут
Наша база знаний
Offline Eteri  
#5 Оставлено : 15 декабря 2015 г. 18:31:23(UTC)
Eteri

Статус: Новичок

Группы: Участники
Зарегистрирован: 15.12.2015(UTC)
Сообщений: 3

Поблагодарили: 1 раз в 1 постах
КриптоПро CSP 4.0.9660 Leibniz
Offline Максим Коллегин  
#6 Оставлено : 16 декабря 2015 г. 8:18:16(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,377
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
Приведите код целиком, на какой операции ошибка?
Знания в базе знаний, поддержка в техподдержке
Offline Eteri  
#7 Оставлено : 24 декабря 2015 г. 16:39:44(UTC)
Eteri

Статус: Новичок

Группы: Участники
Зарегистрирован: 15.12.2015(UTC)
Сообщений: 3

Поблагодарили: 1 раз в 1 постах
Всем спасибо!

Во всём разобралась: данные для SALT и PASSWORD надо было в виде структуры вводить.

Всё отлично работает!

Код:
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <windows.h>
#include <Wincrypt.h>
#include <malloc.h>
#include <stdio.h>
#include "WinCryptEx.h"
using namespace std;



int _tmain(int argc, _TCHAR* argv[])
{
  HCRYPTPROV hCryptProv   = 0;
  HCRYPTHASH hHash        = 0;
  HCRYPTKEY  hKey         = 0;
  HCRYPTKEY  hDerivedKey  = 0;
  char  salt_value_data[] = "sflprt49fhi2";
  char  password_value[]  = "123456";
  DWORD dwIterationsCount = 2500;
  DWORD dwMode            = 0;
  BYTE  pbIV[8]           = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x00 };
  BYTE  szCipheroid[39]   = {szOID_Gost28147_89_CryptoPro_A_ParamSet};
  
  BYTE  pbData[8] = {'A','B','C','D','E','F','G','H'};
  DWORD cbData    = sizeof(pbData);

  CRYPT_DATA_BLOB blobSalt     = { sizeof(salt_value_data), (BYTE*)salt_value_data};
  CRYPT_DATA_BLOB blobPassword = { sizeof(password_value) , (BYTE*)password_value };

  printf("Data:\n");
  for( int i = 0; i < cbData; i++)
  {
    printf( "%02x", pbData[i] );
  }
  printf( "\n" );

  //-------CryptAcquireContext------
  if( CryptAcquireContext( &hCryptProv, NULL, NULL, PROV_GOST_2012_256, CRYPT_VERIFYCONTEXT) ){
      if( hCryptProv == NULL )
        printf("Not true!!! \n");

      printf("CryptAcquireContext complete. \n");
  }
  else{
      printf("Acquisition of context failed. %x \n", GetLastError());
      exit(1);
  }
  //-------CryptCreateHash------
  if( CryptCreateHash( hCryptProv, CALG_PBKDF2_2012_256, 0, 0, &hHash) ){
      printf("An empty hash object has been created. \n");
  }
  else{
      printf("Error during CryptCreateHash! %x \n", GetLastError());
      exit(1);
  }
  //-------CryptSetHashParam------SALT------
  if( !CryptSetHashParam( hHash, HP_PBKDF2_SALT, (BYTE*)&blobSalt, 0) ){
      printf("CryptSetHashParam failed to set SALT. %x \n", GetLastError());
      exit(1);
  }
  //-------CryptSetHashParam------PASSWORD------
  if( !CryptSetHashParam( hHash, HP_PBKDF2_PASSWORD, (BYTE*)&blobPassword, 0) ){
      printf("CryptSetHashParam failed to set PASSWORD. %x \n", GetLastError());
      exit(1);
  }
  //-------CryptSetHashParam------COUNT------
  if( !CryptSetHashParam( hHash, HP_PBKDF2_COUNT, (BYTE*)&dwIterationsCount, 0) ){
      printf("CryptSetHashParam failed to set COUNT. %x \n", GetLastError());
      exit(1);
  }
  //-------CryptDeriveKey------
  if( CryptDeriveKey( hCryptProv, CALG_G28147, hHash, CRYPT_EXPORTABLE, &hKey) ){
	    printf("The key has been derived. \n");
  }
  else{
      printf("Error during CryptDeriveKey! %x \n", GetLastError());
      exit(1);
  }
  //-------CryptSetKeyParam------KP_IV------
  if( !CryptSetKeyParam( hKey, KP_IV, (BYTE*)pbIV, 0) ){
      printf("Error during CryptGetKeyParam KP_IV. %x \n", GetLastError());
  }
  //-------CryptSetKeyParam------KP_MODE------
  dwMode = CRYPT_MODE_CFB;
  if( !CryptSetKeyParam( hKey, KP_MODE, (BYTE*)&dwMode, 0) ){
      printf("Error during CryptGetKeyParam KP_MODE. %x \n", GetLastError());
  }
  //-------CryptSetKeyParam------KP_CIPHEROID------
  if( !CryptSetKeyParam( hKey, KP_CIPHEROID, (BYTE*)szCipheroid, 0) ){
      printf("CryptSetKeyParam failed to set KP_CIPHEROID. %x \n", GetLastError());
      exit(1);
  }
  printf( "CryptSetKeyParam succeeded. \n");

  //-------CryptEncrypt------
  CryptEncrypt( hKey, NULL, TRUE, 0, pbData, &cbData, cbData );
 
  printf("Encrypted:\n");
  for( int i=0; i<cbData; i++ ){
    printf( "%02x", pbData[i] );
  }
  printf("\n");

  //-------CryptSetKeyParam------KP_IV------
  if( !CryptSetKeyParam( hKey, KP_IV, (BYTE*)pbIV, 0) ){
      printf("Error during CryptGetKeyParam KP_IV. %x \n", GetLastError());
  }
  //-------CryptDecrypt------
  CryptDecrypt( hKey, NULL, TRUE, 0, pbData, &cbData );

  printf("Decrypted:\n");
  for( int i=0; i<cbData; i++ ){
    printf("%02x",pbData[i]);
  }
  printf("\n");

  for( int i=0; i<cbData; i++){
    printf("%c",pbData[i]);
  }
  printf("\n");
  
  if(hHash)
    CryptDestroyHash(hHash);
  if(hKey)
    CryptDestroyKey(hKey);
  if(hCryptProv)
    CryptReleaseContext(hCryptProv,0);

  printf("The program to derive a key completed without error. \n");
  
	return 0;
}

Отредактировано пользователем 24 декабря 2015 г. 17:08:29(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Eteri за этот пост.
Василий Анисимов оставлено 14.09.2017(UTC)
Offline Василий Анисимов  
#8 Оставлено : 19 сентября 2017 г. 17:49:38(UTC)
Василий Анисимов

Статус: Активный участник

Группы: Участники
Зарегистрирован: 27.04.2012(UTC)
Сообщений: 119
Мужчина
Российская Федерация
Откуда: Digital Design

Сказал «Спасибо»: 19 раз
Поблагодарили: 1 раз в 1 постах
Добрый день. А можно ли экспортировать полученный ключ в блоб для дальнейшего использования?
И желательно без дополнительного его шифрования, так как это нужно только в рамках алгоритма.

Отредактировано пользователем 19 сентября 2017 г. 17:54:31(UTC)  | Причина: Не указана

ВАСИЛИЙ АНИСИМОВ
Ведущий iOS разработчик в «Digital Design»
www.digdes.ru
Offline Станислав Смышляев  
#9 Оставлено : 20 сентября 2017 г. 16:29:30(UTC)
Станислав Смышляев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 10.04.2013(UTC)
Сообщений: 186
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 81 раз в 62 постах
Добрый день!

Экспорт ключей в блоб без шифрования ключевая система CSP запрещает - для всех ключей.

С уважением,
Станислав Смышляев, к.ф.-м.н.,
Заместитель генерального директора ООО "КРИПТО-ПРО"
Техническую поддержку оказываем здесь.
Наша база знаний.
Offline Василий Анисимов  
#10 Оставлено : 20 сентября 2017 г. 16:38:18(UTC)
Василий Анисимов

Статус: Активный участник

Группы: Участники
Зарегистрирован: 27.04.2012(UTC)
Сообщений: 119
Мужчина
Российская Федерация
Откуда: Digital Design

Сказал «Спасибо»: 19 раз
Поблагодарили: 1 раз в 1 постах
Окей, а с шифрованием как?
Мне ключ надо положить в структуру определенного размера и передать в другую функцию. Именно сам ключ, а не его дескриптор.
ВАСИЛИЙ АНИСИМОВ
Ведущий iOS разработчик в «Digital Design»
www.digdes.ru
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.