2016-03-03 10 views
11

मैं हैश स्ट्रिंग्स के लिए डीसीपीक्रिप्ट और SHA512 का उपयोग कर रहा हूं।डीसीपीक्रिप्ट हैशिंग जर्मन उमलॉट्स

मैं वॉरेन पोस्ट्मा द्वारा संस्करण का उपयोग कर रहा https://bitbucket.org/wpostma/dcpcrypt2010

यह ठीक काम कर रहा है। हालांकि यह जर्मन उमोट्स जैसे ä, ö, ü और शायद अन्य यूनिकोड्स में विफल रहता है।

मैं इस तरह पुस्तकालय का उपयोग कर रहा:

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; 

जब मैं इनपुट पत्र ä मैं उम्मीद उत्पादन होने के लिए:

64868C5784A6004E675BCF405F549369BF607CD3269C0CAC1711E21BA9F40A5ABBF0C7535856E7CF77EA55A072DD04AA89EEA361E95F497AA965309B50587157

मैं उन के साथ यह जाँच साइट्स: http://hashgenerator.de/ http://passwordsgenerator.net/sha512-hash-generator/

हालांकि मैं मिलता है:

1A7F725BD18E062020A646D4639F264891368863160A74DF2BFC069C4DADE04E6FA854A2474166EED0914B922A9D8BE0C89858D437DDD7FBCA5C9C89FC07323A

तो मेरे सवाल है: मैं DCPcrypt पुस्तकालय का उपयोग कैसे जर्मन उमलॉट के लिए हैश उत्पन्न करने के लिए कर सकते हैं? धन्यवाद

उत्तर

18

यह एकमात्र आम गलती होनी चाहिए जो लोग हैशिंग और एन्क्रिप्शन के साथ करते हैं। ये अल्गोस बाइनरी डेटा पर काम करते हैं, लेकिन आप टेक्स्ट पास कर रहे हैं। उस पाठ को बाइनरी के रूप में उस पाठ को एन्कोड करने के लिए कहीं कुछ मिला है। और क्या एन्कोडिंग का उपयोग किया जाना चाहिए। आप कैसे जानते हैं कि आपकी लाइब्रेरी ऑनलाइन उपकरण के समान उपयोग करती है? आप नहीं करते

तो, यहां आपके लिए अनुसरण करने का नियम है। कभी हैश पाठ नहीं। बस यह मत करो। एक अच्छी तरह से परिभाषित, स्पष्ट रूप से चुने गए एन्कोडिंग का उपयोग कर पाठ को बाइनरी के रूप में एन्कोड करें। और हैश कि। मेरा सुझाव है कि आप यूटीएफ -8 और हैश के रूप में एन्कोड करें। तो, TEncoding.UTF8.GetBytes(...) यहां आपका मित्र है।

अब, वास्तविक विस्तार पर यहाँ देख, आप इस विधि बुला रहे हैं:

procedure UpdateStr(const Str: RawByteString); 

RawByteString पैरामीटर, मतलब है कि आपके यूनिकोड पाठ डिफ़ॉल्ट सिस्टम कोड पृष्ठ के साथ एक एएनएसआई स्ट्रिंग में बदला जा रहा है। मुझे यकीन है कि ऐसा नहीं है कि आप क्या करना चाहते हैं। दरअसल संकलक इस कहते हैं:

[dcc32 चेतावनी] W1058 अंतर्निहित स्ट्रिंग के लिए 'स्ट्रिंग' से संभावित डेटा हानि के साथ डाली 'RawByteString'

तो संकलक आपको बता रहा है कि आप कुछ गलत कर रहे हैं । आपको वास्तव में संकलक संदेशों की अच्छी ध्यान रखना चाहिए।

अब, आप UpdateStr के बजाय UpdateUnicodeStr पर कॉल कर सकते हैं। लेकिन फिर, आप कैसे जानते हैं कि एन्कोडिंग का उपयोग किस प्रकार किया जाता है? यह देशी आंतरिक एन्कोडिंग, यूटीएफ -16LE होता है।

लेकिन, चलिए कभी भी एन्कोडिंग टेक्स्ट के मेरे नियम का पालन नहीं करते हैं।

{$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. 

आउटपुट

64868C5784A6004E675BCF405F549369BF607CD3269C0CAC1711E21BA9F40A5ABBF0C7535856E7CF77EA55A072DD04AA89EEA361E95F497AA965309B50587157

ध्यान दें कि मैं कुछ अन्य तरीकों से कोड को सरल बनाया। मैंने स्थानीय स्ट्रिंग वैरिएबल को हटा दिया और Result के साथ सीधे काम किया। मैंने हेक्स रूपांतरण में डाइजेस्ट करने के लिए Classes इकाई से BinToHex का उपयोग किया।

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

if बयान जो की जरूरत नहीं है दूर करने के लिए: मैं भी इस कोड बदल दिया है। यदि कोई निर्माता विफल रहता है, तो एक अपवाद उठाया जाता है।

कृपया मेरे नियम का पालन करें कभी भी हैश टेक्स्ट तक नहीं। यह आपको अच्छी तरह से सेवा करेगा!

+1

धन्यवाद इस महान उत्तर के लिए डेविड। स्पष्टीकरण की सराहना करें और निश्चित रूप से कुछ सीखा! – Tommy

+2

ग्रेट। और सवाल के लिए धन्यवाद। समस्या का एक अच्छा स्पष्ट बयान प्राप्त करना अच्छा लगता है, और अंत में कुछ समय के लिए मुझ पर घबराहट करने का मौका है। मुझे उम्मीद है कि हम इस क्यू एंड ए का उपयोग बाइनरी और टेक्स्टिंग हैशिंग और एन्क्रिप्शन के साथ शब्द फैलाने के लिए कर सकते हैं! –

संबंधित मुद्दे