web-dev-qa-db-fra.com

Algorithme MD5 en Objective-C

Comment calculer le MD5 en Objective-C?

133
Biranchi

md5 est disponible sur l'iPhone et peut être ajouté en complément de NSString et NSData comme ci-dessous.

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

MODIFIER

NSData md5 ajouté car j'en avais besoin moi-même et je pensais que c'était un bon endroit pour enregistrer ce petit extrait ...

Ces méthodes sont vérifiées à l’aide des vecteurs de test NIST MD5 dans http://www.nsrl.nist.gov/testdata/

219
epatel

Vous pouvez utiliser la bibliothèque intégrée Common Crypto pour le faire. N'oubliez pas d'importer:

#import <CommonCrypto/CommonDigest.h>

et alors:

- (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

Si les performances sont importantes, vous pouvez utiliser cette version optimisée. Il est environ 5 fois plus rapide que ceux avec stringWithFormat ou NSMutableString.

C'est une catégorie de 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
0
vpathak

Eh bien, depuis que les gens ont demandé une version de flux de fichiers. J'ai modifié un joli petit extrait de Joel Lopes Da Silva qui fonctionne avec MD5, SHA1 et SHA512 ET qui utilise des flux. Il est conçu pour iOS mais ne nécessite que très peu de modifications sous OSX (supprimez la méthode ALAssetRepresentation). Il peut créer des sommes de contrôle pour les fichiers à l'aide d'un chemin de fichier ou d'ALAssets (à l'aide de ALAssetRepresentation). Il regroupe des données dans de petits packages, ce qui minimise l'impact de la mémoire, quelle que soit la taille de fichier ou la taille de l'élément.

Il est actuellement situé sur github ici: https://github.com/leetal/FileHash

0
Alexander W