iOS 加密算法有那么几种,如 md5,sha1,AES,base64 和 rsa 等。

1. md5:

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。(引用自百度百科)

MD5加密目前来说是不可逆的,只能用作一些检验过程,不能恢复其原文。

MD5算法产生的是固定的128bit,即128个0和1的二进制位,而在实际应用开发中,通常是以16进制输出的,所以正好就是32位的16进制数,说白了也就是32个16进制的数字。

需要引入头文件:

#import <CommonCrypto/CommonDigest.h>

#define CC_MD5_DIGEST_LENGTH    16          /* digest length in bytes */
- (NSString *)md5:(NSDictionary *)paramsDict {
NSString *inString = [paramsDict stringValueForKey:@"data" defaultValue:@""];
if (inString.length <= ) {
return @"";
} else {
const char *cStrValue = [inString UTF8String];
//开辟一个16字节(128位:md5加密出来就是128位/bit)的空间(一个字节=8字位=8个二进制数)
unsigned char outResult[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStrValue, strlen(cStrValue), outResult); //x表示十六进制,X 意思是不足两位将用0补齐,如果多余两位则不影响
NSString *outString =
[NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
outResult[], outResult[], outResult[], outResult[],
outResult[], outResult[], outResult[], outResult[],
outResult[], outResult[], outResult[], outResult[],
outResult[], outResult[], outResult[], outResult[]];
/*
//方法二:
NSMutableString *outString = [NSMutableString string];
for (int i = 0; i < 16; i++) {
[outString appendFormat:@"X", outResult[i]];
}
*/
return outString;
}
}

为什么是[16]呢,这是因为MD5算法最后生成的是128位,而在计算机的最小存储单位为字节,1个字节是8位,对应一个char类型,计算可得需要16个char。所以result是[16]。那么为什么输出的格式一定是%02x呢,而不是其它呢。这也是有原因的:因为约定MD5一般是以16进制的格式输出,那么其实这个问题就转换为把128个0和1以16进制来表示,每4位二进制对应一个16进制的元素,则需要32个16进制的元素,如果元素全部为0,放到char的数组中,正常是不会输出,如00001111,以%x输出,则是f,那么就会丢失0;但如果以%02x表示则输出结果是0f,正好是转换的正确结果。

2. sha1 加密

SHA1 算法一样不可逆。

- (NSString *) sha1:(NSString *)input
{
const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:input.length]; //#define CC_SHA1_DIGEST_LENGTH 20 /* digest length in bytes */
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, data.length, digest); NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * ];
for(int i=; i<CC_SHA1_DIGEST_LENGTH; i++) {
[output appendFormat:@"%02x", digest[i]];
}
return output;
}

3. AES 加密

高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法。

需要注意的是,AES并不能作为HASH算法,加密并解密后的结果,并不一定与原文相同,使用时请注意进行结果验算。例如解密原文的长度,格式规则等。

需要引入头文件

#import <CommonCrypto/CommonCryptor.h>

加密和解密方法使用的参数密钥可以均为32位长度的字符串,可以将任意的字符串经过md5计算32位字符串作为密钥,也可以自定义如:

#define APP_PUBLIC_PASSWORD     @"boundary"

