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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline al  
#1 Оставлено : 7 мая 2016 г. 11:50:11(UTC)
al

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

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

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

Запускаю /opt/cprocsp/src/doxygen/CSP/CreatingHash с входными данными, взятыми из ГОСТ 34.11-2012.
Результат не совпадает с эталоном (с результатом из ГОСТа).

Проверку делаю на функции с длиной хеш-кода 256 бит.


Помогите, пожалуйста разобраться.


Система:
Цитата:

lanin@debian1:~$ uname -a
Linux debian1 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2 (2016-04-08) x86_64 GNU/Linux


CSP:
Цитата:

lanin@debian1:~$ cat /etc/opt/cprocsp/release
CryptoPro CSP ver. 4.0.0.0.9708.


Лицензия имеется:
Цитата:

lanin@debian1:/$ /opt/cprocsp/sbin/amd64/cpconfig -license -view
License validity:
...
Expires: ... month(s) ... day(s)
License type: Client.



Тестовый исходник:
Цитата:

/*
* Copyright(C) 2000-2010 Проект ИОК
*
* Этот файл содержит информацию, являющуюся
* собственностью компании Крипто Про.
*
* Любая часть этого файла не может быть скопирована,
* исправлена, переведена на другие языки,
* локализована или модифицирована любым способом,
* откомпилирована, передана по сети с или на
* любую компьютерную систему без предварительного
* заключения соглашения с компанией Крипто Про.
*
* Программный код, содержащийся в этом файле, предназначен
* исключительно для целей обучения и не может быть использован
* для защиты информации.
*
* Компания Крипто-Про не несет никакой
* ответственности за функционирование этого кода.
*/

#include <stdio.h>
#ifdef _WIN32
# include <windows.h>
# include <wincrypt.h>
#else
# include <stdlib.h>
#endif
#include <string.h>
#include <WinCryptEx.h>

static void HandleError(const char *s);

// Начало примера (не следует удалять данный комментарий, он используется
// для автоматической сборки документации)
//--------------------------------------------------------------------
// Пример создания хеша из содержимого файла. Имя файла задается в
// командной строке и является обязательным параметром.
// Замечание: под win32 рекомендуется использовать _s аналоги CRT функций.
//--------------------------------------------------------------------

#define TEST_VECTORS 2
#define MAX_MESSAGE_LENGTH 72 // in bytes

unsigned char Message[TEST_VECTORS][MAX_MESSAGE_LENGTH] = {
{
0x32,0x31,0x30,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x39,0x38,0x37,
0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,
0x30,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x39,0x38,0x37,0x36,0x35,
0x34,0x33,0x32,0x31,0x30,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30
},
{
0xfb,0xe2,0xe5,0xf0,0xee,0xe3,0xc8,0x20,0xfb,0xea,0xfa,0xeb,0xef,0x20,0xff,0xfb,
0xf0,0xe1,0xe0,0xf0,0xf5,0x20,0xe0,0xed,0x20,0xe8,0xec,0xe0,0xeb,0xe5,0xf0,0xf2,
0xf1,0x20,0xff,0xf0,0xee,0xec,0x20,0xf1,0x20,0xfa,0xf2,0xfe,0xe5,0xe2,0x20,0x2c,
0xe8,0xf6,0xf3,0xed,0xe2,0x20,0xe8,0xe6,0xee,0xe1,0xe8,0xf0,0xf2,0xd1,0x20,0x2c,
0xe8,0xf0,0xf2,0xe5,0xe2,0x20,0xe5,0xd1
},
};

unsigned char Hash_512[TEST_VECTORS][64] = {
{
0x48,0x6f,0x64,0xc1,0x91,0x78,0x79,0x41,0x7f,0xef,0x08,0x2b,0x33,0x81,0xa4,0xe2,
0x11,0xc3,0x24,0xf0,0x74,0x65,0x4c,0x38,0x82,0x3a,0x7b,0x76,0xf8,0x30,0xad,0x00,
0xfa,0x1f,0xba,0xe4,0x2b,0x12,0x85,0xc0,0x35,0x2f,0x22,0x75,0x24,0xbc,0x9a,0xb1,
0x62,0x54,0x28,0x8d,0xd6,0x86,0x3d,0xcc,0xd5,0xb9,0xf5,0x4a,0x1a,0xd0,0x54,0x1b
},
{
0x28,0xfb,0xc9,0xba,0xda,0x03,0x3b,0x14,0x60,0x64,0x2b,0xdc,0xdd,0xb9,0x0c,0x3f,
0xb3,0xe5,0x6c,0x49,0x7c,0xcd,0x0f,0x62,0xb8,0xa2,0xad,0x49,0x35,0xe8,0x5f,0x03,
0x76,0x13,0x96,0x6d,0xe4,0xee,0x00,0x53,0x1a,0xe6,0x0f,0x3b,0x5a,0x47,0xf8,0xda,
0xe0,0x69,0x15,0xd5,0xf2,0xf1,0x94,0x99,0x6f,0xca,0xbf,0x26,0x22,0xe6,0x88,0x1e
},
};

