iphone - Algoritmo MD5 en Objective C
objective-c encryption (5)
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 sumas 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
Cómo calcular el MD5 en el objetivo C?
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.
Puede usar la biblioteca Common Crypto incorporada para hacerlo. Recuerde importar:
#import <CommonCrypto/CommonDigest.h>
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;
}
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 <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
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/