Алгоритм MD5 в Objective-C


Відповіді:


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

EDIT

Додано NSData md5, тому що я сам цього потребував і думав, що це гарне місце для збереження цього маленького фрагмента ...

Ці методи перевіряються за допомогою тестових векторів NIST MD5 на веб-сайті http://www.nsrl.nist.gov/testdata/


Це тягне весь файл в пам'ять?
openfrog

Мова не йде про файли. Якщо ви хочете створити 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перед виконанням; якщо self не дорівнює, воно зазнає краху.
фірмовий сценарій

4
Ця відповідь читати набагато чистіше, ніж інші; Одне, що йому потрібно, - це акторський (int)strlen(int)strlen
склад

Хей Це приємне оновлення +1, а ви можете, будь-ласка, надати метод розшифровки md5 такий же, як і шифрування вашого.
Айяз

@Ayaz MD5 неможливо розшифрувати (принаймні просто методом).
albanx

9

Якщо продуктивність важлива, ви можете використовувати цю оптимізовану версію. Це приблизно в 5 разів швидше, ніж ті, що маютьstringWithFormat або 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 (видаліть метод ALAssetRepresentation). Він може робити контрольні суми для файлів із заданим файловим шляхом або ALAssets (використовуючи ALAssetRepresentation). Це збирання даних у невеликі пакети, що робить вплив на пам'ять мінімальним незалежно від розміру файлу / розміру ресурсу.

Зараз він розміщений на Github тут: https://github.com/leetal/FileHash


Код, який опублікував Джоел, має расову умову, і, схоже, ваш може успадкувати його. Дивіться коментар, який я опублікував на посаді Джоела. joel.lopes-da-silva.com/2010/09/07/…
xyzzycoder

Дякую! Закріплено це зараз. Це ніколи не було проблемою для мене, оскільки в оригінальній реалізації я завжди працював у спеціальній темі;)
Alexander W

0

Будь-яка причина не використовувати реалізацію Apple: https://developer.apple.com/library/mac/documentation/Security/Conceptual/cryptoservices/GeneralPurposeCrypto/GeneralPurposeCrypto.html#//apple_ref/doc/uid/TP40011172-CH9-SW1

Шукайте посібник з криптографічних послуг на сайті розробника Apple.


Посилання охоплює загальну криптовалюту, яка використовує більшість відповідей тут.
заф

1
Впевнений, альго те саме. Але зауважте, що реалізація власного крипто алгоритму може ввести недоліки. Потрібно багато загартовування, щоб виправити це у всіх сценаріях. Тому використання бібліотечної версії в кращому випадку слід віддати перевагу.
впатак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.