NSData+AESTest
.h 代码:
.h 代码:
@interface NSData (AESTest)
- (NSData*)AES256EncryptWithKey:(NSString*)key;
- (NSData*)AES256DecryptWithKey:(NSString*)key;
@end
NSData+AESTest
.m 代码:
#import <CommonCrypto/CommonCryptor.h
#import
"NSData+ AESTest
.h"
@implementation NSData (AESAdditions)
- (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 [NSMutableData 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 [NSMutableData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer); //free the buffer;
return nil;
}
@end
测试代码
#import
"NSData+ AESTest
.h"
int main ( int argc , const char * argv []) {
NSAutoreleasePool * pool = [[ NSAutoreleasePool alloc ] init ];
NSString * key = @ "my password" ;
NSString * secret = @ "text to encrypt" ;
NSData * plain = [ secret dataUsingEncoding : NSUTF8StringEncoding ];
NSData * cipher = [ plain AES256EncryptWithKey : key ];
printf ( "%s/n" , [[ cipher description ] UTF8String ]);
plain = [ cipher AES256DecryptWithKey : key ];
printf ( "%s/n" , [[ plain description ] UTF8String ]);
printf ( "%s/n" , [[[ NSString alloc ] initWithData : plain encoding : NSUTF8StringEncoding ] UTF8String ]);
[ pool drain ];
return 0 ;
}
- ( NSData *) encryptString NSString *) plaintext withKey NSString *) key {
return [[ plaintext dataUsingEncoding : NSUTF8StringEncoding ] AES256EncryptWithKey : key ];
}
- ( NSString *) decryptData NSData *) ciphertext withKey NSString *) key {
return [[[ NSString alloc ] initWithData :[ ciphertext AES256DecryptWithKey : key ]
encoding : NSUTF8StringEncoding ] autorelease ];
}