Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GOST HASH выдает разные результаты при хешировании, Какой метод правильный? 
:(
    Опции темы
ekianu
Дата 7.8.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 7.11.2006

Репутация: нет
Всего: нет



Привет.
Написал 2 функции хеширования (ГОСТ) файлов.

Код

const
 ALGOSIZE=8;
 ULSIZE = sizeof(Cardinal);
 ALGOBYTESIZE = ALGOSIZE*ULSIZE;
 MAXBYTE = $FF;
type
  TUL8Array = array[0..ALGOSIZE-1] of Cardinal;

function gosthash_file(filename: String): TUL8Array;
var
    FileHandle: THandle;
    MapHandle: THandle;
    ViewPointer: pointer;
  ctx:TGostHashCtx;
begin
  gosthash_reset(ctx);
  gosthash_init;
    FileHandle := CreateFile(pChar(filename),
    GENERIC_READ,
    FILE_SHARE_READ or FILE_SHARE_WRITE,
        nil,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN,
    0);
    if FileHandle <> INVALID_HANDLE_VALUE then
    try
      MapHandle := CreateFileMapping(FileHandle, nil, PAGE_READONLY, 0, 0, nil);
      if MapHandle <> 0 then
        try
          ViewPointer := MapViewOfFile(MapHandle, FILE_MAP_READ, 0, 0, 0);
          if ViewPointer <> nil then try
            gosthash_update(ctx, ViewPointer, GetFileSize(FileHandle, nil));
          finally
            UnmapViewOfFile(ViewPointer);
          end;
        finally
          CloseHandle(MapHandle);
        end;
    finally
      CloseHandle(FileHandle);
    end;
  Result := gosthash_final(ctx);
end;

function gosthash_file2(filename: String): TUL8Array;
const
  buf_size = 4096;
var
    FileHandle: THandle;
  ctx: TGostHashCtx;
  bytesRead: Cardinal;
  buf: array[0..buf_size-1] of Char;
begin
  ZeroMemory(@Result, sizeof(TUL8Array));
    FileHandle := CreateFile(pChar(filename),
    GENERIC_READ,
    FILE_SHARE_READ or FILE_SHARE_WRITE,
        nil,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN,
    0);
    if FileHandle <> INVALID_HANDLE_VALUE then
  begin
    gosthash_reset(ctx);
    gosthash_init;
    try
      repeat
        if ReadFile(FileHandle, buf, buf_size, bytesRead, nil) then
          gosthash_update(ctx, buf, bytesRead);
      until buf_size<>bytesRead;
    finally
      CloseHandle(FileHandle);
    end;
    Result := gosthash_final(ctx);
  end;
end;

gost_update из стандартной библиотеки ГОСТ. Обе функции в маленьких файлах выдает одинаковый результат. а в файлах больше 100 МБ выдает разные результаты. Так как файлы большие не могу проверить их online. Какой метод правильный?
PM MAIL Skype   Вверх
CodeMonkey
Дата 7.8.2009, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(ekianu @  7.8.2009,  15:26 Найти цитируемый пост)
Какой метод правильный? 

Недостаточно информации, сказать невозможно.

Лично мне удивительно, что у вас хоть как-то работает (на маленьких файлах).

Потому что в одном случае вы передаёте указатель на данные:

Код
    gosthash_update(ctx, ViewPointer, GetFileSize(FileHandle, nil));


А во втором - сами данные непосредственно:

Код
    gosthash_update(ctx, buf, bytesRead);


По-хорошему, должно быть или:

Код
    gosthash_update(ctx, ViewPointer, GetFileSize(FileHandle, nil));
...
    gosthash_update(ctx, @buf, bytesRead);


или:

Код
    gosthash_update(ctx, ViewPointer^, GetFileSize(FileHandle, nil));
...
    gosthash_update(ctx, buf, bytesRead);



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0412 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.