最早接触md5算法还是学习php的时候,目前MD5算法也算是一种常用的算法之一。下面整理一下iOS上用到的MD5算法。
MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
5、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。
#import <Foundation/Foundation.h>
@interface NSString (MD5)
- (NSString *)MD5;
+ (NSString *)MD5ByAStr:(NSString *)aSourceStr;
+ (NSString *)MD5ForFileWithPath:(NSString *)path;
@end
#import "NSString+MD5.h"
#import <CommonCrypto/CommonDigest.h>
@implementation NSString (MD5)
- (NSString *)MD5
{
return [NSString MD5ByAStr:self];
}
+ (NSString *)MD5ByAStr:(NSString *)aSourceStr
{
const char* cStr = [aSourceStr UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStr, strlen(cStr), result);
NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i ++)
{
[ret appendFormat:@"%02x",result[i]];
}
return ret;
}
+ (NSString *)MD5ForFileWithPath:(NSString *)path
{
NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:path];
if( handle== nil ) {
return nil;
}
CC_MD5_CTX md5;
CC_MD5_Init(&md5);
BOOL done = NO;
while(!done)
{
NSData* fileData = [handle readDataOfLength: 256 ];
CC_MD5_Update(&md5, [fileData bytes], [fileData length]);
if( [fileData length] == 0 ) done = YES;
}
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final(result, &md5);
NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i ++)
{
[ret appendFormat:@"%02x",result[i]];
}
return ret;
}
@end