2013-10-01 4 views
6

मैं .net समारोह से उद्देश्य है, जिसमें SHA512 स्ट्रिंग बनाने के लिए समारोह लिखने के लिए कोशिश कर रहा हूँ.net बनाम उद्देश्य सी SHA-512 बेमेल

public static string GetSHA512(string strPlain) 
{ 
    UnicodeEncoding UE = new UnicodeEncoding(); 
    byte[] HashValue = null; 
    byte[] MessageBytes = UE.GetBytes(strPlain); 
    System.Security.Cryptography.SHA512Managed SHhash = new System.Security.Cryptography.SHA512Managed(); 
    string strHex = string.Empty; 

    HashValue = SHhash.ComputeHash(MessageBytes); 
    foreach (byte b in HashValue) 
    { 
     strHex += String.Format("{0:x2}", b); 
    } 
    return strHex; 
} 

इस रूप में

input : pass123 
output: 2a6353744cc2914c602265f50d2e413d0561368775756392517abb340ef75d52ee0c5d3623ddd1826fd768a13dca8961f5957c75df0d793b9d7537aabe050705 

परिणाम देता है क्या मैं की कोशिश की है का पालन के रूप में है

-(NSString *)createSHA512:(NSString *)string 
{ 
    const char *cstr = [string cStringUsingEncoding:NSUTF8StringEncoding]; 
    NSData *data = [NSData dataWithBytes:cstr length:string.length]; 
    uint8_t digest[CC_SHA512_DIGEST_LENGTH]; 
    CC_SHA512(data.bytes, data.length, digest); 
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH]; 

    for(int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++) 
     [output appendFormat:@"%02x", digest[i]]; 
    return output; 
} 

जो

नीचे परिणाम देता है
input : pass123 
output: fd37ca5ca8763ae077a5e9740212319591603c42a08a60dcc91d12e7e457b024f6bdfdc10cdc1383e1602ff2092b4bc1bb8cac9306a9965eb352435f5dfe8bb0 

क्या कोई सुझाव दे सकता है कि मैं क्या गलत कर रहा हूं?

इन दो मानों में भिन्न क्यों है?

कृपया मेरी गलतियों को सही करें।

संपादित

मतलब जब मैं NSUTF16StringEncoding और NSUnicodeStringEncoding जो अभी भी अलग परिणाम के लिए एन्कोडिंग को बदलने की कोशिश की है और के रूप में

input : pass123 
output: 514331e3f7ca0a295539347ebccc4e4f095fe5f3c1df10d43b4d550144c7b30ba9507831893ea63ea22e62e993be529b0d14be7800a90aa0de199d6be62a5f1b 

उत्तर

4

परीक्षण और समारोह में त्रुटि के लिटिल बिट और समस्या को हल करने compitable version of encoding found here सहायता की खोज मुझे:

मैं के रूप में अपने नेट विधि को फिर से लिखने चाहते हैं।

कॉन्स्ट चार में फ़ंक्शन रूपांतरण में आवश्यक नहीं है इसलिए डिफ़ॉल्ट विधि का उपयोग करके डेटा को स्ट्रिंग में हटा दिया गया है और सीधे परिवर्तित किया गया है।

-(NSString *)createSHA512:(NSString *)string { 
    NSData *data = [string dataUsingEncoding:NSUTF16LittleEndianStringEncoding]; 
    uint8_t digest[CC_SHA512_DIGEST_LENGTH]; 
    CC_SHA512(data.bytes, data.length, digest); 
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH]; 

    for(int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++) 
     [output appendFormat:@"%02x", digest[i]]; 
    return output; 
} 
5

उद्देश्य सी संस्करण में इस प्रकार आप उपयोग कर बाइनरी में पाठ परिवर्तित कर रहे हैं UTF-8। .NET संस्करण में आप यूटीएफ -16 का उपयोग कर रहे हैं। यह केवल अंतर नहीं हो सकता है, लेकिन यह निश्चित रूप से एक प्रासंगिक है।

public static string GetSHA512(string text) 
{ 
    byte[] messageBytes = Encoding.UTF8.GetBytes(text); 

    byte[] hash; 
    using (SHA512 hashAlgorithm = SHA512.Create()) 
    { 
     hash = hashAlgorithm.ComputeHash(messageBytes); 
    } 

    StringBuilder builder = new StringBuilder(); 
    foreach (byte b in hash) 
    { 
     builder.AppendFormat("{0:x2}", b); 
    }   
    return builder.ToString(); 
} 
+0

अपने त्वरित प्रतिक्रिया के लिए धन्यवाद, लेकिन हम एक मंच है जहाँ हम .net समारोह को बदल नहीं सकते और उद्देश्य सी में compitable समारोह लिखने की ज़रूरत में हैं। –

+0

@ जनकनिर्मल तो बस करें: 'कॉन्स्ट char * cstr = [स्ट्रिंग cStringUsingEncoding: NSUTF16StringEncoding]; ' – NSAddict

+0

@ जनक निर्मल: यह कहने के लायक होगा कि शुरुआत करने के लिए। उस स्थिति में आपको 'NSUTF16StringEncoding' का उपयोग करने के लिए अपना उद्देश्य सी कोड बदलने की आवश्यकता है। –

0

base64encoded स्ट्रिंग के लिए:

-(NSString *)createSHA512Net:(NSString *)string { 
    NSData *data = [string dataUsingEncoding:NSUTF16LittleEndianStringEncoding]; 
    uint8_t digest[CC_SHA512_DIGEST_LENGTH]; 
    CC_SHA512(data.bytes, data.length, digest); 
    NSData *out = [NSData dataWithBytes:digest length:CC_SHA512_DIGEST_LENGTH]; 
    NSString *str = [out base64EncodedStringWithOptions:kNilOptions]; 
    return str; 
} 
संबंधित मुद्दे