- (NSData *)AES256EncryptWithKey:(NSString *)key  withString:(NSString *) inputString { //加密
NSData *inData = [inString dataUsingEncoding:NSUTF8StringEncoding];
/***
//如果希望返回字符串,在开始时就开始对 NSData 做转换, 对应下面方法三,方法一和二使用上面语句即可
const char *cstr = [inString cStringUsingEncoding:NSUTF8StringEncoding];
NSData *inData = [NSData dataWithBytes:cstr length:inString.length];
***/
char keyPtr[kCCKeySizeAES256+];
bzero(keyPtr, sizeof(keyPtr));
[APP_PUBLIC_PASSWORD getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [inData length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = ;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr, kCCBlockSizeAES128,
NULL,
[inData bytes],
dataLength,
buffer, bufferSize,
&numBytesEncrypted); if (cryptStatus == kCCSuccess) {
NSData *outData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
return outData; /***
//如果需要返回 NSString 类型的结果,这里需要进行转换:
// 方法一:
NSString *outString = [[NSString alloc]initWithData:outData encoding:NSUTF8StringEncoding];
//失败,注意:这里 outString 为 nil,具体原因貌似是因为 NSData 内容含有非encoding编码的字符 // 方法二:
NSString *outString = [outData base64Encoding]; // 方法三:(转换为2进制字符串)
if (outData && outData.length > 0) {
Byte *datas = (Byte*)[outData bytes];
NSMutableString *outString = [NSMutableString stringWithCapacity:outData.length * 2];
for(int i = 0; i < outData.length; i++){
[outString appendFormat:@"%02x", datas[i]];
}

***/
}
free(buffer);
return nil;
//解密可以直接使用加密得到的结果 NSData, 这样将很容易,不必进行字符转换
- (NSData *)AES256DecryptWithKey:(NSString *)key withNSData:(NSString *)inData {//解密 /***
- (NSData *)AES256DecryptWithKey:(NSString *)key withString:(NSString *)inputString {//解密
//对应加密算法中的方法二:(解密前进行GTMBase64编码)
NSData *inData = [GTMBase64 decodeString:inString];
//对应加密算法中的方法三:
NSMutableData *inData = [NSMutableData dataWithCapacity:inString.length / 2];
unsigned char whole_byte;
char byte_chars[3] = {'\0','\0','\0'};
int i;
for (i=0; i < [inString length] / 2; i++) {
byte_chars[0] = [inString characterAtIndex:i*2];
byte_chars[1] = [inString characterAtIndex:i*2+1];
whole_byte = strtol(byte_chars, NULL, 16);
[inData appendBytes:&whole_byte length:1];
}
***/ char keyPtr[kCCKeySizeAES256+];
bzero(keyPtr, sizeof(keyPtr));
//使用 "key": #define APP_PUBLIC_PASSWORD @"boundary"
[APP_PUBLIC_PASSWORD getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [inData length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = ;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr, kCCBlockSizeAES128,
NULL,
[inData bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted); if (cryptStatus == kCCSuccess) {
NSData *outData = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
return outData;
/***
//若需返回 NSString,需要上面加密算法和解密算法的各个方法对应好,使用下列语句才不会返回 nil; 切记 dataLength 一定匹配好
NSString *outString = [[NSString alloc]initWithData:outData encoding:NSUTF8StringEncoding];
***/
}
free(buffer);
return nil;

4. base 64 加密算法

下载库 GTMBase64

实例demo:

http://up.2cto.com/2012/1215/20121215123257741.zip

关于 iOS 加密的一些详谈的更多相关文章

  1. RSA非对称加密,使用OpenSSL生成证书,iOS加密,java解密

    最近换了一份工作,工作了大概一个多月了吧.差不多得有两个月没有更新博客了吧.在新公司自己写了一个iOS的比较通用的可以架构一个中型应用的不算是框架的一个结构,并已经投入使用.哈哈 说说文章标题的相关的 ...

  2. iOS - Safe iOS 加密安全

    1.Base64 编码 简介: Base64 是一种基于64个可打印字符来表示二进制数据的表示方法,可打印字符包括字母 A-Z.a-z.0-9,共 62 个字符,另外两个符号在不同的系统不同 +,/. ...

  3. 关于CBC for ios 加密要记

    倒腾了接近半天,资料找了无数,最后是通过查看Android项目中的加密工具类,才弄明白,在这过程中掌握了一些知识点.比如: 问题1:关于PKCS7Padding和PKCS5Padding iOS中AE ...

  4. ios 加密解密工具类字符判断等

    #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface Helpers : NSObject ...

  5. ios 加密解密(包括base64,DES)非原创

    .h文件 #import <Foundation/Foundation.h> /******字符串转base64(包括DES加密)******/ #define __BASE64( tex ...

  6. iOS加密之AES

    心急的童鞋直接看这里Demo 运行之后可以去在线加密网站验证 AES(Advanced Encryption Standard)高级加密标准,又称Rijndael加密法,是美国联邦政府采用的一种区块加 ...

  7. iOS加密方式及解压缩文件

    Base64加密方式 Base64是一种加密方法,可逆的加密. Base64中的可打印字符包括字母A-Z.a-z.数字0-9,这样共有62个字符./ + 填充 = echo -n BC|base64 ...

  8. iOS加密个人见解

    说说常用的加密方式 1.单向加密,譬如 md5 .SHA 但是这种单向加密安全性也不高了,现在cpu.gpu都那么强大,运算速度很快,彩虹表 撞库 还是容易被攻破的. 如果非得用的话,可以md5加盐, ...

  9. ios 加密

    0728 加密 MD5加密 可解 因为有MD5库 但是可以通过 加盐(也就是拼接字符串  在进行加密)的方法进行加密这样在解得时候就不会那么容易 也可以使用时间戳 进行加盐 加密 时间戳 可只用到分钟 ...

随机推荐

  1. Android开发自学笔记(Android Studio)—4.1布局组件

    一.引言 Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.在Android4.0之前,我们通常说 ...

  2. 【深度分享】千团大战:看今天商业WiFi乱局及其破解之道

    不知道还有没有人记得起始于2010年的千团大战.从2010年初开始,第一家团购网站上线以来,到2011年底,团购网站的数量超过了5000家.当时就有很多媒体预言,2013年,团购的泡沫就将褪去,将有9 ...

  3. CSS选定第k个元素

    <!DOCTYPE html> <html> <head> <title></title> <style type="tex ...

  4. 自定义ViewGroup初步探究

    由于项目需要,实现类似于地图控件,能够让一张图标自由缩放并且在其上固定位置,标记一些地点,所以在这里,我考虑了一下,决定使用自定义ViewGroup来实现.

  5. RabbitMQ 消息确认机制

    消息确认机制 在之前异常处理部分就已经写了,对于consumer的异常退出导致消息丢失,可以时候consumer的消息确认机制.重复的就不说了,这里说一些不一样的. consumer的消息确认机制 当 ...

  6. VS2013单元测试 的安装、创建与执行

    1.要运行 vs2013单元测试 ,那么打开VS2013,选择工具-扩展和更新,搜索并安装Unit Test Generator. 如果不安装是不会出现Generate Unit Test的选项的,也 ...

  7. K米点歌APP评测

    K米APP评测 产品简介 K米点歌是一款免费的社交K歌手机应用,其手机点歌功能主要在KTV.夜总会,酒吧等K歌场所中使用,当前提供iPhone版本及安卓版本下载使用.——百度百科 评测版本 K米点歌4 ...

  8. ElasticSearch-5.0.0安装中文分词插件IK

    Install IK 源码地址:https://github.com/medcl/elasticsearch-analysis-ik,git clone下来. 1.compile mvn packag ...

  9. Html中<a>标签的样式的设置

    html中<a>标签的样式的设置.. ------------------------ <html> <head> <title>这是网页选项卡的名称& ...

  10. Windows XP系统下添加任务计划常出现问题解决办法

    Windows XP系统下添加任务计划常出现问题解决办法 计划任务就是让电脑在指定的时间内执行指定的动作(计划动作),这些动作可以是一个程序,也可以是一个批处理,但是至少是可以运行的(通俗一些就是双击 ...