2012-02-07 62 views
0

使用以下方法將文本轉換爲MD5格式。如何在iPhone中將文本轉換爲MD5 64字節格式

- (NSString*)MD5 
{ 
     const char *ptr = [txt_Password.text UTF8String]; 
     unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH]; 
     CC_MD5(ptr, strlen(ptr), md5Buffer); 
     NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; 
     for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) 
       [output appendFormat:@"%02x",md5Buffer[i]]; 
     return output; 
} 

但是,它返回了16字節的MD5字符串。我需要它在64個字節。任何幫助表示讚賞。謝謝!!!

+2

我想你真正需要的是Base64Encode(MD5(yourString))?還是我錯了? – Vlad 2012-02-07 12:09:04

+0

[目標C中的MD5算法]的可能重複(http://stackoverflow.com/questions/1524604/md5-algorithm-in-objective-c) – trojanfoe 2012-02-07 12:10:59

+0

@Vlad:你能告訴我,我該如何做到這一點?謝謝。 – Rushi 2012-02-07 12:26:46

回答

0

對於MD5:(在cathegory過的NSString添加爲好)

+ (NSString *)hashForString:(NSString *)aString { 
    NSData *data = [aString dataUsingEncoding:NSUTF8StringEncoding]; 
    unsigned char digest[CC_MD5_DIGEST_LENGTH]; 
    CC_MD5([data bytes], [data length], digest); 
    NSString *md5String = [[NSString alloc] initWithBytes:digest length:CC_MD5_DIGEST_LENGTH encoding:NSUTF8StringEncoding]; 
    return [md5String autorelease]; 
} 

爲了編碼的散列PSW爲64位格式:下面

- (NSString*)base64MD5HashForString:(NSString *)string { 
     NSString *md5Hash = [[[NSString hashForString:string] dataUsingEncoding:NSUTF8StringEncoding] encodeBase64]; 
return md5Hash; 
    } 

方法是在一個NSData的cathegory;

static const char kBase64Alphabet[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
             "abcdefghijklmnopqrstuvwxyz" 
             "/"; 

- (NSString*)encodeBase64 { 
    NSMutableString *encodedData = [NSMutableString string]; 
    int i = 0, j = 0; 
    unsigned char char_array_3[3]; 
    unsigned char char_array_4[5]; 

    memset(char_array_3, 0, 3*sizeof(char)); 
    memset(char_array_4, 0, 5*sizeof(char)); 

    int length = [self length]; 
    char *bytes = (char*)[self bytes]; 

    while(length--) { 
     char_array_3[i++] = *(bytes++); 
     if (i == 3) { 
      char_array_4[0] = kBase64Alphabet[(char_array_3[0] & 0xfc)>>2]; 
      char_array_4[1] = kBase64Alphabet[((char_array_3[0] & 0x03) <<4) + ((char_array_3[1] & 0xf0) >>4)]; 
      char_array_4[2] = kBase64Alphabet[((char_array_3[1] & 0x0f) <<2) + ((char_array_3[2] & 0xc0) >>6)]; 
      char_array_4[3] = kBase64Alphabet[char_array_3[2]&0x3f]; 

      [encodedData appendString:[NSString stringWithUTF8String:(const char*)char_array_4]]; 

      i = 0; 
     } 
    } 

    if (i) { 
     for(j=i; j<3; j++) 
      char_array_3[j] = '\0'; 

     char_array_4[0] = kBase64Alphabet[(char_array_3[0] & 0xfc)>>2]; 
     char_array_4[1] = kBase64Alphabet[((char_array_3[0] & 0x03) <<4) + ((char_array_3[1] & 0xf0) >>4)]; 
     char_array_4[2] = kBase64Alphabet[((char_array_3[1] & 0x0f) <<2) + ((char_array_3[2] & 0xc0) >>6)]; 
     char_array_4[3] = kBase64Alphabet[char_array_3[2]&0x3f]; 

     char_array_4[i+1] = 0; 
     [encodedData appendString:[NSString stringWithUTF8String:(const char*)char_array_4]]; 

     while((i++<3)) 
      [encodedData appendString:[NSString stringWithUTF8String:"="]]; 
    } 

    return encodedData; 
} 
+0

感謝您的幫助。你可以告訴我什麼是「memset(char_array_3,0,3 * sizeof(char));」以及爲什麼使用它? – Rushi 2012-02-07 12:48:50

+0

它只是指針的初始值設定項。如果你認爲這種方式更清晰,你可以用malloc()替換它。它所做的是在內存中爲陣列保留3 * 1個字節的位置,對於另一個則分別爲5 * 1字節。 (字符大小爲1個字節) – Vlad 2012-02-07 12:59:55

+0

好的。而這個int長度= [self length]; char * bytes =(char *)[self bytes];兩行? – Rushi 2012-02-07 13:01:29

相關問題