2016-03-03 9 views
11

Używam DCPcrypt i SHA512 do ciągów mieszających.DCPcrypt Hashing Niemiecki Umlauty

używam wersji Warren Postma https://bitbucket.org/wpostma/dcpcrypt2010

To działa poprawnie. Jednak failes to z niemieckimi umlauty takich jak A, O, U i prawdopodobnie innych Unicode.

używam biblioteki tak:

function TForm1.genhash(str: string): string; 
var 
    Hash : TDCP_sha512; 
    Digest: array[0..63] of byte; 
    i: integer; 
    s: string; 
begin 
    s:= ''; 
    hash := TDCP_sha512.Create(nil); 
    if hash<>nil then 
    begin 
    try 
     Hash.Init; 
     Hash.UpdateStr(str); 
     Hash.Final(Digest); 

     for i:= 0 to length(Digest)-1 do 
     s:= s + IntToHex(Digest[i],2); 

    finally 
     hash.free; 
    end; 

    end; 
    Result := s; 
end; 

Kiedy wejście list ä Spodziewam się, że wyjście będzie:

64868C5784A6004E675BCF405F549369BF607CD3269C0CAC1711E21BA9F40A5ABBF0C7535856E7CF77EA55A072DD04AA89EEA361E95F497AA965309B50587157

Sprawdziłem go z tymi, strony: http://hashgenerator.de/ http://passwordsgenerator.net/sha512-hash-generator/

jednak uzyskać:

1A7F725BD18E062020A646D4639F264891368863160A74DF2BFC069C4DADE04E6FA854A2474166EED0914B922A9D8BE0C89858D437DDD7FBCA5C9C89FC07323A

Więc moje pytanie brzmi: Jak mogę korzystać z biblioteki DCPcrypt wygenerować mieszań dla niemieckich umlauty? THanks

Odpowiedz

18

To musi być jednolity Najczęstszym błędem, że ludzie robią z mieszaja i szyfrowania. Te algos działają na danych binarnych, ale przekazujesz tekst. Coś gdzieś musi zakodować ten tekst jako plik binarny. A jakie kodowanie powinno być używane. Skąd wiesz, że twoja biblioteka używa tego samego co narzędzie online? Ty nie.

Oto zasada, którą należy przestrzegać. Nigdy nie mieszaj tekstu. Po prostu tego nie rób. Zakoduj tekst jako plik binarny za pomocą dobrze zdefiniowanego, jawnie wybranego kodowania. I mieszaj to. Sugeruję, abyś zakodował jako UTF-8 i zaszyfrował to. Tak więc, TEncoding.UTF8.GetBytes(...) jest twoim przyjacielem tutaj.

Teraz, patrząc na rzeczywiste szczegółowo tutaj, jesteś wywołanie tej metody:

procedure UpdateStr(const Str: RawByteString); 

Parametr RawByteString oznacza że Twój tekst Unicode jest konwertowana na ciąg znaków ANSI, z domyślnej strony kodowej systemu. Jestem pewien, że nie to, co masz zamiar się zdarzyć. Rzeczywiście kompilator mówi tak:

[dcc32 Warning] W1058 niejawny oddanych ciąg z potencjalną utratą danych z „string” do „RawByteString”

więc kompilator mówi ci, że robisz coś złego . Naprawdę musisz wziąć pod uwagę komunikaty kompilatora.

Teraz można nazwać UpdateUnicodeStr zamiast UpdateStr. Ale znowu, skąd wiesz, jakie kodowanie jest używane? Zdarza się, że jest to natywne kodowanie wewnętrzne, UTF-16LE.

Ale niech śledzić moje reguły nigdy kodowania tekstu.

{$APPTYPE CONSOLE} 

uses 
    SysUtils, Classes, DCPsha512; 

function genhash(str: string): string; 
var 
    Bytes: TBytes; 
    Hash: TDCP_sha512; 
    Digest: array[0..63] of byte; 
begin 
    Bytes := TEncoding.UTF8.GetBytes(str); // encode text as UTF-8 bytes 

    hash := TDCP_sha512.Create(nil); 
    try 
    Hash.Init; 
    Hash.Update(Pointer(Bytes)^, Length(Bytes)); 
    Hash.Final(Digest); 
    finally 
    hash.Free; 
    end; 

    // convert the digest to a hex hash string 
    SetLength(Result, Length(Digest)*2); 
    BinToHex(Digest, PChar(Result), Length(Digest)); 
end; 

begin 
    Writeln(genhash('ä')); 
    Readln; 
end. 

Wyjście

64868C5784A6004E675BCF405F549369BF607CD3269C0CAC1711E21BA9F40A5ABBF0C7535856E7CF77EA55A072DD04AA89EEA361E95F497AA965309B50587157

pamiętać, że uproszczony kod w niektórych innych sposobów. Usunąłem lokalną zmienną łańcuchową i pracowałem bezpośrednio z Result. Użyłem BinToHex z jednostki Classes, aby wykonać konwersję do formatu hex. Ja też zmienić ten kod:

hash := TDCP_sha512.Create(nil); 
if hash<>nil then 
    .... 

usunięcia komunikatu if które nie jest potrzebne. Jeśli konstruktor ulegnie awarii, zostanie zgłoszony wyjątek.

Proszę przestrzegać mojej zasady nigdy do tekstu hash. Będzie ci dobrze służył!

+1

Dziękuję Davidowi za tę wspaniałą odpowiedź. Doceń wyjaśnienie i zdecydowanie nauczyłeś się czegoś! – Tommy

+2

Świetnie. I dziękuję za pytanie. Miło jest uzyskać wyraźne stwierdzenie problemu i mieć możliwość, aby nareszcie spisać to, co od pewnego czasu dręczyło mnie. Mam nadzieję, że możemy użyć tego pytania i odpowiedzi, aby rozpowszechniać informacje o binarnym i tekstowym hashu i szyfrowaniu! –

Powiązane problemy