標籤:
原文:http://www.lidaren.com/archives/1470
進階加密標準(Advanced Encryption Standard,AES),又稱Rijndael加密法。 以下實現代碼中分別為NSData和NSString增加了一個Category。使用時直接調用即可。
需要注意的是,AES並不能作為HASH演算法,加密並解密後的結果,並不一定與原文相同,使用時請注意進行結果驗算。例如解密原文的長度,格式規則等。 NG執行個體原文:170987350密碼:170Objective-c的AES加密和解密演算法的具體實現代碼如下: 1.拓展NSData,增加AES256加密方法
1 // 2 //NSData+AES256.h 3 // 4 5 #import <Foundation/Foundation.h> 6 #import <CommonCrypto/CommonDigest.h> 7 #import <CommonCrypto/CommonCryptor.h> 8 9 @interface NSData(AES256) 10 -(NSData *) aes256_encrypt:(NSString *)key; 11 -(NSData *) aes256_decrypt:(NSString *)key; 12 @end 13 14 15 // 16 //NSData+AES256.m 17 // 18 #import "NSData+AES256.h" 19 20 @implementation NSData(AES256) 21 22 - (NSData *)aes256_encrypt:(NSString *)key //加密 23 { 24 char keyPtr[kCCKeySizeAES256+1]; 25 bzero(keyPtr, sizeof(keyPtr)); 26 [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 27 NSUInteger dataLength = [self length]; 28 size_t bufferSize = dataLength + kCCBlockSizeAES128; 29 void *buffer = malloc(bufferSize); 30 size_t numBytesEncrypted = 0; 31 CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, 32 kCCOptionPKCS7Padding | kCCOptionECBMode, 33 keyPtr, kCCBlockSizeAES128, 34 NULL, 35 [self bytes], dataLength, 36 buffer, bufferSize, 37 &numBytesEncrypted); 38 if (cryptStatus == kCCSuccess) { 39 return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 40 } 41 free(buffer); 42 return nil; 43 } 44 45 46 - (NSData *)aes256_decrypt:(NSString *)key //解密 47 { 48 char keyPtr[kCCKeySizeAES256+1]; 49 bzero(keyPtr, sizeof(keyPtr)); 50 [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 51 NSUInteger dataLength = [self length]; 52 size_t bufferSize = dataLength + kCCBlockSizeAES128; 53 void *buffer = malloc(bufferSize); 54 size_t numBytesDecrypted = 0; 55 CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 56 kCCOptionPKCS7Padding | kCCOptionECBMode, 57 keyPtr, kCCBlockSizeAES128, 58 NULL, 59 [self bytes], dataLength, 60 buffer, bufferSize, 61 &numBytesDecrypted); 62 if (cryptStatus == kCCSuccess) { 63 return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; 64 65 } 66 free(buffer); 67 return nil; 68 } 69 @end 70 2.拓展NSString,增加AES256加密方法,需要匯入NSData+AES256.h 71 72 73 // 74 //NSString +AES256.h 75 // 76 77 #import <Foundation/Foundation.h> 78 #import <CommonCrypto/CommonDigest.h> 79 #import <CommonCrypto/CommonCryptor.h> 80 81 #import "NSData+AES256.h" 82 83 @interface NSString(AES256) 84 85 -(NSString *) aes256_encrypt:(NSString *)key; 86 -(NSString *) aes256_decrypt:(NSString *)key; 87 88 @end 89 90 91 // 92 //NSString +AES256.h 93 // 94 95 @implementation NSString(AES256) 96 97 -(NSString *) aes256_encrypt:(NSString *)key 98 { 99 const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];100 NSData *data = [NSData dataWithBytes:cstr length:self.length];101 //對資料進行加密102 NSData *result = [data aes256_encrypt:key];103 104 //轉換為2進位字串105 if (result && result.length > 0) {106 107 Byte *datas = (Byte*)[result bytes];108 NSMutableString *output = [NSMutableString stringWithCapacity:result.length * 2];109 for(int i = 0; i < result.length; i++){110 [output appendFormat:@"%02x", datas[i]];111 }112 return output;113 }114 return nil;115 }116 117 -(NSString *) aes256_decrypt:(NSString *)key118 { 119 //轉換為2進位Data120 NSMutableData *data = [NSMutableData dataWithCapacity:self.length / 2];121 unsigned char whole_byte;122 char byte_chars[3] = {‘\0‘,‘\0‘,‘\0‘};123 int i;124 for (i=0; i < [self length] / 2; i++) {125 byte_chars[0] = [self characterAtIndex:i*2];126 byte_chars[1] = [self characterAtIndex:i*2+1];127 whole_byte = strtol(byte_chars, NULL, 16);128 [data appendBytes:&whole_byte length:1];129 }130 131 //對資料進行解密132 NSData* result = [data aes256_decrypt:key];133 if (result && result.length > 0) {134 return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];135 }136 return nil;137 }138 @end
iOS開發之Objective-c的AES加密和解密演算法的實現