iOS AES的加密解密
主要是要得到加密後的原來的字元創,MD5無法得到原有的,只能用AES+base64
要用GTMBase64這個可以自己去下載,
主要看另外2個類檔案,
#import @class NSString;@interface NSData (NSData_AES)- (NSData *)AES128EncryptWithKey:(NSString *)key; //加密- (NSData *)AES128DecryptWithKey:(NSString *)key; //解密@end
#import "NSData+NSData_AES.h"#import #define gIv @"xxxxxxxxxxx" //可以自行定義16位@implementation NSData (NSData_AES)//(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
#import @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+ (NSString*)encryptAESData:(NSString*)string app_key:(NSString*)key ;//將帶密碼的data轉成string+(NSString*)decryptAESData:(NSData*)data app_key:(NSString*)key ;@end
#import "SecurityUtil.h"#import "GTMBase64.h"#import "NSData+AES.h"@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] autorelease]; 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] autorelease]; return base64String;} + (NSString*)encodeBase64Data:(NSData *)data {data = [GTMBase64 encodeData:data]; NSString *base64String = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];return base64String;}+ (NSString*)decodeBase64Data:(NSData *)data {data = [GTMBase64 decodeData:data]; NSString *base64String = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];return base64String;}#pragma mark - AES加密//將string轉成帶密碼的data+(NSString*)encryptAESData:(NSString*)string app_key:(NSString*)key{ //將nsstring轉化為nsdata NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; //使用密碼對nsdata進行加密 NSData *encryptedData = [data AES128EncryptWithKey:key]; NSLog(@"加密後的字串 :%@",[encryptedData base64Encoding]); return [encryptedData base64Encoding];}#pragma mark - AES解密//將帶密碼的data轉成string+(NSString*)decryptAESData:(NSData*)data app_key:(NSString*)key{ //使用密碼對data進行解密 NSData *decryData = [data AES128DecryptWithKey:key]; //將解了密碼的nsdata轉化為nsstring NSString *str = [[NSString alloc] initWithData:decryData encoding:NSUTF8StringEncoding]; NSLog(@"解密後的字串 :%@",str); return [str autorelease];}@end
具體的使用方法如下:
加密:
[SecurityUtilencryptAESData:@"XXXXXX" app_key:KEY]; 這裡的是可以自己設定一個16位的字串
解密:
NSData *EncryptData1 = [GTMBase64decodeString:[SecurityUtil encryptAESData:@"XXXXXX" app_key:KEY]];//解密前進行GTMBase64編碼
NSString * string1 = [SecurityUtildecryptAESData:EncryptData1app_key:KEY];