PHP 代码如下:
<?php /** * 加密解密 字符串 * @param string $string 原字符串 * @param string $auth_key 加密的KEY * @param string $operation 加密解密的开关 ENCODE:加密, DECODE:解密 * @return string|mixed */ function authCode($string, $auth_key, $operation='ENCODE') { $key = md5($auth_key); $key_length = strlen($key); //base64_decode 默认是 iso-8859-1 转 UTF-8 用 utf8_decode(base64_decode($string)) $string = $operation == 'DECODE' ? utf8_decode(base64_decode($string)) : substr(md5($string.$key), 0, 8).$string; $string_length = strlen($string); $rndkey = $box = array(); $result = ''; for($i = 0; $i <= 255; $i++) { $rndkey[$i] = ord($key[$i % $key_length]); $box[$i] = $i; } for($j = $i = 0; $i < 256; $i++) { $j = ($j + $box[$i] + $rndkey[$i]) % 256; $tmp = $box[$i]; $box[$i] = $box[$j]; $box[$j] = $tmp; } for($a = $j = $i = 0; $i < $string_length; $i++) { $a = ($a + 1) % 256; $j = ($j + $box[$a]) % 256; $tmp = $box[$a]; $box[$a] = $box[$j]; $box[$j] = $tmp; $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); } if($operation == 'DECODE') { if(substr($result, 0, 8) == substr(md5(substr($result, 8).$key), 0, 8)) { return substr($result, 8); } else { return ''; } } else { //base64_encode 默认是 iso-8859-1 转 UTF-8 用 base64_encode(utf8_encode($result)) return str_replace('=', '',base64_encode(utf8_encode($result))); } } $key = "123"; $string = "test"; $a = authCode($string, $key); var_dump($a); var_dump(authCode($a, $key,'DECODE')); ?>
objective-c 代码如下:
// // Base64.h // Base64 // // Created by wangzhongbin on 13-7-5. // Copyright (c) 2013年 iOS Group. All rights reserved. // #import <Foundation/Foundation.h> @interface NSData (Base64) + (NSData *)dataWithBase64EncodedString:(NSString *)string; - (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth; - (NSString *)base64EncodedString; @end @interface NSString (Base64) + (NSString *)stringWithBase64EncodedString:(NSString *)string encoding:(NSStringEncoding)encoding; + (NSString *)stringWithBase64EncodedString:(NSString *)string; - (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth; - (NSString *)base64EncodedString:(NSStringEncoding)encoding; - (NSString *)base64EncodedString; - (NSString *)base64DecodedString:(NSStringEncoding)encoding; - (NSString *)base64DecodedString; - (NSData *)base64DecodedData; - (NSString *)authCodeEncoded:(NSString *)key encoding:(NSStringEncoding)encoding; - (NSString *)authCodeEncoded:(NSString *)key; - (NSString *)authCodeDecoded:(NSString *)key encoding:(NSStringEncoding)encoding; - (NSString *)authCodeDecoded:(NSString *)key; @end
// // Base64.m // Base64 // // Created by wangzhongbin on 13-7-5. // Copyright (c) 2013年 iOS Group. All rights reserved. // #import "Base64.h" #import <CommonCrypto/CommonDigest.h> #import <Availability.h> #if !__has_feature(objc_arc) #error This library requires automatic reference counting #endif typedef enum { NSStringAuthCodeEncoded, NSStringAuthCodeDecoded } NSStringAuthCode; @implementation NSData (Base64) + (NSData *)dataWithBase64EncodedString:(NSString *)string { const char lookup[] = { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 62, 99, 99, 99, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 99, 99, 99, 99, 99, 99, 99, 0, 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, 99, 99, 99, 99, 99, 99, 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, 99, 99, 99, 99, 99 }; NSData *inputData = [string dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; long long inputLength = [inputData length]; const unsigned char *inputBytes = [inputData bytes]; long long maxOutputLength = (inputLength / 4 + 1) * 3; NSMutableData *outputData = [NSMutableData dataWithLength:maxOutputLength]; unsigned char *outputBytes = (unsigned char *)[outputData mutableBytes]; int accumulator = 0; long long outputLength = 0; unsigned char accumulated[] = {0, 0, 0, 0}; for (long long i = 0; i < inputLength; i++) { unsigned char decoded = lookup[inputBytes[i] & 0x7F]; if (decoded != 99) { accumulated[accumulator] = decoded; if (accumulator == 3) { outputBytes[outputLength++] = (accumulated[0] << 2) | (accumulated[1] >> 4); outputBytes[outputLength++] = (accumulated[1] << 4) | (accumulated[2] >> 2); outputBytes[outputLength++] = (accumulated[2] << 6) | accumulated[3]; } accumulator = (accumulator + 1) % 4; } } //handle left-over data if (accumulator > 0) outputBytes[outputLength] = (accumulated[0] << 2) | (accumulated[1] >> 4); if (accumulator > 1) outputBytes[++outputLength] = (accumulated[1] << 4) | (accumulated[2] >> 2); if (accumulator > 2) outputLength++; //truncate data to match actual output length outputData.length = outputLength; return outputLength? outputData: nil; } - (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth { //ensure wrapWidth is a multiple of 4 wrapWidth = (wrapWidth / 4) * 4; const char lookup[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; long long inputLength = [self length]; const unsigned char *inputBytes = [self bytes]; long long maxOutputLength = (inputLength / 3 + 1) * 4; maxOutputLength += wrapWidth? (maxOutputLength / wrapWidth) * 2: 0; unsigned char *outputBytes = (unsigned char *)malloc(maxOutputLength); long long i; long long outputLength = 0; for (i = 0; i < inputLength - 2; i += 3) { outputBytes[outputLength++] = lookup[(inputBytes[i] & 0xFC) >> 2]; outputBytes[outputLength++] = lookup[((inputBytes[i] & 0x03) << 4) | ((inputBytes[i + 1] & 0xF0) >> 4)]; outputBytes[outputLength++] = lookup[((inputBytes[i + 1] & 0x0F) << 2) | ((inputBytes[i + 2] & 0xC0) >> 6)]; outputBytes[outputLength++] = lookup[inputBytes[i + 2] & 0x3F]; //add line break if (wrapWidth && (outputLength + 2) % (wrapWidth + 2) == 0) { outputBytes[outputLength++] = '\r'; outputBytes[outputLength++] = '\n'; } } //handle left-over data if (i == inputLength - 2) { // = terminator outputBytes[outputLength++] = lookup[(inputBytes[i] & 0xFC) >> 2]; outputBytes[outputLength++] = lookup[((inputBytes[i] & 0x03) << 4) | ((inputBytes[i + 1] & 0xF0) >> 4)]; outputBytes[outputLength++] = lookup[(inputBytes[i + 1] & 0x0F) << 2]; outputBytes[outputLength++] = '='; } else if (i == inputLength - 1) { // == terminator outputBytes[outputLength++] = lookup[(inputBytes[i] & 0xFC) >> 2]; outputBytes[outputLength++] = lookup[(inputBytes[i] & 0x03) << 4]; outputBytes[outputLength++] = '='; outputBytes[outputLength++] = '='; } if (outputLength >= 4) { //truncate data to match actual output length outputBytes = realloc(outputBytes, outputLength); return [[NSString alloc] initWithBytesNoCopy:outputBytes length:outputLength encoding:NSASCIIStringEncoding freeWhenDone:YES]; } else if (outputBytes) { free(outputBytes); } return nil; } - (NSString *)base64EncodedString { return [self base64EncodedStringWithWrapWidth:0]; } @end @implementation NSString (Base64) + (NSString *)stringWithBase64EncodedString:(NSString *)string encoding:(NSStringEncoding)encoding { NSData *data = [NSData dataWithBase64EncodedString:string]; if (data) { return [[self alloc] initWithData:data encoding:encoding]; } return nil; } + (NSString *)stringWithBase64EncodedString:(NSString *)string { return [self stringWithBase64EncodedString:string encoding:NSUTF8StringEncoding]; } - (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth { NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; return [data base64EncodedStringWithWrapWidth:wrapWidth]; } - (NSString *)base64EncodedString:(NSStringEncoding)encoding { NSData *data = [self dataUsingEncoding:encoding allowLossyConversion:YES]; return [data base64EncodedString]; } - (NSString *)base64EncodedString { return [self base64EncodedString:NSUTF8StringEncoding]; } - (NSString *)base64DecodedString:(NSStringEncoding)encoding { return [NSString stringWithBase64EncodedString:self encoding:encoding]; } - (NSString *)base64DecodedString { return [NSString stringWithBase64EncodedString:self]; } - (NSData *)base64DecodedData { return [NSData dataWithBase64EncodedString:self]; } - (NSString *)md5 { const char *concat_str = [self UTF8String]; unsigned char result[CC_MD5_DIGEST_LENGTH]; CC_MD5(concat_str, strlen(concat_str), result); NSMutableString *hash = [NSMutableString string]; for (int i = 0; i < 16; i++) [hash appendFormat:@"%02x", result[i]]; return [hash lowercaseString]; } - (NSString *)authCode:(NSString *)auth_key operation:(NSStringAuthCode)operation encoding:(NSStringEncoding)encoding; { NSMutableArray *rndkey = [NSMutableArray array]; NSMutableArray *box = [NSMutableArray array]; NSMutableString *result = [NSMutableString string]; NSString *key = [auth_key md5]; NSUInteger key_length = key.length; NSString *string = (operation == NSStringAuthCodeDecoded) ? [self base64DecodedString:encoding] : [NSString stringWithFormat:@"%@%@",[[[NSString stringWithFormat:@"%@%@",self,key] md5] substringToIndex:8],self]; NSUInteger string_length = string.length; for(int i = 0; i <= 255; i++) { [rndkey addObject:[NSNumber numberWithUnsignedShort:[key characterAtIndex:i%key_length]]]; [box addObject:[NSNumber numberWithUnsignedShort:i]]; } int j = 0; for(int i = 0; i < 256; i++) { unsigned short b = [[box objectAtIndex:i] unsignedShortValue]; unsigned short r = [[rndkey objectAtIndex:i] unsignedShortValue]; j = (j + b + r) % 256; [box replaceObjectAtIndex:i withObject:[box objectAtIndex:j]]; [box replaceObjectAtIndex:j withObject:[NSNumber numberWithUnsignedShort:b]]; } int a = 0; j = 0; for(int i = 0; i < string_length; i++) { a = (a + 1) % 256; unsigned short b = [[box objectAtIndex:a] unsignedShortValue]; j = (j + b) % 256; [box replaceObjectAtIndex:a withObject:[box objectAtIndex:j]]; [box replaceObjectAtIndex:j withObject:[NSNumber numberWithUnsignedShort:b]]; unsigned short sc = [string characterAtIndex:i]; unsigned short bi = [[box objectAtIndex:(([[box objectAtIndex:a] unsignedShortValue] + [[box objectAtIndex:j] unsignedShortValue]) % 256)] unsignedShortValue]; unsigned short k = sc ^ bi; [result appendFormat:@"%C",k]; } if(operation == NSStringAuthCodeDecoded) { NSString *start = [result substringToIndex:8]; NSString *end = [[[NSString stringWithFormat:@"%@%@",[result substringFromIndex:8],key] md5] substringToIndex:8]; if([start isEqualToString:end]){ return [result substringFromIndex:8]; } else{ return nil; } } else { return [[result base64EncodedString:encoding] stringByReplacingOccurrencesOfString:@"=" withString:@""]; } } - (NSString *)authCodeEncoded:(NSString *)key encoding:(NSStringEncoding)encoding { return [self authCode:key operation:NSStringAuthCodeEncoded encoding:encoding]; } - (NSString *)authCodeEncoded:(NSString *)key { return [self authCodeEncoded:key encoding:NSUTF8StringEncoding]; } - (NSString *)authCodeDecoded:(NSString *)key encoding:(NSStringEncoding)encoding { return [self authCode:key operation:NSStringAuthCodeDecoded encoding:encoding]; } - (NSString *)authCodeDecoded:(NSString *)key { return [self authCodeDecoded:key encoding:NSUTF8StringEncoding]; } @end
NSString *key = @"123"; NSString *string = @"test"; NSString *a = [string authCodeEncoded:key]; NSLog(@"%@",a); NSLog(@"%@",[a authCodeDecoded:key]);
完整代码下载地址:http://download.csdn.net/detail/jxncwzb/8474547