/**
* A Objective-C implementation of the RSA Data Security, Inc. MD5 Message
* Digest Algorithm, as defined in RFC 1321.
* Based on the JavaScript implementation of Paul Johnston
* Copyright (C) Paul Johnston 1999 - 2000.
* See http://pajhome.org.uk/site/legal.html for details.
* Objective-C Version by Chen Zhang (Orange Imageco)
*/
#import "YMMD5Utils.h"
@implementation YMMD5Utils{
NSString* hex_chr ;
}
-(YMMD5Utils*)myInit{
self = [super init];
if (self) {
hex_chr = @"0123456789abcdef";
}
return self;
}
-( NSString*) rhex:(int) num {
NSString* str = @"";
for(int j = 0; j <= 3; j++)
{
unichar first = [hex_chr characterAtIndex:((num >> (j * 8 + 4)) & 0x0F)];
unichar second =[hex_chr characterAtIndex:((num >> (j * 8)) & 0x0F) ];
NSString * firstStr =[NSString stringWithFormat:@"%C",first];
NSString * secondStr = [NSString stringWithFormat:@"%C",second];
str= [str stringByAppendingString:firstStr];
str = [str stringByAppendingString:secondStr];
}
return str;
}
-(NSArray*) str2blks_MD5:(NSString*) str
{
int nblk = (([str length] + 8) >> 6) + 1;
int blks[nblk * 16];
int i = 0;
for(i = 0; i < nblk * 16; i++) {
blks[i] = 0;
}
for(i = 0; i < [str length]; i++) {
blks[i >> 2] |= [str characterAtIndex:i] << ((i % 4) * 8);
}
blks[i >> 2] |= 0x80 << ((i % 4) * 8);
blks[nblk * 16 - 2] = [str length]*8;
NSMutableArray * array = [[NSMutableArray alloc] init];
for(int i =0 ; i<sizeof(blks)/sizeof(blks[0]);i++){
//NSString* str= [NSString stringWithFormat:@"%i":blks[i]];
// [s appendString:str];
[array addObject:[NSNumber numberWithInt:blks[i]]];
}
return array;
}
- (int) add:(int) x :(int) y
{
return ((x&0x7FFFFFFF) + (y&0x7FFFFFFF)) ^ (x&0x80000000) ^ (y&0x80000000);
}
- (int) rol:(int) num :(int) cnt
{
return (num << cnt) | (int)((unsigned int)num >> (32 - cnt));
}
- (int) cmn:(int) q :(int) a: (int) b: (int) x: (int) s: (int) t {
return [self add:[self rol:[self add:[self add:a :q]:[self add:x :t]] : s] :b];
}
-(int) ff:(int) a: (int) b: (int) c: (int) d:( int) x: (int) s:( int) t {
return [self cmn:(b & c) | ((~b) & d): a: b: x: s: t];
}
- (int) gg:(int) a:( int) b:( int) c:( int) d:( int) x:( int) s: (int) t {
return [self cmn:(b & d) | (c & (~d)):a: b: x: s: t];
}
- (int) hh:(int)a :(int) b: (int) c: (int) d: (int) x: (int) s: (int) t {
return [self cmn:b ^ c ^ d: a: b: x:s: t];
}
- (int) ii:(int) a: (int) b: (int) c: (int) d: (int) x: (int) s:( int) t {
return [self cmn :c ^ (b | (~d)): a: b: x: s: t];
}
- (NSString*) calcMD5:(NSString*) str {
NSArray* array = [self str2blks_MD5:str];
int x[array.count];
for (int i = 0 ; i<array.count; i++) {
NSNumber* number= [array objectAtIndex:i];
x[i] = [number intValue];
}
int a = 0x67452301;
int b = 0xEFCDAB89;
int c = 0x98BADCFE;
int d = 0x10325476;
for(int i = 0; i < array.count; i += 16)
{
int olda = a;
int oldb = b;
int oldc = c;
int oldd = d;
a = [self ff:a: b: c: d: x[i+ 0]: 7 : 0xD76AA478];
d = [self ff:d: a: b: c: x[i+ 1]: 12: 0xE8C7B756];
c = [self ff:c: d: a: b: x[i+ 2]: 17: 0x242070DB];
b = [self ff:b: c: d: a: x[i+ 3]: 22: 0xC1BDCEEE];
a = [self ff:a: b: c: d: x[i+ 4]: 7 : 0xF57C0FAF];
d = [self ff:d: a: b: c: x[i+ 5]: 12: 0x4787C62A];
c = [self ff:c: d: a: b: x[i+ 6]: 17: 0xA8304613];
b = [self ff:b: c: d: a: x[i+ 7]: 22: 0xFD469501];
a = [self ff:a: b: c: d: x[i+ 8]: 7 : 0x698098D8];
d = [self ff:d: a: b: c: x[i+ 9]: 12: 0x8B44F7AF];
c = [self ff:c: d: a: b: x[i+10]: 17: 0xFFFF5BB1];
b = [self ff:b: c: d: a: x[i+11]: 22: 0x895CD7BE];
a = [self ff:a: b: c: d: x[i+12]: 7 : 0x6B901122];
d = [self ff:d: a: b: c: x[i+13]: 12: 0xFD987193];
c = [self ff:c: d: a: b: x[i+14]: 17: 0xA679438E];
b = [self ff:b: c: d: a: x[i+15]: 22: 0x49B40821];
a = [self gg:a: b: c: d: x[i+ 1]: 5 : 0xF61E2562];
d = [self gg:d: a: b: c: x[i+ 6]: 9 : 0xC040B340];
c = [self gg:c: d: a: b: x[i+11]: 14: 0x265E5A51];
b = [self gg:b: c: d: a: x[i+ 0]: 20: 0xE9B6C7AA];
a = [self gg:a: b: c: d: x[i+ 5]: 5 : 0xD62F105D];
d = [self gg:d: a: b: c: x[i+10]: 9 : 0x02441453];
c = [self gg:c: d: a: b: x[i+15]: 14: 0xD8A1E681];
b = [self gg:b: c: d: a: x[i+ 4]: 20: 0xE7D3FBC8];
a = [self gg:a: b: c: d: x[i+ 9]: 5 : 0x21E1CDE6];
d = [self gg:d: a: b: c: x[i+14]: 9 : 0xC33707D6];
c = [self gg:c: d: a: b: x[i+ 3]: 14: 0xF4D50D87];
b = [self gg:b: c: d: a: x[i+ 8]: 20: 0x455A14ED];
a = [self gg:a: b: c: d: x[i+13]: 5 : 0xA9E3E905];
d = [self gg:d: a: b: c: x[i+ 2]: 9 : 0xFCEFA3F8];
c = [self gg:c: d: a: b: x[i+ 7]: 14: 0x676F02D9];
b = [self gg:b: c: d: a: x[i+12]: 20: 0x8D2A4C8A];
a = [self hh:a: b: c: d: x[i+ 5]: 4 : 0xFFFA3942];
d = [self hh:d: a: b: c: x[i+ 8]: 11: 0x8771F681];
c = [self hh:c: d: a: b: x[i+11]: 16: 0x6D9D6122];
b = [self hh:b: c: d: a: x[i+14]: 23: 0xFDE5380C];
a = [self hh:a: b: c: d: x[i+ 1]: 4 : 0xA4BEEA44];
d = [self hh:d: a: b: c: x[i+ 4]: 11: 0x4BDECFA9];
c = [self hh:c: d: a: b: x[i+ 7]: 16: 0xF6BB4B60];
b = [self hh:b: c: d: a: x[i+10]: 23: 0xBEBFBC70];
a = [self hh:a: b: c: d: x[i+13]: 4 : 0x289B7EC6];
d = [self hh:d: a: b: c: x[i+ 0]: 11: 0xEAA127FA];
c = [self hh:c: d: a: b: x[i+ 3]: 16: 0xD4EF3085];
b = [self hh:b: c: d: a: x[i+ 6]: 23: 0x04881D05];
a = [self hh:a: b: c: d: x[i+ 9]: 4 : 0xD9D4D039];
d = [self hh:d: a: b: c: x[i+12]: 11: 0xE6DB99E5];
c = [self hh:c: d: a: b: x[i+15]: 16: 0x1FA27CF8];
b = [self hh:b: c: d: a: x[i+ 2]: 23: 0xC4AC5665];
a = [self ii:a: b: c: d: x[i+ 0]: 6 : 0xF4292244];
d = [self ii:d: a: b: c: x[i+ 7]: 10: 0x432AFF97];
c = [self ii:c: d: a: b: x[i+14]: 15: 0xAB9423A7];
b = [self ii:b: c: d: a: x[i+ 5]: 21: 0xFC93A039];
a = [self ii:a: b: c: d: x[i+12]: 6 : 0x655B59C3];
d = [self ii:d: a: b: c: x[i+ 3]: 10: 0x8F0CCC92];
c = [self ii:c: d: a: b: x[i+10]: 15: 0xFFEFF47D];
b = [self ii:b: c: d: a: x[i+ 1]: 21: 0x85845DD1];
a = [self ii:a: b: c: d: x[i+ 8]: 6 : 0x6FA87E4F];
d = [self ii:d: a: b: c: x[i+15]: 10: 0xFE2CE6E0];
c = [self ii:c: d: a: b: x[i+ 6]: 15: 0xA3014314];
b = [self ii:b: c: d: a: x[i+13]: 21: 0x4E0811A1];
a = [self ii:a: b: c: d: x[i+ 4]: 6 : 0xF7537E82];
d = [self ii:d: a: b: c: x[i+11]: 10: 0xBD3AF235];
c = [self ii:c: d: a: b: x[i+ 2]: 15: 0x2AD7D2BB];
b = [self ii:b: c: d: a: x[i+ 9]: 21: 0xEB86D391];
a = [self add:a: olda];
b = [self add:b: oldb];
c = [self add:c: oldc];
d = [self add:d: oldd];
}
return [[[[self rhex:a] stringByAppendingString:[self rhex:b]] stringByAppendingString:[self rhex:c]] stringByAppendingString:[self rhex:d]];
}
@end
objective-c MD5 Implementation
最新推荐文章于 2024-07-05 10:56:36 发布