美文网首页
iOS对NSDataAES-256加密

iOS对NSDataAES-256加密

作者: 知本集 | 来源:发表于2017-05-18 10:24 被阅读108次

<h1>Question:</h1>

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

<h1>Show my code:</h1>

NSData+Encryption.h:

<pre>

import@interface NSData (Encryption)

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

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

@end

</pre>

NSData+Encryption.m:
<pre>

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

    }
    </pre>
    <pre>

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

}
</pre>

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

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

相关文章

网友评论

      本文标题:iOS对NSDataAES-256加密

      本文链接:https://www.haomeiwen.com/subject/xlfsxxtx.html