2012-02-24 14 views
7

मैं sha512 द्वारा एन्कोड किए गए दो अलग-अलग स्ट्रिंग की तुलना करने की कोशिश कर रहा हूं। लेकिन, परिणाम अलग है। यह मेरा मतलब है एक एनकोड समस्या हो सकती है। मुझे आशा है आप मेरी मदद कर सकते हैं।स्ट्रिंग SHA-512 एन्कोडिंग: सी # और जावा परिणाम अलग है

यह मेरा जावा कोड है:

MessageDigest digest = java.security.MessageDigest.getInstance("SHA-512"); 
    digest.update(MyString.getBytes()); 
    byte messageDigest[] = digest.digest(); 

    // Create Hex String 
    StringBuffer hexString = new StringBuffer(); 
    for (int i = 0; i < messageDigest.length; i++) { 
     String h = Integer.toHexString(0xFF & messageDigest[i]); 
     while (h.length() < 2) 
      h = "0" + h; 
     hexString.append(h); 
    } 
    return hexString.toString(); 

और, यह मेरी सी # कोड है:

 UnicodeEncoding UE = new UnicodeEncoding(); 
     byte[] hashValue; 
     byte[] message = UE.GetBytes(MyString); 

     SHA512Managed hashString = new SHA512Managed(); 
     string hex = ""; 

     hashValue = hashString.ComputeHash(message); 
     foreach (byte x in hashValue) 
     { 
      hex += String.Format("{0:x2}", x); 

     } 
     return hex; 

समस्या कहां है? Thx ज्यादा लोग

अद्यतन

मैं एन्कोडिंग प्रकार निर्दिष्ट नहीं करते हैं, यह यूनिकोड मुझे लगता है कि supposes। अगर मैं जावा में UTF-16 के निर्दिष्ट करते हैं,

Java SHA: a99951079450e0bf3cf790872336b3269da580b62143af9cfa27aef42c44ea09faa83e1fbddfd1135e364ae62eb373c53ee4e89c69b54a7d4d268cc2274493a8 

C# SHA: 70e6eb559cbb062b0c865c345b5f6dbd7ae9c2d39169571b6908d7df04642544c0c4e6e896e6c750f9f135ad05280ed92b9ba349de12526a28e7642721a446aa 

बजाय: परिणाम (कुछ भी निर्दिष्ट किए बिना) यह है

Java UTF-16: SHA f7a587d55916763551e9fcaafd24d0995066371c41499fcb04614325cd9d829d1246c89af44b98034b88436c8acbd82cd13ebb366d4ab81b4942b720f02b0d9b 

यह हमेशा अलग है !!!

+0

क्या होता है जब आप 'MyString.getBytes()' में एन्कोडिंग निर्दिष्ट करते हैं? (खराब परिवर्तनीय नाम, बीटीडब्ल्यू।) –

+1

क्या आपने हैश कंप्यूटिंग से पहले 'मायस्ट्रिंग' के बाइटों की तुलना की है? –

+0

हमें पूर्ण कोड नमूने और आपके इनपुट/आउटपुट भी प्रदान करना अच्छा लगेगा। – birryree

उत्तर

6

UnicodeEncoding in C# आप, थोड़ा-endian UTF-16 एन्कोडिंग से मेल खाती है का उपयोग करते हुए "UTF-16" जावा में बड़े endian UTF-16 एन्कोडिंग से मेल खाती है। एक और अंतर यह है कि सी # बाइट ऑर्डर मार्कर (जिसे एपीआई में "प्रीम्बल" कहा जाता है) आउटपुट नहीं करता है, यदि आप इसके लिए नहीं पूछते हैं, जबकि जावा में "यूटीएफ -16" हमेशा इसे उत्पन्न करता है। दो कार्यक्रमों संगत बनाने के लिए आप कर सकते हैं जावा भी थोड़ा-endian UTF-16 का उपयोग करें:

digest.update(MyString.getBytes("UTF-16LE")); 

या आप UTF-8 की तरह, कुछ अन्य अच्छी तरह से ज्ञात एन्कोडिंग करने के लिए स्विच कर सकते हैं।

+0

आप सही हैं! Thx, यह काम करता है :) – kinghomer

3

कारण यह है कि आपने स्ट्रिंग को बाइट्स में कनवर्ट करते समय उपयोग करने के लिए एन्कोडिंग निर्दिष्ट नहीं किया है, जावा प्लेटफॉर्म डिफ़ॉल्ट एन्कोडिंग का उपयोग करता है, जबकि UnicodeEncoding utf-16 का उपयोग करता प्रतीत होता है।

संपादित करें:

documentation for UnicodeEncoding

यह निर्माता, एक उदाहरण थोड़ा endian बाइट क्रम का उपयोग करता है बनाता है एक यूनिकोड बाइट क्रम चिह्न प्रदान करता है, और एक फेंक नहीं है कहते हैं अपवाद जब एक अवैध एन्कोडिंग का पता चला है।

Javas "utf-16" हालांकि बड़ा endian बाइट क्रम के लिए डिफ़ॉल्ट लगता है। चरित्र एन्कोडिंग के साथ यह वास्तव में विशिष्ट होने के लिए बेहतर है, UnicodeEncoding constructor taking two boolean निर्दिष्ट बाइट ऑर्डर है, जबकि जावा में "utf-16le" और "utf-16be" भी है। आप

myyString.getBytes("utf-16be") 

या और भी बेहतर उपयोग करें #

new UnicodeEncoding(true, false) // big endian, no byte order mark 

और जावा में ग में निम्न को आज़मा सकते "utf-8" दोनों ही मामलों में/Encoding.UTF8 के बाद से यह है अलग byteorders से प्रभावित नहीं ।

+0

नहीं। अलग-अलग परिणाम होते हैं हालांकि – kinghomer

6

यहाँ,

digest.update(MyString.getBytes()); 

आप स्पष्ट रूप से String#getBytes() विधि में वांछित वर्ण एन्कोडिंग को निर्दिष्ट किया जाना चाहिए। यह अन्यथा प्लेटफ़ॉर्म डिफ़ॉल्ट वर्णमाला के लिए डिफ़ॉल्ट होगा जैसा कि Charset#defaultCharset() द्वारा प्राप्त किया गया है।

इसे ठीक करें तदनुसार:

digest.update(MyString.getBytes("UTF-16LE")); 

यह कम से कम UnicodeEncoding रूप में एक ही चारसेट आंतरिक रूप से उपयोग कर रहा है होना चाहिए।


असंबंधित ठोस समस्या को, जावा भी एक बेहतर for पाश और एक String#format() है।

+0

वही परिणाम। वे भिन्न हैं। मैंने पोस्ट – kinghomer

+0

'यूनिकोड एन्कोडिंग' अपडेट किया है जाहिर है यूटीएफ -16LE का उपयोग कर रहा है। मैंने जवाब अपडेट कर लिया है। – BalusC

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