objective-c MD5 Implementation

/**
 * 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值