Перейти к содержанию
Fire Monkey от А до Я
  • 0

Проблема в реализации PBKDF2-SHA1 средствами INDY(TIdHMACSHA1)


Morfi

Вопрос

Здравствуйте!

Пытаюсь реализовать алгоритм PBKDF2-SHA1. Для вычисления HMAC-SHA1 использую класс TidHMACSHA1.

Код PBKDF2-SHA1 нашел на просторах интернета и немного подкорректировал для использования с INDY (TidHMACSHA1):

function PBKDF2Sha1(pass, salt: string; count, kLen: Integer): string;

  function IntX(i: Integer): string; inline;
  begin
    Result := Char(i shr 24) + Char(i shr 16) + Char(i shr 8) + Char(i);
  end;

var
  D, I, J: Integer;
  T, F, U, wPass: TIdBytes;
begin
  wPass := ToBytes(pass);
  D := Ceil(kLen / (160 div 8));
  for i := 1 to D do
  begin
    F := EncryptHMACSha1(ToBytes(salt + IntX(i)), wPass);
    U := F;
    for j := 2 to count do
    begin
      U := EncryptHMACSha1(U, wPass); //<-- Проблема
      F := XorBlock(F, U);
    end;
    T := T + F;
  end;
  Result := ToHex(Copy(T, 1, kLen));
end;

Для вычисления HMAC-SHA1 используется функция EncryptHMACSha1:

function EncryptHMACSha1(Input, AKey: TIdBytes): TIdBytes;
var
  HMachSha1: TIdHMACSHA1;
begin
  HMachSha1 := TIdHMACSHA1.Create;
   try
     HMachSha1.Key := AKey;
     Result := HMachSha1.HashValue(Input);
   finally
     HMachSha1.Free;
   end;
end;

Возникает проблема, когда эта функция используется 6-й раз в функции PBKDF2Sha1:

for i := 1 to D do // D := 2
  begin
    F := EncryptHMACSha1(ToBytes(salt + IntX(i)), wPass); // Использование функции (разы): 1-й, 4-й
    U := F;
    for j := 2 to count do // count := 3
    begin
      U := EncryptHMACSha1(U, wPass); // <--Проблема! Использование функции (разы): 2-й, 3-й, 5-й, !6-й!
      F := XorBlock(F, U);
    end;
    T := T + F;
  end;

Возникает исключение в глубинах INDY-кода:

error.jpg

а точнее в функции TIdHashSHA1.NativeGetHashBytes (файл: idHashSHA,pas) на строке с кодом:

SetLength(Result, SizeOf(UInt32)*5); // в файле строка под номером 460

Помогите решить данную проблему.

 

Версии:

Delphi: 10.1
INDY: 10.6.2.5341

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Попробуйте  THashSHA1.GetHMACAsBytes из System.Hash.pas 

Вообще мне больше нравятся System.Net компоненты вместо Indy.

 

 

Ну и вдогонку 

function OAuthEncryptHMACSha1(const aValue, aKey: string): string;
begin
  Result :=  TNetEncoding.Base64.EncodeBytesToString( THashSHA1.GetHMACAsBytes(aValue, aKey) );
end;

 

Изменено пользователем ENRGY
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...