Home > Backend Development > PHP Tutorial > objective-c实现authCode 解决php与ios通信加密的问题

objective-c实现authCode 解决php与ios通信加密的问题

WBOY
Release: 2016-06-20 12:25:52
Original
1113 people have browsed it

最近项目中要加密与服务器的通讯内容,主要是为了防止恶意的抓包利用,本来这样的加密直接在网上就可以找到的,但是无奈关于OC的几乎都来自同一个模版,加密出来的字符窜无法被PHP后端解析,并且也没有有效时间的参数,所以只能对照PHP的加密代码写一个OC版的,其中PHP的很多方法,在OC当中远远没有一句话那么简单(::>_<::>


#import <CommonCrypto/CommonDigest.h>#define STRING_SPLICE(a,b)     ([NSString stringWithFormat:@"%@%@",(NSString *)(a),(NSString *)(b)])//字符串拼接
Copy after login
+ (NSString *)md5:(NSString *)str {    const char *cStr = [str UTF8String];    unsigned char result[16];    CC_MD5(cStr, strlen(cStr), result); // This is the md5 call        return [NSString stringWithFormat:            @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",            result[0], result[1], result[2], result[3],            result[4], result[5], result[6], result[7],            result[8], result[9], result[10], result[11],            result[12], result[13], result[14], result[15]            ];}
Copy after login
// param: 要加密的字符串// operation: 传入@"ENCODE" 为加密,解密没有写,所以只要不传"DECODE"就OK了// expiry: 有效时间,单位是秒,默认时0,就是没有时效,如果设置后超出有效时间,将无法被解密+ (NSString *)encryption:(NSString *)param operation:(NSString *)operation expiry:(int)expiry{    NSString *key = @"1992326qa";   // 加密的密钥    NSString *DECODE = @"DECODE";    param = [param stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];    operation = operation ? operation : DECODE;    expiry = expiry ? expiry : 0;    int keyLength = 4;    key = [self md5:key];    NSString *keya = [self md5:[key substringToIndex:16]];    NSString *keyb = [self md5:[key substringFromIndex:16]];    NSString *time = [self microtime];    NSString *keyc = keyLength ? ([operation isEqualToString:DECODE] ? [param substringToIndex:keyLength] : [[self md5:time] substringFromIndex:[self md5:time].length - keyLength]) : @"";    NSString *cryptkey = STRING_SPLICE(keya, [self md5:STRING_SPLICE(keya, keyc)]);    keyLength = cryptkey.length;    param = [NSString stringWithFormat:@"%@%@%@",([NSString stringWithFormat:@"%010d",expiry ? expiry + (int)[[NSDate dateWithTimeIntervalSinceNow:0] timeIntervalSince1970] : expiry]),[[self md5: STRING_SPLICE(param,keyb)] substringToIndex:16],param];    int paramLength = param.length;    NSString *result = @"";    NSMutableArray *box = [NSMutableArray arrayWithCapacity:UnicodeCount];    for (int i = 0; i <= UnicodeCount; i++) {        [box addObject:@(i)];    }    NSMutableArray *rndkey = [NSMutableArray array];    for (int i = 0; i <= UnicodeCount; i++) {        const char rndkeyItem = [cryptkey characterAtIndex:i % keyLength];        NSString *asciiStr = [NSString stringWithCString:&rndkeyItem encoding:NSASCIIStringEncoding];        int asciiCode = [asciiStr characterAtIndex:0];        [rndkey addObject:@(asciiCode)];    }    for (int i=0,j = 0; i <= UnicodeCount; i++) {        j = (j + [box[i] intValue] + [rndkey[i] intValue]) % (UnicodeCount + 1);        int tmp = [box[i] intValue];        box[i] = box[j];        box[j] = @(tmp);    }    for (int a = 0,j = 0,i = 0; i < paramLength; i ++) {        a = (a + 1) % (UnicodeCount + 1);        j = (j + [box[a] intValue]) % (UnicodeCount + 1);        int tmp = [box[a] intValue];        box[a] = box[j];        box[j] = @(tmp);        int s1 = [self ord:param index:i];        int s2 = [box[([box[a] intValue] + [box[j] intValue]) % (UnicodeCount + 1)] intValue];        int s3 = s1 ^ s2;        NSString *add = [self strChr:s3];        result = STRING_SPLICE(result, add);    }    return [NSString stringWithFormat:@"%@%@",keyc,[[self base64:result] stringByReplacingOccurrencesOfString:@"=" withString:@""]];}
Copy after login
+ (NSString *)microtime // 计算时间串{    NSDate *currentDate = [NSDate dateWithTimeIntervalSinceNow:0];    NSTimeInterval interval = [currentDate timeIntervalSince1970];    NSString *intervalStr = [NSString stringWithFormat:@"%f00",interval];    NSString *pre = [intervalStr substringWithRange:NSMakeRange(intervalStr.length - 8, 8)];    NSString *suf = [intervalStr substringToIndex:intervalStr.length - 9];    NSString *result = [NSString stringWithFormat:@"0.%@ %@",pre,suf];    return result;}
Copy after login
+ (int)ord:(NSString *)str index:(int)index  // 获取字符串某一位的ASCII码{    int asciiCode = [str characterAtIndex:index];    return asciiCode;}
Copy after login
+ (const char)chr:(int)asciiCode  // 通过ASCII码获取字符{    return [[NSString stringWithFormat:@"%C",(unichar)asciiCode] characterAtIndex:0];}
Copy after login
+ (NSString *)strChr:(int)asciiCode // 通过ASCII码获取字符串{    NSString *data = [NSString stringWithFormat:@"%C",(unichar)asciiCode]; //A    return data;}
Copy after login
+ (NSString *)base64:(NSString *)str // base64编码{    NSString *base64EncodedString = [[str dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:0];    return base64EncodedString;}
Copy after login

注意:

  • 只有加密算法(因为我不需要解密)
  • 如果需要加密汉字,加密过程中,会出现空格字符,而后端会解析失败,所以在后台解析iOS端时,要将加密串中的空格替换为+号,才能保证每次解析成功

问题:

  • 因为加密过程中需要转换ASCII码,但是Mac和Window的ASCII码在127位以后就不一样了,所以我们只能利用前127位ASCII码

我也是先留着,搞不好什么时候又用到了~

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template