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. poj-3264-Balanced Lineup

    poj   3264  Balanced Lineup link: http://poj.org/problem?id=3264 Balanced Lineup Time Limit: 5000MS ...

  2. 用机器名访问和用Localhost访问时在IE中的区别(备忘)

    meta中未指定文档模式的时候, localhost访问文档模式默认是Edge 机器名访问时文档模式默认是IE7 <head>中添加 <meta http-equiv="X ...

  3. TCP 三次握手四次挥手, ack 报文的大小.tcp和udp的不同之处、tcp如何保证可靠的、tcp滑动窗口解释

    一.TCP三次握手和四次挥手,ACK报文的大小 首先连接需要三次握手,释放连接需要四次挥手 然后看一下连接的具体请求: [注意]中断连接端可以是Client端,也可以是Server端. [注意] 在T ...

  4. linux dd 命令详解

    dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 名称: dd 使用权限: 所有使用者dd 这个指令在 manual 里的定义是 ...

  5. Asp.Net 自定义储存Session方式

    介绍 由于针对于自定义Session存储方式比较少,所以整理了使用自定义Session的方式.用于构建自定义会话存储提供程序代码,而不是使用默认的 SessionStore 介绍 背景 本文使用的是m ...

  6. 【原创】cs+html+js+css模式(六):改造ajax.js,从原来的原生态js修改为依赖于jquery插件

          由于原有的ajax可能在性能上,对于jquery的支持不够并且不够方便,开发人员使用的时候需要知道我们内部指定的后缀文件的设置,基于这个前提我们进行了js的改造 // 使用闭包开发插件 ( ...

  7. Ubuntu使用MyEclipse闪退的解决办法

    修改myeclipse.ini文件, -Xmx512m-XX:MaxPermSize=512m-XX:ReservedCodeCacheSize=256m-Dosgi.nls.warnings=ign ...

  8. Mongo运行错误:Failed to connect 127.0.0.1:27017,reason:errno:10061由于目标计算机积极拒绝,无法连接

    Mongo运行错误:如下 原因是mongodb的服务没有开启,开启服务后问题就能解决了,开启服务命令:mongod --dbpath "d:\mongodb\data 只要操作mongodb ...

  9. Ubuntu16.04/LinuxMint18安装openjdk-7-jdk

    LinuxMint18的安装源已经默认没有openjdk7了,所以要自己手动添加仓库,如下: sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-ge ...

  10. HttpClient 4.3 使用

    httpclient的api变化很快,本篇随笔记录自己使用4.3.6版本时所做的设置.版本虽然不是最新,但达到了目的就行. maven依赖: <dependency> <groupI ...