iOS 加、解密


对称密钥加密

对称加密相对好理解,加密方和解密方使用的是同一个密钥。
常见的对称密钥加密有AES、DES 等。


MD5

MD5是一个哈希算法,对同一个明文生成的密文(哈希值)是统一的。MD5相较于普通加密来说还有一个优点:MD5生成的密文长度很短(16位或者32位字符)。全称MD5消息摘要算法(MD5 Message-Digest Algorithm)。

非对称密钥加密

非对称密钥加密,又称为公开密钥加密。
非对称密钥加密需要两个密钥,一个是公开密钥,一个是私有密钥。私有密钥用来加密,公开密钥用来解密。私有密钥由加密方保管,公有密钥则公布出来。
实际上,私有密钥和共有密钥在数学上是有一定的关系的。但是仅仅从共有密钥是推断不出私有密钥的,这也是共有密钥可以公布出来的原因。
通过共有密钥推断私有密钥和质数分解有关。目前质数分解没有特别快的算法,通常是通过暴力枚举的方法来分解。当质数非常大时(如2的1024次方级别),暴力分解质数是不现实的,因此非对称加密是安全的。
非对称加密的安全还依赖于加密方对私钥的管理,一旦私钥暴露,也就毫无加密可言。
常见的非对称加密有RSA、DSA。


数字签名

数字签名用的是非对称加密,公开密钥在数据接收方,数字签名的作用是保证:

  1. 保证数据没有没有被篡改过
  2. 保证数据是经过我认证的
数字签名的过程:非对称加密+MD5线性加密
  1. 首先算出原始数据的摘要。这里的算法要保证:如果原始数据有任何变化,则摘要也会发生变化;对同一份原始数据,使用相同的算法,计算出的摘要是相同的。这一步使用的算法通常是MD5消息摘要算法。
  2. 生成一对公钥和私钥,使用非对称加密方式,用私钥对上一步生成的摘要进行加密,加密的结果就是数字签名。
  3. 在返回数据时,将原始数据和数字签名一起返回给请求数据方。

接到数据之后就行验证数据的完整性:


请求数据方在接收到数据处理过程
  1. 首先用含有的公钥对数字签名进行解密,如果能够解密成功,说明返回的数据是经过数据发送方认证的(否则数据发送方不会对该数据加密)。
  2. 对原始的数据使用MD5算法,生成原始数据的摘要。
  3. 对比第一步和第二步生成的摘要,如果生成的摘要相等,说明原始数据没有被篡改过。
    由此,通过数字签名可以达到确保数据没有被篡改过以及数据是合法的目的。

DES加解密

这里使用框架提供的des加解密库:
首先引入头文件 #import CommonCrypto/CommonCryptor.h
主要的加解密函数如下:

/*字符串加密

*参数

*plainText : 加密明文

*key        : 密钥 64位

*/

+ (NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key

{

NSString *ciphertext = nil;

const char *textBytes = [plainText UTF8String];

NSUInteger dataLength = [plainText length];

unsigned char buffer[1024];

memset(buffer, 0, sizeof(char));

Byte iv[] = {1,2,3,4,5,6,7,8};

size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,

kCCOptionPKCS7Padding,

[key UTF8String], kCCKeySizeDES,

iv,

textBytes, dataLength,

buffer, 1024,

&numBytesEncrypted);

if (cryptStatus == kCCSuccess) {

NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];

ciphertext = [[[NSString alloc] initWithData:[GTMBase64 encodeData:data] encoding:NSUTF8StringEncoding] autorelease];

}

return ciphertext;

}

//解密

+ (NSString *) decryptUseDES:(NSString*)cipherText key:(NSString*)key

{

NSData* cipherData = [GTMBase64 decodeString:cipherText];

unsigned char buffer[1024];

memset(buffer, 0, sizeof(char));

size_t numBytesDecrypted = 0;

Byte iv[] = {1,2,3,4,5,6,7,8};

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,

kCCAlgorithmDES,

kCCOptionPKCS7Padding,

[key UTF8String],

kCCKeySizeDES,

iv,

[cipherData bytes],

[cipherData length],

buffer,

1024,

&numBytesDecrypted);

NSString* plainText = nil;

if (cryptStatus == kCCSuccess) {

NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];

plainText = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];

}

return plainText;

}

MD5加密

MD5加密是不可逆的

MD5实现方法(16位):

+ (NSString *)md5:(NSString *)str

{

constchar *concat_str = [strUTF8String];

unsignedchar result[CC_MD5_DIGEST_LENGTH];

CC_MD5(concat_str, (unsignedint)strlen(concat_str), result);

NSMutableString *hash = [NSMutableStringstring];

for (int i =0; i <16; i++){

[hashappendFormat:@"%02X", result[i]];

}

return [hashuppercaseString];

}

AES加密

对称加密,密钥key
常用的,详解:

h文件内容:

#import

@class NSString;

@interface NSData (Encryption)

- (NSData *)AESOverCycle:(NSString *)key; //加密

- (NSData *)AESRelaes:(NSString *)key; //解密

@end

m文件内容:

加密:

@implementation NSData (Encryption)

- (NSData *)AESOverCycle:(NSString *)key {

char keyPtr[kCCKeySizeAES256+1];

bzero(keyPtr, sizeof(keyPtr));

[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, kCCBlockSizeAES128,

NULL,

[self bytes], dataLength,

buffer, bufferSize,

&numBytesEncrypted);

if (cryptStatus == kCCSuccess) {

return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];

}

free(buffer);

return nil;

}

解密:

- (NSData *)AESRelaes:(NSString *)key {

char keyPtr[kCCKeySizeAES256+1];

bzero(keyPtr, sizeof(keyPtr));

[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, kCCBlockSizeAES128,

NULL,

[self bytes], dataLength,

buffer, bufferSize,

&numBytesDecrypted);

if (cryptStatus == kCCSuccess) {

return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

}

free(buffer);

return nil;

}

@end

Base64编码与解码

Base64编码是6个二进制位一编码, ASCII码是8个二进制位一编码,所以转换成字符串后会比ASCII内容要多。其使用64个字符来对任意数据进行编码。
Base64编码本质上是一种将二进制数据转成文本数据的方案。对于非二进制数据,是先将其转换成二进制形式,然后每连续6比特(2的6次方=64)计算其十进制值,根据该值在上面的索引表中找到对应的字符,最终得到一个文本字符串。
Base64是一个可逆过程,不能用作数据加密操作。

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

推荐阅读更多精彩内容