Статус: Участник
Группы: Участники
Зарегистрирован: 25.10.2013(UTC) Сообщений: 12 Сказал(а) «Спасибо»: 4 раз
|
Странное дело, не сходятся значения хеш-функций CALG_GR3411_2012_256 CALG_GR3411_2012_512 для блоков кратных 64. Тестировал против реализации с сайта https://www.streebog.net/Тестовая программа для запуска на windows:
Код:#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "user32.lib")
#include <stdio.h>
#include <windows.h>
#include "wincryptex.h"
#define LOG_WIN32_ERROR {\
LPVOID lpMsgBuf,lpDisplayBuf; \
DWORD dw=GetLastError(); \
FormatMessage( \
FORMAT_MESSAGE_ALLOCATE_BUFFER | \
FORMAT_MESSAGE_FROM_SYSTEM | \
FORMAT_MESSAGE_IGNORE_INSERTS, \
NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), \
(LPTSTR) &lpMsgBuf,\
0, NULL ); \
((CHAR*)lpMsgBuf)[strlen(lpMsgBuf)-2]=0;\
lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, 200 ); \
sprintf_s(lpDisplayBuf, 200, "\n!!! Error at %s:%d, function %s, code 0x%X message [%s]\n" \
,__FILE__, __LINE__, __FUNCTION__, dw, lpMsgBuf); \
printf("%s",lpDisplayBuf); \
LocalFree(lpDisplayBuf); LocalFree(lpMsgBuf);\
}
static const BYTE Message[]=
{
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
};
int RunCSP34112012Test256(BYTE *pbData, int cbData, BYTE *hash);
int RunCSP34112012Test512(BYTE *pbData, int cbData, BYTE *hash);
void PrepareData(BYTE *pbData, int cbData)
{
int i;
i=0;
while(i<cbData)
{
memcpy(pbData+i,Message, min(sizeof(Message),cbData-i));
i+=min(sizeof(Message),cbData-i);
}
}
int write_file(const char *fname, BYTE *data, size_t size)
{
FILE *fp=fopen(fname,"wb");
if(!fp) return -1;
fwrite(data,size,1,fp);
fclose(fp);
return 0;
}
int main()
{
BYTE *pbData, *CSPHash;
char szFilename[200];
int cbData;
SetConsoleOutputCP(1251);
CSPHash=malloc(64);
for(cbData=60;cbData<70;cbData++)
{
pbData=malloc(cbData);
PrepareData(pbData,cbData);
if(!RunCSP34112012Test512(pbData,cbData,CSPHash)) continue;
sprintf(szFilename,"data_%d.bin",cbData);
write_file(szFilename,pbData,cbData);
sprintf(szFilename,"data_%d_csp_hash_512.bin",cbData);
write_file(szFilename,CSPHash,64);
RunCSP34112012Test256(pbData,cbData,CSPHash);
sprintf(szFilename,"data_%d_csp_hash_256.bin",cbData);
write_file(szFilename,CSPHash,32);
free(pbData);
}
free(CSPHash);
return 0;
}
int RunCSP34112012Test256(BYTE *pbData, int cbData, BYTE *hash)
{
HCRYPTPROV hProv;
HCRYPTHASH hHash;
BOOL fResult;
int hashlength;
if (!CryptAcquireContext(&hProv, NULL, NULL , PROV_GOST_2001_DH, CRYPT_VERIFYCONTEXT))
{
printf("Failed to acquire apropriate context.\n");
{ LOG_WIN32_ERROR; return FALSE; }
}
if(!CryptCreateHash(hProv, CALG_GR3411_2012_256 , 0, 0, &hHash))
{ LOG_WIN32_ERROR; return FALSE; }
fResult= CryptHashData(hHash,pbData,cbData,0);
if(!fResult) { LOG_WIN32_ERROR; return FALSE; }
hashlength=32;
if(!CryptGetHashParam(hHash,HP_HASHVAL,hash,&hashlength,0))
{ LOG_WIN32_ERROR; return FALSE; }
CryptDestroyHash(hHash);
CryptReleaseContext(hProv,0);
return TRUE;
}
int RunCSP34112012Test512(BYTE *pbData, int cbData, BYTE *hash)
{
HCRYPTPROV hProv;
HCRYPTHASH hHash;
BOOL fResult;
int hashlength;
if (!CryptAcquireContext(&hProv, NULL, NULL , PROV_GOST_2001_DH, CRYPT_VERIFYCONTEXT))
{
printf("Failed to acquire apropriate context.\n");
{ LOG_WIN32_ERROR; return FALSE; }
}
if(!CryptCreateHash(hProv, CALG_GR3411_2012_512 , 0, 0, &hHash))
{ LOG_WIN32_ERROR; return FALSE; }
fResult= CryptHashData(hHash,pbData,cbData,0);
if(!fResult) { LOG_WIN32_ERROR; return FALSE; }
hashlength=64;
if(!CryptGetHashParam(hHash,HP_HASHVAL,hash,&hashlength,0))
{ LOG_WIN32_ERROR; return FALSE; }
CryptDestroyHash(hHash);
CryptReleaseContext(hProv,0);
return TRUE;
}
Генерирует блоки данных data_*.bin, и хеши к ним: data_*_csp_hash_256.bin и data_*_csp_hash_512.bin На linux-е считаю хеши блоков. Всё сходится, кроме размеров кратных 64. хеш из примера, длина 64: 256 бит
Код:
00000000 34 ca 01 7c d5 1e 99 c8 80 8c f1 2a 01 ee 4d 57 |4..|.......*..MW|
00000010 20 32 c8 db fa 4b f1 80 af 9d fe e2 d6 91 a2 93 | 2...K..........|
512 бит
Код:
00000000 13 86 aa f5 e8 c6 9c af f9 e6 80 a4 47 ba 5f a6 |............G._.|
00000010 f2 a5 bf da c1 18 a6 79 19 38 61 8c 2d 0d 5e d6 |.......y.8a.-.^.|
00000020 97 3b 99 4c 53 6a 54 95 3d 2c 76 7f d1 94 6b ca |.;.LSjT.=,v...k.|
00000030 07 a8 b6 f6 36 54 c4 58 db 56 64 08 b6 f4 71 99 |....6T.X.Vd...q.|
Реализация стрибога: 256 бит
Код:
5611b41211d1e8b86d0983662cd4ba40d1bcb8155f277c3f9a8615c5824a5d4c
512 бит
Код:
c986cdf888070824066cad58909bb8ebe7bd1548a0408f2361e6b7b7ba0d6204050bdf1608586e3b4630108a4e34aad6c77c70da02e046fefa1cd489d53b8901
Остальные размеры сходятся, кроме 128, 192, 256...
|