1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
   | void MD5(NSString *str){     const void * bytes[str.length];     //字符串转字节流     [str getBytes:bytes maxLength:str.length usedLength:nil encoding:NSUTF8StringEncoding options:NSStringEncodingConversionExternalRepresentation range:NSMakeRange(0, str.length) remainingRange:nil];     //使用NSData存储     NSMutableData * data = [[NSMutableData alloc] initWithBytes:bytes length:str.length];     BOOL first = YES;     //进行数据填充     if (data.length<56) {         do {             if (first) {                 int byte = 0b10000000;                 [data appendBytes:&byte length:1];                 first = NO;             }else{                 int byte = 0b00000000;                 [data appendBytes:&byte length:1];             }         } while (data.length<56);     }     int length = (int)str.length*8%((int)pow(2, 64));     [data appendBytes:&length length:8];     void * newBytes[64];     memcpy(newBytes, [data bytes], 64);     //大小端转换     convertToLittleEndian(newBytes, 64);     NSData * newData = [NSData dataWithBytes:newBytes length:data.length];     NSMutableArray * subData = [NSMutableArray array];     //进行分组     for (int i = 0; i<16; i++) {         [subData addObject: [newData subdataWithRange:NSMakeRange(i*4, 4)]];     }     //初始输入     unsigned int A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476;     unsigned int a=A,b=B,c=C,d=D;     unsigned int s[64] = { 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11,16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15,21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 };     unsigned int  k[64] = {         0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,         0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,         0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,         0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,         0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,         0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,         0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,         0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,         0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,         0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,         0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,         0xd9d4d039,  0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,         0xf4292244, 0x432aff97,  0xab9423a7, 0xfc93a039,         0x655b59c3, 0x8f0ccc92, 0xffeff47d,  0x85845dd1,         0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,         0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 };          //64次循环处理     for (int i = 0; i <= 64; i++) {                  if (i<64) {             unsigned int f;             unsigned int g;             if (i<16) {                    f = (b&c)|((~b)&d);                 g = i;             }else if(i<32) {                 f = (b&d)|((~d)&c);                 g = (5*i+1)%16;             }else if(i<48){                 f = b^c^d;                 g = (3*i+5)%16;             }else{                 f = c^((~d)|b);                 g = (7*i)%16;             }             unsigned int * temp = (unsigned int *) [subData[g] bytes];             unsigned int  *tem = malloc(sizeof(unsigned int));             memcpy(tem, temp, 4);             convertToLittleEndian(tem, 4);             unsigned int res = (a+f+*tem+k[i]);             ROL(&res,s[i]);             unsigned int t = res+b;             a = d;             d = c;             c = b;             b = t;                     }else{             A = a+A;             B = b+B;             C = c+C;             D = d+D;         }     }     //大小端转换     unsigned int * newA = malloc(sizeof(unsigned int));     memcpy(newA, &A, 4);     NSLog(@"%0x",*newA);     convertToLittleEndian(newA, 4);     unsigned int * newB = malloc(sizeof(unsigned int));     memcpy(newB, &B, 4);     convertToLittleEndian(newB, 4);     unsigned int * newC = malloc(sizeof(unsigned int));     memcpy(newC, &C, 4);     convertToLittleEndian(newC, 4);     unsigned int * newD = malloc(sizeof(unsigned int));     memcpy(newD, &D, 4);     convertToLittleEndian(newD, 4);     NSLog(@"AAA:%0x %0x %0x %0x ",*newA,*newB,*newC,*newD); }
  |