Algoritmo MD5 en Objective C

Cómo calcular el MD5 en el objective C?

md5 está disponible en el iPhone y se puede agregar como una adición para, por ejemplo, NSString y NSData .

MyAdditions.h

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

MyAdditions.m

 #import "MyAdditions.h" #import  // 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 

EDITAR

Se agregó NSData md5 porque lo necesitaba yo mismo y pensé que este es un buen lugar para guardar este pequeño fragmento …

Estos métodos se verifican utilizando los vectores de prueba NIST MD5 en http://www.nsrl.nist.gov/testdata/

Puede usar la biblioteca Common Crypto incorporada para hacerlo. Recuerde importar:

 #import  

y entonces:

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

Si el rendimiento es importante, puede usar esta versión optimizada. Es aproximadamente 5 veces más rápido que los que tienen stringWithFormat o NSMutableString .

Esta es una categoría 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; } 

Bueno, ya que las personas pidieron una versión de flujo de archivos. He modificado un fragmento pequeño y agradable hecho por Joel Lopes Da Silva que funciona con MD5, SHA1 y SHA512 Y está usando streams. Está hecho para iOS pero también funciona con cambios mínimos en OSX (elimine el método ALAssetRepresentation). Puede hacer sums de comprobación para los archivos que reciben un formato de archivo o ALA (utilizando ALAsRepresentation). Es fragmentar los datos en pequeños paquetes, lo que hace que la memoria tenga un impacto mínimo, independientemente del tamaño del archivo / tamaño del activo.

Actualmente se encuentra en github aquí: https://github.com/leetal/FileHash

Cualquier motivo para no utilizar la implementación de Apple: https://developer.apple.com/library/mac/documentation/Security/Conceptual/cryptoservices/GeneralPurposeCrypto/GeneralPurposeCrypto.html#//apple_ref/doc/uid/TP40011172-CH9-SW1

Busque la Guía de servicios criptográficos en el sitio para desarrolladores de Apple.