unsigned char Hash_256[TEST_VECTORS][32] = {
{
0x00,0x55,0x7b,0xe5,0xe5,0x84,0xfd,0x52,0xa4,0x49,0xb1,0x6b,0x02,0x51,0xd0,0x5d,
0x27,0xf9,0x4a,0xb7,0x6c,0xba,0xa6,0xda,0x89,0x0b,0x59,0xd8,0xef,0x1e,0x15,0x9d
},
{
0x50,0x8f,0x7e,0x55,0x3c,0x06,0x50,0x1d,0x74,0x9a,0x66,0xfc,0x28,0xc6,0xca,0xc0,
0xb0,0x05,0x74,0x6d,0x97,0x53,0x7f,0xa8,0x5d,0x9e,0x40,0x90,0x4e,0xfe,0xd2,0x9d
},
};


// Message length in bits
unsigned long long MessageLength[TEST_VECTORS] = {
504, 576
};

#define BUFSIZE 1024
#define GR3411LEN 64

int main(int argc, char *argv[])
{
//-------------------------------------------------------------
// Объявление и инициализация переменных.
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
BYTE rgbFile[BUFSIZE];
DWORD cbRead = 0;
BYTE rgbHash[GR3411LEN];
DWORD cbHash = 0;
int i,j;

for(i=0;i<TEST_VECTORS;i++) {

//--------------------------------------------------------------------
// Получение дескриптора криптопровайдера.

if(!CryptAcquireContext(
&hProv,
NULL,
NULL,
PROV_GOST_2012_256,
CRYPT_VERIFYCONTEXT))
{
HandleError("CryptAcquireContext failed");
}

//--------------------------------------------------------------------
// Создание пустого объекта функции хеширования.

if(!CryptCreateHash(hProv, CALG_GR3411_2012_256, 0, 0, &hHash))
{
CryptReleaseContext(hProv, 0);
HandleError("CryptCreateHash failed");
}

//--------------------------------------------------------------------
// хеширование данных.

memset(rgbFile,0,BUFSIZE);
memset(rgbHash,0,GR3411LEN);
cbRead=MessageLength[i]/8;
memcpy(rgbFile,Message[i],cbRead);

if(!CryptHashData(hHash, rgbFile, cbRead, 0))
{
CryptReleaseContext(hProv, 0);
CryptDestroyHash(hHash);
HandleError("CryptHashData failed");
}

//--------------------------------------------------------------------
// Получение параметра объекта функции хеширования.
cbHash = GR3411LEN;
if(!CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0))
{
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
HandleError("CryptGetHashParam failed");
}

printf("\nThe Message is: \n");
for(j = 0; j < cbRead; j++) {
printf("%02X", rgbFile[j]);
}
printf("\n");

printf("\nGR3411 hash is: \n");
for(j = 0; j < cbHash; j++) {
printf("%02X", rgbHash[j]);
}
printf("\n");

//--------------------------------------------------------------------
// Освобождение.
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
}

return 0;
}

// Конец примера
// (не следует удалять данный комментарий, он используется
// для автоматической сборки документации)

//------------------------------------------------------------------------------
// В этом примере используется функция HandleError, функция обработки
// простых ошибок, для печати сообщения об ошибке в стандартный файл
// ошибок (stderr) и выхода из программы.
// В большинстве приложений эта функция заменяется другой функцией,
// которая выводит более полное сообщение об ошибке.
//------------------------------------------------------------------------------
void HandleError(const char *s)
{
DWORD err = GetLastError();
printf("Error number : 0x%x\n", err);
printf("Error description: %s\n", s);
if(!err) err = 1;
exit(err);
}


Сборка и запуск (штатно, как в экзамплах):
Цитата:

