AES encryption and decryption for iPhone Development

Source: Internet
Author: User

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/

 

 

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.