iOS对NSDataAES-256加密

Question:

在对keychain数据存储的时候,常常需要用到aes加密对数据进行处理,但貌似iOS5.0之后就找不到nsdata下面的aes加密方法了,于是,我们给nsdata新建一个category来做加密处理。

Show my code:

NSData+Encryption.h:

import@interface NSData (Encryption)

  • (NSData *)AES256EncryptWithKey:(NSString *)key;

  • (NSData *)AES256DecryptWithKey:(NSString *)key;

@end

NSData+Encryption.m:

  • (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;

    }

    此时,NSData就可以找到对应的AES加密方法。

    参考链接:
    http://stackoverflow.com/questions/11482470/ios-5-data-encryption-aes-256-encryptwithkey-not-found

    你可能感兴趣的:(iOS对NSDataAES-256加密)