lanin@debian1:~$ eval `/opt/cprocsp/src/doxygen/setenv.sh --64`
No compiler specified... trying to guess
g++ found in the path
lanin@debian1:~$ cd /opt/cprocsp/src/doxygen/CSP/CreatingHash
lanin@debian1:/opt/cprocsp/src/doxygen/CSP/CreatingHash$ make -f ./Makefile.unix
gcc -DUNIX -DHAVE_LIMITS_H -DHAVE_STDINT_H -I/opt/cprocsp/include -I/opt/cprocsp/include/cpcsp -I/opt/cprocsp/include/asn1c/rtsrc -I/opt/cprocsp/include/asn1data -DSIZEOF_VOID_P=8 -g -c -o CreatingHash.o CreatingHash.c
g++ CreatingHash.o -L/opt/cprocsp/lib/amd64 -lssp -lcapi10 -lcapi20 -lrdrsup -lpthread -g -o CreatingHash
lanin@debian1:/opt/cprocsp/src/doxygen/CSP/CreatingHash$ ./CreatingHash

The Message is:
323130393837363534333231303938373635343332313039383736353433323130393837363534333231303938373635343332313039383736353433323130

GR3411 hash is:
1EBAD9552DEB878020F7E5C088784B87F006F86BAACB19CF094DC5D48950E0F6

The Message is:
FBE2E5F0EEE3C820FBEAFAEBEF20FFFBF0E1E0F0F520E0ED20E8ECE0EBE5F0F2F120FFF0EEEC20F120FAF2FEE5E2202CE8F6F3EDE220E8E6EEE1E8F0F2D1202CE8F0F2E5E220E5D1

GR3411 hash is:
0E7AB4EFD0915EAAC2DAB58DAE45D0F28D14F83C57794B3338F7872C10542C19
lanin@debian1:/opt/cprocsp/src/doxygen/CSP/CreatingHash$



PS. В Windows результаты такие же.

