অবজেক্টিভ-সি তে এমডি 5 অ্যালগরিদম


134

অবজেক্টিভ-সি তে এমডি 5 গণনা কিভাবে করবেন?


1
আমার অনুমান যে আপনি এমডি 5 গণনা করে মোটামুটি সহজেই একটি সি রুটিন পোর্ট করতে পারেন। এবং সেগুলি খুঁজে পাওয়া সহজ।
আর্টেলিয়াস

উত্তর:


219

এমডি 5 আইফোনে উপলভ্য এবং এর সংযোজন হিসাবে যুক্ত করা যায় 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

সম্পাদনা

এনএসডাটা এমডি 5 যুক্ত হয়েছে কারণ আমার নিজের এটি প্রয়োজন ছিল এবং এই ছোট্ট স্নিপেটটি সংরক্ষণ করার জন্য এটি একটি ভাল জায়গা ...

এই পদ্ধতিগুলি এনআইএসটি এমডি 5 পরীক্ষা ভেক্টরগুলি http://www.nsrl.nist.gov/testdata/ এ ব্যবহার করে যাচাই করা হয়েছে


এটি কি পুরো ফাইলটিকে স্মৃতিতে টানছে?
ওপেনফ্রোগ

এটি ফাইল সম্পর্কিত নয়। আপনি যদি এই পদ্ধতিগুলির সাহায্যে কোনও ফাইল থেকে এমডি 5 তৈরি করতে চান তবে আপনি এনএসডিটা * ফাইলকন্টেন্টস = [এনএসডিটা ডেটাউথকন্টেন্টসফিল: @ "<yourPath>"] করতে পারেন; এনএসএসস্ট্রিং * মাই হ্যাশ = [ফাইলসন্টেন্টস এমডি 5]; এবং হ্যাঁ, এটি মেমরির মধ্যে পুরো ফাইল টান হবে। যদি আপনি এমন কোনও সমাধান খুঁজে পান যা ফাইল স্ট্রিমগুলির সাথে কাজ করে তবে দয়া করে একটি উত্তর হিসাবে পোস্ট করুন।
ক্লাস

1
আপনার যদি হ্যাশ ফাইল দরকার হয় তবে আপনার সিসি_এমডি 5_ইনিট ব্যবহার করা উচিত, তারপরে সমস্ত ফাইলের ডেটার জন্য সিসি_এমডি 5_ আপডেট করুন এবং তারপরে - সিসি_এমডি 5_ফিনিশ।
নিকোলে ওলশেভস্কি

7
Bit৪ বিটের আর্কিটেকচারের জন্য strlenসংকলন করে, এই সতর্কতাটি কল করার জন্য কলটি এসেছে : "অন্তর্নিহিত রূপান্তরটি পূর্ণ নির্ভুলতা হারায়: 'সাইনড লম্বা' থেকে 'সিসি_লং' (ওরফে 'স্বাক্ষরবিহীন
অন্তর্নিহিত

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;
}

আমি উপরের কোডটি প্রয়োগ করেছি তবে অ্যাপ্লিকেশনটি চালুর সময় এটি ক্র্যাশ হচ্ছে (সিসি_এমডি 5 (সিএসটিআর, স্ট্রেলেন (সিএসটিআর), ডাইজেস্ট) ----> এই লাইনটি এক্সসি_বিএডি_এসিসিএসএস বলে ব্যতিক্রম ছুঁড়ে দিচ্ছে)
নিলেশ কুমার

@ উইমকনিলেশ selfকার্যকর করার আগে পরীক্ষা করে দেখুন; স্ব যদি শূন্য হয় তবে এটি ক্রাশ হবে।
ব্র্যান্ডস্ক্রিপ্ট

4
এই উত্তরটি পড়ার জন্য অন্যদের তুলনায় অনেক পরিষ্কার; এটির (int)strlen(int)strlen
দরকারের

খড় এটি দুর্দান্ত +1 upvote, এবং আপনি দয়া করে আপনার এনক্রিপশন হিসাবে md5 ডিক্রিপশন পদ্ধতি প্রদান করতে পারেন।
আইয়াজ

@ আইয়াজ এমডি 5 ডিক্রিপ্ট করা যাবে না (কমপক্ষে কেবল কোনও পদ্ধতিতে)।
albanx

9

যদি পারফরম্যান্স গুরুত্বপূর্ণ হয়, আপনি এই অনুকূলিত সংস্করণটি ব্যবহার করতে পারেন। এটি যাগুলির সাথে প্রায় 5 গুণ বেশি দ্রুতstringWithFormat বাNSMutableString

এটি এনএসএসস্ট্রিংয়ের একটি বিভাগ।

- (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 এর সাথে কাজ করে এবং এটি স্ট্রিম ব্যবহার করছে। এটি আইওএসের জন্য তৈরি তবে ওএসএক্স-এ কেবলমাত্র ন্যূনতম পরিবর্তনগুলির সাথে কাজ করে (এএলএসেটরপ্রেসিভেশন পদ্ধতিটি সরান)। এটি ফাইলপথ বা এএলসেটস (ALAssetRepiversityation ব্যবহার করে) দেওয়া ফাইলগুলির জন্য চেকসাম তৈরি করতে পারে। এটি ফাইলের আকার / সম্পত্তির আকার নির্বিশেষে মেমরির প্রভাবকে সর্বনিম্ন ন্যূনতম প্যাকেজগুলির মধ্যে ডেটা ছড়িয়ে দিচ্ছে।

এটি বর্তমানে এখানে গিথুবে রয়েছে: https://github.com/leetal/FileHash


জোয়েল যে কোডটি প্রকাশ করেছে তাতে রেসের শর্ত রয়েছে এবং দেখে মনে হচ্ছে আপনার এটি উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে। আমি জোয়েলের পোস্টে প্রকাশিত মন্তব্য দেখুন। joel.lopes-da-silva.com/2010/09/07/…
xyzzycoder

ধন্যবাদ! এটি এখন প্যাচ আপ। আসল বাস্তবায়নের ক্ষেত্রে এটি আমার পক্ষে কখনও সমস্যা ছিল না, আমি সর্বদা এটি একটি উত্সর্গীকৃত থ্রেডে চালিত করি;)
আলেকজান্ডার ডব্লিউ

0

অ্যাপল বাস্তবায়ন ব্যবহার না করার কোনও কারণ: https://developer.apple.com/library/mac/docamentation/Security/Concepual/cryptoservices/ GenderralPurposeCrypto.html# TP40011172-

অ্যাপল বিকাশকারী সাইটে ক্রিপ্টোগ্রাফিক পরিষেবাদি গাইড অনুসন্ধান করুন।


লিঙ্কটি কমন ক্রিপ্টোকে কভার করে যা এখানে বেশিরভাগ উত্তর ব্যবহার করে।
জাফ

1
অবশ্যই অ্যালগো একই রকম। তবে মনে রাখবেন যে আপনার নিজের ক্রিপ্টো অ্যালগরিদম বাস্তবায়ন ত্রুটিগুলি প্রবর্তন করতে পারে। সমস্ত দৃশ্যে এটি সঠিক হয়ে উঠতে অনেক শক্ত হওয়া লাগে । সুতরাং সাধারণ ক্ষেত্রে লাইব্রেরি সংস্করণ ব্যবহার করা পছন্দ করা উচিত।
ভপঠাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.