AES 加解密
// // NSData+AES.h // Smile // // Created by 蒲晓涛 on 12-11-24. // Copyright (c) 2012年 BOX. All rights reserved. // // 版权属于原作者 // http://code4app.com (cn) http://code4app.net (en) // 发布代码于最专业的源码分享网站: Code4App.com #import <Foundation/Foundation.h> @class NSString; @interface NSData (Encryption) - (NSData *)AES128EncryptWithKey:(NSString *)key; //加密 - (NSData *)AES128DecryptWithKey:(NSString *)key; //解密 @end
// // NSData+AES.h // Smile // // Created by 蒲晓涛 on 12-11-24. // Copyright (c) 2012年 BOX. All rights reserved. // // 版权属于原作者 // http://code4app.com (cn) http://code4app.net (en) // 发布代码于最专业的源码分享网站: Code4App.com #import "NSData+AES.h" #import <CommonCrypto/CommonCryptor.h> #define gIv @"205681D89D731A8F" //可以自行修改 @implementation NSData (Encryption) //(key和iv向量这里是16位的) 这里是CBC加密模式,安全性更高 - (NSData *)AES128EncryptWithKey:(NSString *)key {//加密 char keyPtr[kCCKeySizeAES128+1]; bzero(keyPtr, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCKeySizeAES128+1]; memset(ivPtr, 0, sizeof(ivPtr)); [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesEncrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCBlockSizeAES128, ivPtr, [self bytes], dataLength, buffer, bufferSize, &numBytesEncrypted); if (cryptStatus == kCCSuccess) { return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; } free(buffer); return nil; } - (NSData *)AES128DecryptWithKey:(NSString *)key {//解密 char keyPtr[kCCKeySizeAES128+1]; bzero(keyPtr, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCKeySizeAES128+1]; memset(ivPtr, 0, sizeof(ivPtr)); [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesDecrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCBlockSizeAES128, ivPtr, [self bytes], dataLength, buffer, bufferSize, &numBytesDecrypted); if (cryptStatus == kCCSuccess) { return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; } free(buffer); return nil; } @end
// // SecurityUtil.h // Smile // // Created by 蒲晓涛 on 12-11-24. // Copyright (c) 2012年 BOX. All rights reserved. // // 版权属于原作者 // http://code4app.com (cn) http://code4app.net (en) // 发布代码于最专业的源码分享网站: Code4App.com #import <Foundation/Foundation.h> @interface SecurityUtil : NSObject #pragma mark - base64 + (NSString*)encodeBase64String:(NSString *)input; + (NSString*)decodeBase64String:(NSString *)input; + (NSString*)encodeBase64Data:(NSData *)data; + (NSString*)decodeBase64Data:(NSData *)data; #pragma mark - AES加密 //将string转成带密码的data //加密后16进制输出 +(NSString*)encryptAESDataToHexString:(NSString*)string app_key:(NSString*)key ; //加密后base64输出 +(NSString*)encryptAESDataToBase64:(NSString*)string app_key:(NSString*)key; //将带密码的data转成string //解密base64 +(NSString*)decryptAESStringFromBase64:(NSString *)string app_key:(NSString*)key; //解密16进制 +(NSString*)decryptAESStringFromHexString:(NSString *)string app_key:(NSString*)key; @end
// // SecurityUtil.h // Smile // // Created by 蒲晓涛 on 12-11-24. // Copyright (c) 2012年 BOX. All rights reserved. // // 版权属于原作者 // http://code4app.com (cn) http://code4app.net (en) // 发布代码于最专业的源码分享网站: Code4App.com #import "SecurityUtil.h" #import "GTMBase64.h" #import "NSData+AES.h" #define C2I(c) ((c >= '0' && c<='9') ? (c-'0') : ((c >= 'a' && c <= 'z') ? (c - 'a' + 10): ((c >= 'A' && c <= 'Z')?(c - 'A' + 10):(-1)))) @implementation SecurityUtil #pragma mark - base64 + (NSString*)encodeBase64String:(NSString * )input { NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; data = [GTMBase64 encodeData:data]; NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; return base64String; } + (NSString*)decodeBase64String:(NSString * )input { NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; data = [GTMBase64 decodeData:data]; NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; return base64String; } + (NSString*)encodeBase64Data:(NSData *)data { data = [GTMBase64 encodeData:data]; NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; return base64String; } + (NSString*)decodeBase64Data:(NSData *)data { data = [GTMBase64 decodeData:data]; NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; return base64String; } #pragma mark - AES加密 //将string转成带密码的data +(NSString*)encryptAESDataToHexString:(NSString*)string app_key:(NSString*)key { //将nsstring转化为nsdata NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; NSData *encryptedData = [data AES128EncryptWithKey:key]; Byte *bytes = (Byte *)[encryptedData bytes]; NSLog(@"%@", encryptedData); //下面是Byte 转换为16进制。 NSString *hexStr=@""; for(int i=0;i<[encryptedData length];i++) { NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数 if([newHexStr length]==1) hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr]; else hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr]; } NSLog(@"%@", hexStr); NSLog(@"%@", hexStr.uppercaseString); return hexStr.uppercaseString; } +(NSString*)encryptAESDataToBase64:(NSString*)string app_key:(NSString*)key { //将nsstring转化为nsdata NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; NSData *encryptedData = [data AES128EncryptWithKey:key]; Byte *bytes = (Byte *)[encryptedData bytes]; NSLog(@"%@", encryptedData); NSLog(@"加密后的字符串 :%@",[encryptedData base64Encoding]); return [encryptedData base64Encoding]; } #pragma mark - 转16进制 -(NSString *)hexStringFromData:(NSData *)data{ Byte *bytes = (Byte *)[data bytes]; //下面是Byte 转换为16进制。 NSString *hexStr=@""; for(int i=0;i<[data length];i++) { NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数 if([newHexStr length]==1) hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr]; else hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr]; } return hexStr; } #pragma mark - 16进制转data -(NSData *)convert:(NSString *)str { const char* cs = str.UTF8String; int count = strlen(cs); int8_t bytes[count / 2]; for(int i = 0; i<count; i+=2) { char c1 = *(cs + i); char c2 = *(cs + i + 1); if(C2I(c1) >= 0 && C2I(c2) >= 0){ bytes[i / 2] = C2I(c1) * 16 + C2I(c2); }else{ return nil; } } return [NSData dataWithBytes:bytes length:count / 2]; } #pragma mark - AES解密 //将带密码的data转成string +(NSString*)decryptAESStringFromBase64:(NSString *)string app_key:(NSString*)key { NSData *EncryptData = [GTMBase64 decodeString:string]; //解密前进行GTMBase64编码 //使用密码对data进行解密 NSData *decryData = [EncryptData AES128DecryptWithKey:key]; //将解了密码的nsdata转化为nsstring NSString *str = [[NSString alloc] initWithData:decryData encoding:NSUTF8StringEncoding]; return str; } //-------------------------------------------------------- +(NSString*)decryptAESStringFromHexString:(NSString *)string app_key:(NSString*)key { //16进制转data const char* cs = string.UTF8String; int count = strlen(cs); int8_t bytes[count / 2]; for(int i = 0; i<count; i+=2) { char c1 = *(cs + i); char c2 = *(cs + i + 1); if(C2I(c1) >= 0 && C2I(c2) >= 0){ bytes[i / 2] = C2I(c1) * 16 + C2I(c2); }else{ return nil; } } NSData * newData = [NSData dataWithBytes:bytes length:count / 2]; NSLog(@"%@", newData); //NSData *EncryptData = [GTMBase64 decodeString:string]; //解密前进行GTMBase64编码 //使用密码对data进行解密 NSData *decryData = [newData AES128DecryptWithKey:key]; //将解了密码的nsdata转化为nsstring NSString *str = [[NSString alloc] initWithData:decryData encoding:NSUTF8StringEncoding]; return str; } @end