Отредактировано пользователем 7 мая 2016 г. 12:13:37(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#2 Оставлено : 7 мая 2016 г. 13:27:30(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 722 раз в 626 постах
Попробуйте перевернуть вход:
https://ru.wikipedia.org....D0.B0.D0.BA.D1.82.D1.8B
Знания в базе знаний, поддержка в центре поддержки
thanks 1 пользователь поблагодарил Максим Коллегин за этот пост.
al оставлено 07.05.2016(UTC)
Offline al  
#3 Оставлено : 7 мая 2016 г. 23:11:11(UTC)
al

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

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
Спасибо!!!

Да, после переворачивания всё заработало.

Подаю байты сообщения в обратном порядке, вывожу байты результирующего хеша тоже в обратном порядке.

Вот код (добавил тест на 512 хеш-код, вызов функции переворачивания выделил)

Цитата:

/*
* Copyright(C) 2000-2010 Проект ИОК
*
* Этот файл содержит информацию, являющуюся
* собственностью компании Крипто Про.
*
* Любая часть этого файла не может быть скопирована,
* исправлена, переведена на другие языки,
* локализована или модифицирована любым способом,
* откомпилирована, передана по сети с или на
* любую компьютерную систему без предварительного
* заключения соглашения с компанией Крипто Про.
*
* Программный код, содержащийся в этом файле, предназначен
* исключительно для целей обучения и не может быть использован
* для защиты информации.
*
* Компания Крипто-Про не несет никакой
* ответственности за функционирование этого кода.
*/

#include <stdio.h>
#ifdef _WIN32
# include <windows.h>
# include <wincrypt.h>
#else
# include <stdlib.h>
#endif
#include <string.h>
#include <WinCryptEx.h>

static void HandleError(const char *s);

// Начало примера (не следует удалять данный комментарий, он используется
// для автоматической сборки документации)
//--------------------------------------------------------------------
// Пример создания хеша из содержимого файла. Имя файла задается в
// командной строке и является обязательным параметром.
// Замечание: под win32 рекомендуется использовать _s аналоги CRT функций.
//--------------------------------------------------------------------

#define TEST_VECTORS 2
#define MAX_MESSAGE_LENGTH 72 // in bytes

unsigned char Message[TEST_VECTORS][MAX_MESSAGE_LENGTH] = {
{
0x32,0x31,0x30,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x39,0x38,0x37,
0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,
0x30,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x39,0x38,0x37,0x36,0x35,
0x34,0x33,0x32,0x31,0x30,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30
},
{
0xfb,0xe2,0xe5,0xf0,0xee,0xe3,0xc8,0x20,0xfb,0xea,0xfa,0xeb,0xef,0x20,0xff,0xfb,
0xf0,0xe1,0xe0,0xf0,0xf5,0x20,0xe0,0xed,0x20,0xe8,0xec,0xe0,0xeb,0xe5,0xf0,0xf2,
0xf1,0x20,0xff,0xf0,0xee,0xec,0x20,0xf1,0x20,0xfa,0xf2,0xfe,0xe5,0xe2,0x20,0x2c,
0xe8,0xf6,0xf3,0xed,0xe2,0x20,0xe8,0xe6,0xee,0xe1,0xe8,0xf0,0xf2,0xd1,0x20,0x2c,
0xe8,0xf0,0xf2,0xe5,0xe2,0x20,0xe5,0xd1
},
};

unsigned char Hash_512[TEST_VECTORS][64] = {
{
0x48,0x6f,0x64,0xc1,0x91,0x78,0x79,0x41,0x7f,0xef,0x08,0x2b,0x33,0x81,0xa4,0xe2,
0x11,0xc3,0x24,0xf0,0x74,0x65,0x4c,0x38,0x82,0x3a,0x7b,0x76,0xf8,0x30,0xad,0x00,
0xfa,0x1f,0xba,0xe4,0x2b,0x12,0x85,0xc0,0x35,0x2f,0x22,0x75,0x24,0xbc,0x9a,0xb1,
0x62,0x54,0x28,0x8d,0xd6,0x86,0x3d,0xcc,0xd5,0xb9,0xf5,0x4a,0x1a,0xd0,0x54,0x1b
},
{
0x28,0xfb,0xc9,0xba,0xda,0x03,0x3b,0x14,0x60,0x64,0x2b,0xdc,0xdd,0xb9,0x0c,0x3f,
0xb3,0xe5,0x6c,0x49,0x7c,0xcd,0x0f,0x62,0xb8,0xa2,0xad,0x49,0x35,0xe8,0x5f,0x03,
0x76,0x13,0x96,0x6d,0xe4,0xee,0x00,0x53,0x1a,0xe6,0x0f,0x3b,0x5a,0x47,0xf8,0xda,
0xe0,0x69,0x15,0xd5,0xf2,0xf1,0x94,0x99,0x6f,0xca,0xbf,0x26,0x22,0xe6,0x88,0x1e
},
};

unsigned char Hash_256[TEST_VECTORS][32] = {
{
0x00,0x55,0x7b,0xe5,0xe5,0x84,0xfd,0x52,0xa4,0x49,0xb1,0x6b,0x02,0x51,0xd0,0x5d,
0x27,0xf9,0x4a,0xb7,0x6c,0xba,0xa6,0xda,0x89,0x0b,0x59,0xd8,0xef,0x1e,0x15,0x9d
},
{
0x50,0x8f,0x7e,0x55,0x3c,0x06,0x50,0x1d,0x74,0x9a,0x66,0xfc,0x28,0xc6,0xca,0xc0,
0xb0,0x05,0x74,0x6d,0x97,0x53,0x7f,0xa8,0x5d,0x9e,0x40,0x90,0x4e,0xfe,0xd2,0x9d
},
};


// Message length in bits
unsigned long long MessageLength[TEST_VECTORS] = {
504, 576
};

static void Reverse(unsigned char * pbSrc, unsigned cbSrc){
unsigned char * pbTmp = 0;
int i;
pbTmp=(unsigned char *)malloc(cbSrc);
for(i=0;i<cbSrc;i++){
pbTmp[i]=pbSrc[cbSrc-1-i];
}
memcpy(pbSrc,pbTmp,cbSrc);
free(pbTmp);
}

#define BUFSIZE 1024
#define GR3411LEN 64

int main(int argc, char *argv[])
{
//-------------------------------------------------------------
// Объявление и инициализация переменных.
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
BYTE rgbFile[BUFSIZE];
DWORD cbRead = 0;
BYTE rgbHash[GR3411LEN];
DWORD cbHash = 0;
int i,j,k;

for(k=0;k<2;k++)
for(i=0;i<TEST_VECTORS;i++) {

//--------------------------------------------------------------------
// Получение дескриптора криптопровайдера.

if(!CryptAcquireContext(
&hProv,
NULL,
NULL,
k ? PROV_GOST_2012_512 : PROV_GOST_2012_256,
CRYPT_VERIFYCONTEXT))
{
HandleError("CryptAcquireContext failed");
}

//--------------------------------------------------------------------
// Создание пустого объекта функции хеширования.

if(!CryptCreateHash(hProv, k ? CALG_GR3411_2012_512 : CALG_GR3411_2012_256, 0, 0, &hHash))
{
CryptReleaseContext(hProv, 0);
HandleError("CryptCreateHash failed");
}

//--------------------------------------------------------------------
// хеширование данных.

memset(rgbFile,0,BUFSIZE);
memset(rgbHash,0,GR3411LEN);
cbRead=MessageLength[i]/8;
memcpy(rgbFile,Message[i],cbRead);

printf("\nThe Message N_%d is: \n", i+1);
for(j = 0; j < cbRead; j++) {
printf("%02X", rgbFile[j]);
}
printf("\n");

Reverse(rgbFile, cbRead);

if(!CryptHashData(hHash, rgbFile, cbRead, 0))
{
CryptReleaseContext(hProv, 0);
CryptDestroyHash(hHash);
HandleError("CryptHashData failed");
}

//--------------------------------------------------------------------
// Получение параметра объекта функции хеширования.
cbHash = GR3411LEN;
if(!CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0))
{
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
HandleError("CryptGetHashParam failed");
}

Reverse(rgbHash, cbHash);

printf("\nGR3411 (%d bit) hash is: \n", k ? 512 : 256);
for(j = 0; j < cbHash; j++) {
printf("%02X", rgbHash[j]);
}
printf("\n");

//--------------------------------------------------------------------
// Освобождение.
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);


}

