【安全篇】iOS中使用AES 256对称加密

AES(The Advanced Encryption Standard)

AES是美国国家标准与技术研究所用于加密电子数据的规范。它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法

AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据 的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。

目前在商业App中使用的最多的是RSA与AES加密方式,两种加密各种所长,所幸目前都有接触过。

iOS中的使用

新建MySecurity类,继承于NSObject

.h文件
<pre><code class='Xcode'>

import <Foundation/Foundation.h>

@interface MySecurity : NSObject

pragma mark -根据密匙初始化

-(instancetype) initWithKey:(NSString *) key;

pragma mark -加密

-(NSString *) AES256EncryptWithString:(NSString *) str;

pragma mark -解密

-(NSString *) AES256DecryptWithString:(NSString *) str;

pragma mark -获取安全密匙

+(NSString*) getSecurityKey;

@end
</code></pre>
.m文件
<pre><code class='Xcode'>

import "MySecurity.h"

import "NSData+AES256.h"

import "NSString+MD5.h"

@interface MySecurity ()
@property(strong,nonatomic) NSString *key;

@end

@implementation MySecurity

pragma mark -获取安全钥匙

+(NSString*) getSecurityKey
{
return @"加密的密匙";
}

pragma mark -更加密码密匙初始化

-(instancetype) initWithKey:(NSString *) key
{
self = [super init];
if (self)
{
self.key = key;
}
return self;
}

pragma mark -加密

-(NSString *) AES256EncryptWithString:(NSString *) str
{
NSData *dt1 = [str dataUsingEncoding:NSUTF8StringEncoding];

NSData *dt2 = [dt1 AES256EncryptWithKey:[self.key MD5]];

 NSString *str2 = [dt2 base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
return str2;

}

pragma mark -解密

-(NSString *) AES256DecryptWithString:(NSString *) str
{
NSData *dt3 = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];

NSData *dt4 = [dt3 AES256DecryptWithKey:[self.key MD5]];

NSString *str4 = [[NSString alloc] initWithData:dt4 encoding:NSUTF8StringEncoding];
return str4;

}

@end
</code></pre>

需要用到的NSData+AES256分类与NSString+MD5分类

<pre><code class='Xcode'>

//---------------NSData (AES256)头文件------------

import <Foundation/Foundation.h>

@interface NSData (AES256)

/*
加密
(NSString*)key 32位秘钥
返回加密后的 NSData
*/

  • (NSData)AES256EncryptWithKey:(NSString)key ;

/*
解密
(NSString*)key 32位秘钥
返回解密后的 NSData
*/

  • (NSData)AES256DecryptWithKey:(NSString)key ;

@end

//---------------NSData (AES256)实现文件------------

import "NSData+AES256.h"

import <CommonCrypto/CommonCryptor.h>

@implementation NSData (AES256)

  • (NSData)AES256EncryptWithKey:(NSString)key {

    char keyPtr[kCCKeySizeAES256 +1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void* buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
    kCCAlgorithmAES128,
    kCCOptionPKCS7Padding|kCCOptionECBMode,
    keyPtr,
    kCCKeySizeAES256,
    NULL /* initialization vector (optional) /,
    [self bytes],
    dataLength, /
    input /
    buffer,
    bufferSize, /
    output */
    &numBytesEncrypted);

if (cryptStatus == kCCSuccess) {
    return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}

free(buffer);
return nil;

}

  • (NSData)AES256DecryptWithKey:(NSString)key {

    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];

size_t bufferSize           = dataLength + kCCBlockSizeAES128;
void* buffer                = malloc(bufferSize);

size_t numBytesDecrypted    = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                      kCCAlgorithmAES128,
                                      kCCOptionPKCS7Padding|kCCOptionECBMode,
                                      keyPtr,
                                      kCCKeySizeAES256,
                                      NULL /* initialization vector (optional) */,
                                      [self bytes],
                                      dataLength, /* input */
                                      buffer,
                                      bufferSize, /* output */
                                      &numBytesDecrypted);

if (cryptStatus == kCCSuccess) {
    return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}

free(buffer); //free the buffer;
return nil;

}

@end

//---------------NSString (MD5)头文件------------

import <Foundation/Foundation.h>

@interface NSString (MD5)
/*
获取字符串的MD5值
返回32位MD5值
/
-(NSString
) MD5;

@end

//---------------NSString (MD5)实现文件------------

import "NSString+MD5.h"

import <CommonCrypto/CommonDigest.h>

@implementation NSString (MD5)

pragma mark -MD5加密

-(NSString*) MD5
{
const char * cStrValue = [self UTF8String];
unsigned char theResult[CC_MD5_DIGEST_LENGTH];

CC_MD5(cStrValue, (CC_LONG)strlen(cStrValue), theResult);
return [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
        theResult[0], theResult[1], theResult[2], theResult[3],
        theResult[4], theResult[5], theResult[6], theResult[7],
        theResult[8], theResult[9], theResult[10], theResult[11],
        theResult[12], theResult[13], theResult[14], theResult[15]];

}

@end
</code></pre>

使用

<pre><code class='Xcode'>
//初始化对象
MySecurity *security = [[MySecurity alloc] initWithKey:[MySecurity getSecurityKey]];
//加密
NSString * str1 = [security AES256EncryptWithString:@"要加密的内容"];

//解密
NSString * str2 = [security AES256DecryptWithString:@"要解密的内容"];

</code></pre>


总的来说,使用还是很简单的,希望能帮助到大家。

end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容