关于 iOS 加密的一些详谈
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 加密的一些详谈的更多相关文章
- RSA非对称加密,使用OpenSSL生成证书,iOS加密,java解密
最近换了一份工作,工作了大概一个多月了吧.差不多得有两个月没有更新博客了吧.在新公司自己写了一个iOS的比较通用的可以架构一个中型应用的不算是框架的一个结构,并已经投入使用.哈哈 说说文章标题的相关的 ...
- iOS - Safe iOS 加密安全
1.Base64 编码 简介: Base64 是一种基于64个可打印字符来表示二进制数据的表示方法,可打印字符包括字母 A-Z.a-z.0-9,共 62 个字符,另外两个符号在不同的系统不同 +,/. ...
- 关于CBC for ios 加密要记
倒腾了接近半天,资料找了无数,最后是通过查看Android项目中的加密工具类,才弄明白,在这过程中掌握了一些知识点.比如: 问题1:关于PKCS7Padding和PKCS5Padding iOS中AE ...
- ios 加密解密工具类字符判断等
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface Helpers : NSObject ...
- ios 加密解密(包括base64,DES)非原创
.h文件 #import <Foundation/Foundation.h> /******字符串转base64(包括DES加密)******/ #define __BASE64( tex ...
- iOS加密之AES
心急的童鞋直接看这里Demo 运行之后可以去在线加密网站验证 AES(Advanced Encryption Standard)高级加密标准,又称Rijndael加密法,是美国联邦政府采用的一种区块加 ...
- iOS加密方式及解压缩文件
Base64加密方式 Base64是一种加密方法,可逆的加密. Base64中的可打印字符包括字母A-Z.a-z.数字0-9,这样共有62个字符./ + 填充 = echo -n BC|base64 ...
- iOS加密个人见解
说说常用的加密方式 1.单向加密,譬如 md5 .SHA 但是这种单向加密安全性也不高了,现在cpu.gpu都那么强大,运算速度很快,彩虹表 撞库 还是容易被攻破的. 如果非得用的话,可以md5加盐, ...
- ios 加密
0728 加密 MD5加密 可解 因为有MD5库 但是可以通过 加盐(也就是拼接字符串 在进行加密)的方法进行加密这样在解得时候就不会那么容易 也可以使用时间戳 进行加盐 加密 时间戳 可只用到分钟 ...
随机推荐
- CCS 6新建TMS320F2812工程
准备材料 CCS6 下载地址:http://www.ti.com/tool/ccstudio F2812的C语言头文件 下载地址:http://www.ti.com/lit/zip/sprc097 安 ...
- signalr-源码
1.一对一聊天 2.多对多 3.离线消息 1)群聊离线 2.1对一聊天离线 源码地址:https://github.com/aa1356889/SignalrCode 操作步骤 部署网站到iis 网上 ...
- bzoj4571: [Scoi2016]美味
4571: [Scoi2016]美味 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 275 Solved: 141 [Submit][Status][ ...
- Level Of Management Protocols - SNMP Tutorial
30.2 The Level Of Management Protocols Originally, many wide area networks included management proto ...
- easyUi 框架中的JS文件传递参数的区别
1.情景一 //JS文件 ajax的请求url : parent.baseUrl+"user/customer/findOne/" + id, //后台JAVA代码接收参数 @Re ...
- Math类
Math类:用于执行基本数学运算的方法 方法: public static int abs(int a):绝对值 public static double ceil(double a):向上取整 ...
- 文件夹锁定(Source)
文件夹锁定(Source)private void Lock(string folderPath){ try { string adminUserName = Environ ...
- 1、Jsp页面
一.JSP(java server page):是以Java语言为基础的动态网页生成技术. 1.特点: a).以 .jsp 为后缀的文本文件,不需要编译(相对于程序猿来说不需要编译) b).以html ...
- 与或左移右移操作在ARM寄存器配置中的作用
逻辑运算: 与运算&:与0清零 清零用与运算 或运算 |:或1置一 置一用或运算 异或 ^:不同为1 /*****单个寄存器清零置一*************************** ...
- [Hadoop] Hadoop学习笔记之Hadoop基础
1 Hadoop是什么? Google公司发表了两篇论文:一篇论文是“The Google File System”,介绍如何实现分布式地存储海量数据:另一篇论文是“Mapreduce:Simplif ...