return 0;
}

// Конец примера
// (не следует удалять данный комментарий, он используется
// для автоматической сборки документации)

//------------------------------------------------------------------------------
// В этом примере используется функция HandleError, функция обработки
// простых ошибок, для печати сообщения об ошибке в стандартный файл
// ошибок (stderr) и выхода из программы.
// В большинстве приложений эта функция заменяется другой функцией,
// которая выводит более полное сообщение об ошибке.
//------------------------------------------------------------------------------
void HandleError(const char *s)
{
DWORD err = GetLastError();
printf("Error number : 0x%x\n", err);
printf("Error description: %s\n", s);
if(!err) err = 1;
exit(err);
}


Вот вывод:
Цитата:

lanin@debian1:/opt/cprocsp/src/doxygen/CSP/CreatingHash$ ./CreatingHash

The Message N_1 is:
323130393837363534333231303938373635343332313039383736353433323130393837363534333231303938373635343332313039383736353433323130

GR3411 (256 bit) hash is:
00557BE5E584FD52A449B16B0251D05D27F94AB76CBAA6DA890B59D8EF1E159D

The Message N_2 is:
FBE2E5F0EEE3C820FBEAFAEBEF20FFFBF0E1E0F0F520E0ED20E8ECE0EBE5F0F2F120FFF0EEEC20F120FAF2FEE5E2202CE8F6F3EDE220E8E6EEE1E8F0F2D1202CE8F0F2E5E220E5D1

GR3411 (256 bit) hash is:
508F7E553C06501D749A66FC28C6CAC0B005746D97537FA85D9E40904EFED29D

The Message N_1 is:
323130393837363534333231303938373635343332313039383736353433323130393837363534333231303938373635343332313039383736353433323130

GR3411 (512 bit) hash is:
486F64C1917879417FEF082B3381A4E211C324F074654C38823A7B76F830AD00FA1FBAE42B1285C0352F227524BC9AB16254288DD6863DCCD5B9F54A1AD0541B

The Message N_2 is:
FBE2E5F0EEE3C820FBEAFAEBEF20FFFBF0E1E0F0F520E0ED20E8ECE0EBE5F0F2F120FFF0EEEC20F120FAF2FEE5E2202CE8F6F3EDE220E8E6EEE1E8F0F2D1202CE8F0F2E5E220E5D1

GR3411 (512 bit) hash is:
28FBC9BADA033B1460642BDCDDB90C3FB3E56C497CCD0F62B8A2AD4935E85F037613966DE4EE00531AE60F3B5A47F8DAE06915D5F2F194996FCABF2622E6881E
lanin@debian1:/opt/cprocsp/src/doxygen/CSP/CreatingHash$

Отредактировано пользователем 7 мая 2016 г. 23:19:53(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.