变更记录
方案名称
数据加密 - AES 加密解密
关键字
数据加密 \ 加密 \ 解密 \ AES
需求场景
- 移动端与服务器敏感数据通讯加密需求
- 移动端本地部分需要保存的敏感数据(NSUserDefaults、文件或数据库)
参考链接
- GitHub - NSData+AES.h
- GitHub - RNCryptor/RNCryptor:RNCryptor是一个跨语言的AES加密/解密数据格式,最初针对Objective-C,现在已可以使用C、Java、PHP、Python以及Ruby语言。该数据格式包含AES加密所需的所有元数据,同时支持同步和异步读取加密文件,功能十分强大,并且还有详细的文档。
详细内容
代码实现如下
NSData+AES.h文件
1 2 3 4 5 6 7 8 9 10 11 12 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
|
NSData+AES.m文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 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
|
效果图
(无)
备注
这里AES在iOS加过密以后以nsdata的形式存下来,如果想以NSString形式存储,那么对NSData进行base64位编码。参考