SHA1 hashing in Delphi XE

前端 未结 4 598
醉梦人生
醉梦人生 2020-12-09 06:24

I\'m in the process of implementing XML digital signatures. I\'m starting with little steps, so right now I want to solve the problem of SHA-1 hashing.

There are lot

4条回答
  •  天命终不由人
    2020-12-09 07:05

    Leonardo, i think which your problem is the UNICODE when you uses a function to hash a string you are passing a array (buffer) of bytes. so when you pass the abc string in Delphi XE, your are hashing a buffer like this 61 00 62 00 63 00 (Hex representation)

    check this sample application which uses the Windows crypto functions from the Jwscl library (JEDI Windows Security Code Lib)

    program Jwscl_TestHash;
    
    {$APPTYPE CONSOLE}
    
    uses
      JwsclTypes,
      JwsclCryptProvider,
      Classes,
      SysUtils;
    
    function GetHashString(Algorithm: TJwHashAlgorithm; Buffer : Pointer;Size:Integer) : AnsiString;
    var
      Hash: TJwHash;
      HashSize: Cardinal;
      HashData: Pointer;
      i       : Integer;
    begin
      Hash := TJwHash.Create(Algorithm);
      try
        Hash.HashData(Buffer,Size);
        HashData := Hash.RetrieveHash(HashSize);
        try
            SetLength(Result,HashSize*2);
            BinToHex(PAnsiChar(HashData),PAnsiChar(Result),HashSize);
        finally
          TJwHash.FreeBuffer(HashData);
        end;
      finally
        Hash.Free;
      end;
    end;
    
    
    function GetHashSHA(FBuffer : AnsiString): AnsiString;
    begin
       Result:=GetHashString(haSHA,@FBuffer[1],Length(FBuffer));
    end;
    
    function GetHashSHA_Unicode(FBuffer : String): String;
    begin
       Result:=GetHashString(haSHA,@FBuffer[1],Length(FBuffer)*SizeOf(Char));
    end;
    
    begin
     try
         Writeln(GetHashSHA('abc'));
         Writeln(GetHashSHA('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'));
         Writeln(GetHashSHA_Unicode('abc'));
         Writeln(GetHashSHA_Unicode('abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'));
         Readln;
     except
        on E:Exception do
        begin
            Writeln(E.Classname, ':', E.Message);
            Readln;
        end;
     end;
    
    end.
    

    this return

    abc AnsiString

    A9993E364706816ABA3E25717850C26C9CD0D89D

    abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq AnsiString

    84983E441C3BD26EBAAE4AA1F95129E5E54670F1 for

    abc unicode

    9F04F41A848514162050E3D68C1A7ABB441DC2B5

    abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq Unicode

    51D7D8769AC72C409C5B0E3F69C60ADC9A039014

提交回复
热议问题