Я перерыл сеть, пытаясь найти пример функции, как хешировать текст с помощью Sha1 и DCPcrypt.

У меня есть пример ниже. Кажется, всплывает все время. Но он каждый раз возвращает китайские иероглифы. Помогите, пожалуйста, исправить функцию.

function TForm1.EncryptThis(aString : string) : string;
var
   Cipher: TDCP_cast256;
   KeyStr: string;
begin
   KeyStr:= '';
   Cipher:= TDCP_cast256.Create(Self);
   Cipher.InitStr(KeyStr,TDCP_sha1);
   result := Cipher.EncryptString(aString);
   Cipher.Burn;
   Cipher.Free;
end;

ОБНОВЛЕНИЕ: Используя приведенные ниже ссылки и информацию, я создал эти функции. Но, как я уже сказал, это не имеет большого смысла для меня. Так что извините за невежество.

Однако код не работает. Его вывод: 3F3F3F3F3F3F3F3F3F3F00000000000000000000, тогда как он должен быть 40bd001563085fc35165329ea1ff5c5ecbdbbeef, так как я сказал программе иметь 123.

Пожалуйста помоги.

function CalcDigest(text: string): string;
var
  x: TDCP_hash;
begin
  x := TDCP_sha1.Create(nil);
  try
    x.Init;
    x.UpdateStr(text);
    SetLength(Result, x.GetHashSize div 8);
    x.Final(Result[1]);
  finally
    x.Free;
  end;
end;

function String2Hex(const Buffer: Ansistring): string;
begin
  SetLength(result, 2*Length(Buffer));
  BinToHex(@Buffer[1], PWideChar(@result[1]), Length(Buffer));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  memo2.Lines.Add(String2Hex(CalcDigest(memo1.Lines.Strings[0])));
end;
0
Marcel 17 Мар 2015 в 21:15
Не путайте хеширование (SHA1) с шифрованием (CAST).
 – 
Artjom B.
17 Мар 2015 в 21:18
Я вижу @ArtjomB. а у вас тогда есть пример как хешировать?
 – 
Marcel
17 Мар 2015 в 21:32
Вместо того, чтобы просить код, я думаю, вам будет лучше попытаться лучше понять, что делают эти алгоритмы. На данный момент вы запутались в их вводе и выводе. Хэши работают с двоичными данными и выводят двоичные данные. Ты меня понимаешь, когда я это говорю?
 – 
David Heffernan
18 Мар 2015 в 09:38
Да я понимаю. Я этого не знал, но благодаря этому процессу стало ясно... Но мне все еще нужно выяснить, как я могу заставить его работать как можно скорее.
 – 
Marcel
18 Мар 2015 в 11:40
Следующий шаг — решить, как кодировать входной текст как двоичный. ASCII, UTF-8, UTF-16?
 – 
David Heffernan
18 Мар 2015 в 11:44

2 ответа

Судя по этому, сделать это можно так:

function CalcDigest(text: string): string;
var
  x: TDCP_hash;
begin
  x := TDCP_sha1.Create(nil);
  try
    x.Init;
    x.UpdateStr(text);
    SetLength(Result, x.GetHashSize div 8);
    x.Final(Result[1]);
  finally
    x.Free;
  end;
end;

Вы можете закодировать хэш перед печатью, потому что вывод двоичный. См., например, этот вопрос.

1
Community 23 Май 2017 в 15:12
Это результат, который я получаю при попытке использовать этот код на 123 먋䙖쉮瘥歾싑䄿
 – 
Marcel
17 Мар 2015 в 21:54
1
Выход хэш-функции является двоичным. Вам нужно будет закодировать его как шестнадцатеричный или base64, если вы хотите, чтобы он печатался.
 – 
Artjom B.
17 Мар 2015 в 21:57
Я не уверен, как лучше всего объяснить, что я хочу. Но в основном перейдите по этой ссылке и хешируйте 123, я хочу иметь возможность хешировать в delphi и показывать тот же результат в поле заметки... sha1-online.com... По сути, 2 должны совпадать.
 – 
Marcel
17 Мар 2015 в 21:59
Да, эта страница использует шестнадцатеричное кодирование: stackoverflow.com/questions/3308049/…
 – 
Artjom B.
17 Мар 2015 в 22:00
Можете ли вы быть более конкретным, пожалуйста. Я не вижу этого в этом коде... Пожалуйста, имейте в виду, что я никогда раньше не работал с хэш-кодами, поэтому это слишком много, чтобы принять все сразу...
 – 
Marcel
17 Мар 2015 в 22:02

Я не очень хорошо знаком с DCPCrypt. Вы также можете использовать другие библиотеки.

1) Indy - обычно входит в Delphi

function SHA1Text(const s: string): string;
begin
  with TIdHashSHA1.Create do
    try
      Result:=LowerCase(HashStringAsHex(s));
    finally
      Free;
    end;
end;

2) Библиотеки Вольфганга Эрхардта (самые быстрые, насколько я знаю) от http://www.wolfgang-ehrhardt.de/crchash_en.html

function SHA1Text(const s: string): string;
var
  Context: THashContext;
  SHA1Digest: TSHA1Digest;
begin
  SHA1Init(Context);
  SHA1Update(Context, pChar(s), length(s));
  SHA1Final(Context, SHA1Digest);

  Result:=HexStr(@SHA1Digest, SizeOf(SHA1Digest));
end;

ПРИМЕЧАНИЕ: это из Delphi 7. Вам нужно будет обновить его, если вы используете Unicode Delphi.

1
smooty86 18 Мар 2015 в 10:26
Мне нравится идея Indy, у меня есть delphi xe5, в него включен indy, но я не уверен, какой модуль мне нужно включить?
 – 
Marcel
18 Мар 2015 в 10:48
Этих единиц должно быть достаточно: IdHash, IdHashSHA1
 – 
smooty86
18 Мар 2015 в 15:24