उद्देश्य-सी में एमडी 5 एल्गोरिथ्म


134

ऑब्जेक्टिव-सी में एमडी 5 की गणना कैसे करें?


1
मेरा अनुमान है कि आप एमडी 5 की गणना करने वाली सी दिनचर्या को आसानी से पोर्ट कर सकते हैं। और वे खोजने में आसान हैं।
आर्टिलियस

जवाबों:


219

md5 iPhone पर उपलब्ध है और इसे नीचे NSStringऔर NSDataनीचे की तरह जोड़ दिया जा सकता है ।

MyAdditions.h

@interface NSString (MyAdditions)
- (NSString *)md5;
@end

@interface NSData (MyAdditions)
- (NSString*)md5;
@end

MyAdditions.m

#import "MyAdditions.h"
#import <CommonCrypto/CommonDigest.h> // Need to import for CC_MD5 access

@implementation NSString (MyAdditions)
- (NSString *)md5
{
    const char *cStr = [self UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5( cStr, (int)strlen(cStr), result ); // This is the md5 call
    return [NSString stringWithFormat:
        @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
        result[0], result[1], result[2], result[3], 
        result[4], result[5], result[6], result[7],
        result[8], result[9], result[10], result[11],
        result[12], result[13], result[14], result[15]
        ];  
}
@end

@implementation NSData (MyAdditions)
- (NSString*)md5
{
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5( self.bytes, (int)self.length, result ); // This is the md5 call
    return [NSString stringWithFormat:
        @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
        result[0], result[1], result[2], result[3], 
        result[4], result[5], result[6], result[7],
        result[8], result[9], result[10], result[11],
        result[12], result[13], result[14], result[15]
        ];  
}
@end

संपादित करें

NSData md5 को जोड़ा क्योंकि मुझे इसकी आवश्यकता थी और मुझे लगा कि इस छोटे से स्निपेट को बचाने के लिए यह एक अच्छी जगह है ...

इन तरीकों को http://www.nsrl.nist.gov/testdata/ में NIST MD5 परीक्षण वैक्टर का उपयोग करके सत्यापित किया गया है


क्या यह पूरी फ़ाइल को मेमोरी में खींचता है?
ओपनफ्रॉग

यह फाइलों के बारे में नहीं है। यदि आप इन विधियों वाली फ़ाइल से MD5 बनाना चाहते हैं, तो आप NSData * fileContents = [NSData dataWithContentsOfFile: @ "<yourPath>"] कर सकते हैं; NSString * myHash = [fileContents md5]; और हाँ, यह पूरी फ़ाइल को मेमोरी में खींच लेगा। यदि आपको कोई समाधान मिलता है जो फ़ाइल धाराओं के साथ काम करता है, तो कृपया इसे उत्तर के रूप में पोस्ट करें।
कलस

1
यदि आपको हैश फ़ाइल की आवश्यकता है, तो आपको CC_MD5_Init का उपयोग करना चाहिए, फिर सभी फ़ाइल डेटा के लिए CC_MD5_Update और उसके बाद - CC_MD5_Finish।
निकोलय ऑल्शेव्स्की

7
64 बिट वास्तुकला के लिए संकलन, strlenचेतावनी देने के लिए कॉल : "निहित रूपांतरण पूर्णांक सटीकता खो देता है: 'अहस्ताक्षरित' लंबे समय तक 'CC_LONG' (उर्फ 'अहस्ताक्षरित int')"
MaxGabriel

55

आप ऐसा करने के लिए अंतर्निहित कॉमन क्रिप्टो लाइब्रेरी का उपयोग कर सकते हैं। आयात करना याद रखें:

#import <CommonCrypto/CommonDigest.h>

और फिर:

- (NSString *) md5:(NSString *) input
{
    const char *cStr = [input UTF8String];
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5( cStr, strlen(cStr), digest ); // This is the md5 call

    NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];

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

    return  output;
}

मैंने उपरोक्त कोड लागू किया है, लेकिन यह दुर्घटनाग्रस्त हो रहा है (CC_MD5 (cStr, strlen (cStr), डाइजेस्ट)) को चलाने के दौरान ----> इस लाइन को अपवाद कहकर फेंक रहे हैं EXC_BAD_ACCESS)
नीलेश कुमार

@wimcNilesh selfनिष्पादित करने से पहले जाँच करें ; यदि आत्म शून्य है, तो यह दुर्घटनाग्रस्त हो जाएगा।
ब्रैंडनस्क्रिप्ट 5

