Created
April 22, 2015 14:56
-
-
Save lifeisfoo/ad8d247303d0ea5b3b30 to your computer and use it in GitHub Desktop.
iOS AES-256 encryption
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import "NSData+Encryption.h" | |
#import <CommonCrypto/CommonCryptor.h> | |
@implementation NSData (Encryption) | |
- (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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment