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>

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

为什么是[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 算法一样不可逆。

  1. - (NSString *) sha1:(NSString *)input
  2. {
  3. const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
  4. NSData *data = [NSData dataWithBytes:cstr length:input.length];
  5.  
  6. //#define CC_SHA1_DIGEST_LENGTH 20 /* digest length in bytes */
  7. uint8_t digest[CC_SHA1_DIGEST_LENGTH];
  8. CC_SHA1(data.bytes, data.length, digest);
  9.  
  10. NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * ];
  11. for(int i=; i<CC_SHA1_DIGEST_LENGTH; i++) {
  12. [output appendFormat:@"%02x", digest[i]];
  13. }
  14. return output;
  15. }

3. AES 加密

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

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

需要引入头文件

#import <CommonCrypto/CommonCryptor.h>

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

#define APP_PUBLIC_PASSWORD     @"boundary"

  1. - (NSData *)AES256EncryptWithKey:(NSString *)key withString:(NSString *) inputString { //加密
  2. NSData *inData = [inString dataUsingEncoding:NSUTF8StringEncoding];
  3. /***
  4. //如果希望返回字符串,在开始时就开始对 NSData 做转换, 对应下面方法三,方法一和二使用上面语句即可
  5. const char *cstr = [inString cStringUsingEncoding:NSUTF8StringEncoding];
  6. NSData *inData = [NSData dataWithBytes:cstr length:inString.length];
  7. ***/
  8. char keyPtr[kCCKeySizeAES256+];
  9. bzero(keyPtr, sizeof(keyPtr));
  10. [APP_PUBLIC_PASSWORD getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  11. NSUInteger dataLength = [inData length];
  12. size_t bufferSize = dataLength + kCCBlockSizeAES128;
  13. void *buffer = malloc(bufferSize);
  14. size_t numBytesEncrypted = ;
  15. CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
  16. kCCAlgorithmAES128,
  17. kCCOptionPKCS7Padding | kCCOptionECBMode,
  18. keyPtr, kCCBlockSizeAES128,
  19. NULL,
  20. [inData bytes],
  21. dataLength,
  22. buffer, bufferSize,
  23. &numBytesEncrypted);
  24.  
  25. if (cryptStatus == kCCSuccess) {
  26. NSData *outData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
  27. return outData;
  28.  
  29. /***
  30. //如果需要返回 NSString 类型的结果,这里需要进行转换:
  31. // 方法一:
  32. NSString *outString = [[NSString alloc]initWithData:outData encoding:NSUTF8StringEncoding];
    //失败,注意:这里 outString 为 nil,具体原因貌似是因为 NSData 内容含有非encoding编码的字符
  33.  
  34. // 方法二:
  35. NSString *outString = [outData base64Encoding];
  36.  
  37. // 方法三:(转换为2进制字符串)
  38. if (outData && outData.length > 0) {
  39. Byte *datas = (Byte*)[outData bytes];
  40. NSMutableString *outString = [NSMutableString stringWithCapacity:outData.length * 2];
  41. for(int i = 0; i < outData.length; i++){
  42. [outString appendFormat:@"%02x", datas[i]];
  43. }

  44. ***/
  45. }
  46. free(buffer);
  47. return nil;
  1. //解密可以直接使用加密得到的结果 NSData, 这样将很容易,不必进行字符转换
  2. - (NSData *)AES256DecryptWithKey:(NSString *)key withNSData:(NSString *)inData {//解密
  3.  
  4. /***
  5. - (NSData *)AES256DecryptWithKey:(NSString *)key withString:(NSString *)inputString {//解密
  6. //对应加密算法中的方法二:(解密前进行GTMBase64编码)
  7. NSData *inData = [GTMBase64 decodeString:inString];
  8. //对应加密算法中的方法三:
  9. NSMutableData *inData = [NSMutableData dataWithCapacity:inString.length / 2];
  10. unsigned char whole_byte;
  11. char byte_chars[3] = {'\0','\0','\0'};
  12. int i;
  13. for (i=0; i < [inString length] / 2; i++) {
  14. byte_chars[0] = [inString characterAtIndex:i*2];
  15. byte_chars[1] = [inString characterAtIndex:i*2+1];
  16. whole_byte = strtol(byte_chars, NULL, 16);
  17. [inData appendBytes:&whole_byte length:1];
  18. }
  19. ***/
  20.  
  21. char keyPtr[kCCKeySizeAES256+];
  22. bzero(keyPtr, sizeof(keyPtr));
  23. //使用 "key": #define APP_PUBLIC_PASSWORD @"boundary"
  24. [APP_PUBLIC_PASSWORD getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  25. NSUInteger dataLength = [inData length];
  26. size_t bufferSize = dataLength + kCCBlockSizeAES128;
  27. void *buffer = malloc(bufferSize);
  28. size_t numBytesDecrypted = ;
  29. CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
  30. kCCAlgorithmAES128,
  31. kCCOptionPKCS7Padding | kCCOptionECBMode,
  32. keyPtr, kCCBlockSizeAES128,
  33. NULL,
  34. [inData bytes], dataLength,
  35. buffer, bufferSize,
  36. &numBytesDecrypted);
  37.  
  38. if (cryptStatus == kCCSuccess) {
  39. NSData *outData = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
  40. return outData;
  41. /***
  42. //若需返回 NSString,需要上面加密算法和解密算法的各个方法对应好,使用下列语句才不会返回 nil; 切记 dataLength 一定匹配好
  43. NSString *outString = [[NSString alloc]initWithData:outData encoding:NSUTF8StringEncoding];
  44. ***/
  45. }
  46. free(buffer);
  47. 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. CCS 6新建TMS320F2812工程

    准备材料 CCS6 下载地址:http://www.ti.com/tool/ccstudio F2812的C语言头文件 下载地址:http://www.ti.com/lit/zip/sprc097 安 ...

  2. signalr-源码

    1.一对一聊天 2.多对多 3.离线消息 1)群聊离线 2.1对一聊天离线 源码地址:https://github.com/aa1356889/SignalrCode 操作步骤 部署网站到iis 网上 ...

  3. bzoj4571: [Scoi2016]美味

    4571: [Scoi2016]美味 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 275 Solved: 141 [Submit][Status][ ...

  4. Level Of Management Protocols - SNMP Tutorial

    30.2 The Level Of Management Protocols Originally, many wide area networks included management proto ...

  5. easyUi 框架中的JS文件传递参数的区别

    1.情景一 //JS文件 ajax的请求url : parent.baseUrl+"user/customer/findOne/" + id, //后台JAVA代码接收参数 @Re ...

  6. Math类

    Math类:用于执行基本数学运算的方法 方法: public static int abs(int a):绝对值 public static double ceil(double a):向上取整   ...

  7. 文件夹锁定(Source)

    文件夹锁定(Source)private void Lock(string folderPath){    try    {        string adminUserName = Environ ...

  8. 1、Jsp页面

    一.JSP(java server page):是以Java语言为基础的动态网页生成技术. 1.特点: a).以 .jsp 为后缀的文本文件,不需要编译(相对于程序猿来说不需要编译) b).以html ...

  9. 与或左移右移操作在ARM寄存器配置中的作用

    逻辑运算: 与运算&:与0清零  清零用与运算 或运算 |:或1置一  置一用或运算 异或 ^:不同为1  /*****单个寄存器清零置一*************************** ...

  10. [Hadoop] Hadoop学习笔记之Hadoop基础

    1 Hadoop是什么? Google公司发表了两篇论文:一篇论文是“The Google File System”,介绍如何实现分布式地存储海量数据:另一篇论文是“Mapreduce:Simplif ...