4
यह उत्तर दूसरों की तुलना में पढ़ने के लिए बहुत साफ है; एक चीज की जरूरत है, जैसे एक कास्ट से (int)पहले ...strlen(int)strlen
Brandonscript

हे यह अच्छा +1 अपवोट है, और क्या आप कृपया अपने एन्क्रिप्शन के रूप में md5 डिक्रिप्शन विधि भी प्रदान कर सकते हैं।
अयाज

@ अयाज़ एमडी 5 को डिक्रिप्ट नहीं किया जा सकता है (कम से कम बस एक विधि के साथ)।
अल्बानक्स

9

यदि प्रदर्शन महत्वपूर्ण है, तो आप इस अनुकूलित संस्करण का उपयोग कर सकते हैं। यह लोगों के साथ stringWithFormatया की तुलना में लगभग 5 गुना तेज है NSMutableString

यह NSString की एक श्रेणी है।

- (NSString *)md5
{
    const char* cStr = [self UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(cStr, strlen(cStr), result);

    static const char HexEncodeChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    char *resultData = malloc(CC_MD5_DIGEST_LENGTH * 2 + 1);

    for (uint index = 0; index < CC_MD5_DIGEST_LENGTH; index++) {
        resultData[index * 2] = HexEncodeChars[(result[index] >> 4)];
        resultData[index * 2 + 1] = HexEncodeChars[(result[index] % 0x10)];
    }
    resultData[CC_MD5_DIGEST_LENGTH * 2] = 0;

    NSString *resultString = [NSString stringWithCString:resultData encoding:NSASCIIStringEncoding];
    free(resultData);

    return resultString;
}

0

खैर जब से लोगों ने फाइल-स्ट्रीम वर्जन मांगा। मैंने जोएल लोप्स दा सिल्वा द्वारा बनाई गई एक अच्छी छोटी स्निपेट को संशोधित किया है जो MD5, SHA1 और SHA512 के साथ काम करता है और यह धाराओं का उपयोग कर रहा है। इसका iOS के लिए बनाया गया है, लेकिन OSX aswell (ALAssetRepresentation पद्धति को हटा दें) पर केवल न्यूनतम परिवर्तन के साथ काम करता है। यह एक फ़ाइलपथ या ALAssets (ALAssetRepresentation का उपयोग करके) दी गई फ़ाइलों के लिए चेकसम बना सकता है। यह छोटे पैकेजों में डेटा को छोटा कर रहा है, जो फाइल / परिसंपत्ति के आकार की परवाह किए बिना स्मृति प्रभाव को कम करता है।

यह वर्तमान में यहाँ github पर स्थित है: https://github.com/leetal/FileHash


जोएल द्वारा प्रकाशित कोड में एक दौड़ की स्थिति है, और ऐसा लगता है कि आपका यह उसे विरासत में मिला हो सकता है। जोएल की पोस्ट पर मैंने जो टिप्पणी प्रकाशित की, उसे देखें। joel.lopes-da-silva.com/2010/09/07/…
xyzzycoder

धन्यवाद! अब इसे पैच अप किया। मूल कार्यान्वयन के बाद से यह मेरे लिए कभी भी समस्या नहीं थी, मैंने हमेशा इसे समर्पित धागे में चलाया;)
अलेक्जेंडर डब्ल्यू

0

Apple कार्यान्वयन का उपयोग नहीं करने का कोई कारण: https://developer.apple.com/library/mac/documentation/Security/Conceptual/cryptoservices/GeneralPurposeCrypto/GeneralPurposeCrypto.html#//apple_ref/doc/uid/TP40011172-CH9-S1

Apple डेवलपर साइट पर क्रिप्टोग्राफ़िक सर्विसेज गाइड के लिए खोजें।


लिंक कॉमन क्रिप्टो को शामिल करता है जो कि ज्यादातर उत्तर यहां उपयोग करते हैं।
ज़ाफ

1
निश्चित ही अहंकार एक ही है। लेकिन ध्यान दें कि अपने स्वयं के क्रिप्टो एल्गोरिदम को लागू करने से खामियां मिल सकती हैं। सभी परिदृश्‍यों में इसे सही करने के लिए काफी मेहनत करनी पड़ती है। इसलिए लाइब्रेरी संस्करण का उपयोग करना पसंद किया जाता है, आम मामले में।
18
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.