it-swarm.com.de

MD5-Algorithmus in Objective-C

Wie berechnet man das MD5 in Objective-C?

133
Biranchi

md5 ist auf dem iPhone verfügbar und kann wie folgt als Zusatz für zB NSString und NSData hinzugefügt werden.

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

BEARBEITEN

NSData md5 wurde hinzugefügt, weil ich es selbst brauchte und dachte, dass dies ein guter Ort ist, um dieses kleine Snippet zu speichern ...

Diese Methoden werden mit den NIST MD5-Testvektoren in http://www.nsrl.nist.gov/testdata/ verifiziert

219
epatel

Sie können dazu die integrierte Common Crypto-Bibliothek verwenden. Denken Sie daran, zu importieren:

#import <CommonCrypto/CommonDigest.h>

und dann:

- (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;
}
53
Bruno Koga

Wenn Leistung wichtig ist, können Sie diese optimierte Version verwenden. Es ist ungefähr fünfmal schneller als die mit stringWithFormat oder NSMutableString.

Dies ist eine Kategorie von 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;
}
9
Pavel Alexeev

Jeder Grund, die Implementierung von Apple=) nicht zu verwenden: https://developer.Apple.com/library/mac/documentation/Security/Conceptual/cryptoservices/GeneralPurposeCrypto/GeneralPurposeCrypto.html# // Apple_ref/doc/uid/TP40011172-CH9-SW1

Suchen Sie nach Cryptographic Services Guide auf Apple Developer Site.

0
vpathak

Nun, da Leute nach einer Dateistream-Version gefragt haben. Ich habe ein nettes kleines Snippet von Joel Lopes Da Silva modifiziert, das mit MD5, SHA1 und SHA512 funktioniert UND Streams verwendet. Es wurde für iOS entwickelt, funktioniert aber auch unter OSX mit nur minimalen Änderungen (entfernen Sie die ALAssetRepresentation-Methode). Es kann Prüfsummen für Dateien erstellen, denen ein Dateipfad oder ein ALAssets zugewiesen wurde (mithilfe von ALAssetRepresentation). Durch das Aufteilen von Daten in kleine Pakete wird die Auswirkung auf den Arbeitsspeicher unabhängig von der Dateigröße/Größe des Assets auf ein Minimum reduziert.

Es befindet sich derzeit auf Github hier: https://github.com/leetal/FileHash

0
Alexander W