Skip to content

Instantly share code, notes, and snippets.

@leeprobert
Forked from matsuda/NSData+AES.h
Created April 19, 2016 16:02

Revisions

  1. Kosuke Matsuda created this gist Feb 25, 2014.
    13 changes: 13 additions & 0 deletions NSData+AES.h
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,13 @@
    /**
    http://mythosil.hatenablog.com/entry/20111017/1318873155
    http://blog.dealforest.net/2012/03/ios-android-per-aes-crypt-connection/
    */

    @interface NSData (AES)

    - (NSData *)AES128EncryptedDataWithKey:(NSString *)key;
    - (NSData *)AES128DecryptedDataWithKey:(NSString *)key;
    - (NSData *)AES128EncryptedDataWithKey:(NSString *)key iv:(NSString *)iv;
    - (NSData *)AES128DecryptedDataWithKey:(NSString *)key iv:(NSString *)iv;

    @end
    61 changes: 61 additions & 0 deletions NSData+AES.m
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,61 @@
    #import "NSData+AES.h"
    #import <CommonCrypto/CommonCryptor.h>

    @implementation NSData (AES)

    - (NSData *)AES128EncryptedDataWithKey:(NSString *)key
    {
    return [self AES128EncryptedDataWithKey:key iv:nil];
    }

    - (NSData *)AES128DecryptedDataWithKey:(NSString *)key
    {
    return [self AES128DecryptedDataWithKey:key iv:nil];
    }

    - (NSData *)AES128EncryptedDataWithKey:(NSString *)key iv:(NSString *)iv
    {
    return [self AES128Operation:kCCEncrypt key:key iv:iv];
    }

    - (NSData *)AES128DecryptedDataWithKey:(NSString *)key iv:(NSString *)iv
    {
    return [self AES128Operation:kCCDecrypt key:key iv:iv];
    }

    - (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv
    {
    char keyPtr[kCCKeySizeAES128 + 1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    char ivPtr[kCCBlockSizeAES128 + 1];
    bzero(ivPtr, sizeof(ivPtr));
    if (iv) {
    [iv 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(operation,
    kCCAlgorithmAES128,
    kCCOptionPKCS7Padding | kCCOptionECBMode,
    keyPtr,
    kCCBlockSizeAES128,
    ivPtr,
    [self bytes],
    dataLength,
    buffer,
    bufferSize,
    &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
    return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }
    free(buffer);
    return nil;
    }

    @end