Reference from: http://zhiwei.li/text/2011/07/iphone%E4%B8%8Aaes%E5%8A%A0%E5%AF%86%E7%9A%84%E5% AE %9E%E7%8E%B0/
Header file NSDataEncryption. h
# Import <UIKit/UIKit. h> @ interface NSData (AES256)-(NSData *) AES256EncryptWithKey :( NSString *) key; // encrypted-(NSData *) AES256DecryptWithKey :( NSString *) key; // decrypt @ end
NSDataEncryption. m
#import "NSDataEncryption.h"#import <CommonCrypto/CommonDigest.h>#import <CommonCrypto/CommonCryptor.h>#import <CommonCrypto/CommonHMAC.h>@implementation NSData (AES256)- (NSData *)AES256EncryptWithKey:(NSString *)key { // 'key' should be 32 bytes for AES256, will be null-padded otherwise char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) // fetch key data [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length]; //See the doc: For block ciphers, the output size will always be less than or //equal to the input size plus the size of one block. //That's why we need to add the size of one block here size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesEncrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, NULL /* initialization vector (optional) */, [self bytes], dataLength, /* input */ buffer, bufferSize, /* output */ &numBytesEncrypted); if (cryptStatus == kCCSuccess) { //the returned NSData takes ownership of the buffer and will free it on deallocation return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; } free(buffer); //free the buffer; return nil;}- (NSData *)AES256DecryptWithKey:(NSString *)key { // 'key' should be 32 bytes for AES256, will be null-padded otherwise char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused) bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) // fetch key data [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length]; //See the doc: For block ciphers, the output size will always be less than or //equal to the input size plus the size of one block. //That's why we need to add the size of one block here size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize); size_t numBytesDecrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, NULL /* initialization vector (optional) */, [self bytes], dataLength, /* input */ buffer, bufferSize, /* output */ &numBytesDecrypted); if (cryptStatus == kCCSuccess) { //the returned NSData takes ownership of the buffer and will free it on deallocation return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; } free(buffer); //free the buffer; return nil;}@end
Usage:
NSString * key = @ "my password"; // password NSString * secret = @ "text to encrypt "; // The text to be encrypted // The encryption process NSData * plain = [secret dataUsingEncoding: NSUTF8StringEncoding]; // convert NSString to NSData * cipher = [plain AES256EncryptWithKey: key]; // ASE encrypted password printf ("% s \ n", [[cipher description] UTF8String]); // output the AES encrypted content after secret passes the key // decryption process plain = [cipher AES256DecryptWithKey: key]; // decrypts printf ("% s \ n ", [[plain description] UTF8String]); printf ("% s \ n", [[NSString alloc] initWithData: plain encoding: NSUTF8StringEncoding] UTF8String]);
Open Source Project Reference: https://github.com/AlanQuatermain/aqtoolkit/tree/master/CommonCrypto/