Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|