文档章节

iOS开发-数据加密算法AES

法斗斗
 法斗斗
发布于 2015/09/24 18:01
字数 661
阅读 55
收藏 2

 

iOS开发-数据加密算法AES 

分类: iOS开发2014-11-05 13:43 212人阅读 评论(0) 收藏 举报

ios加密 算法 MD5AES

目录(?)[+]

iOS常用加密方法(aes、md5、base64)

1、AES加密

NSData+AES.h文件

  1. //  

  2. //  NSData-AES.h  

  3. //  Smile  

  4. //  

  5. //  Created by 周 敏 on 12-11-24.  

  6. //  Copyright (c) 2012年 BOX. All rights reserved.  

  7. //  

  8.   

  9. #import <Foundation/Foundation.h>  

  10.   

  11. @class NSString;  

  12.   

  13. @interface NSData (Encryption)  

  14.   

  15. - (NSData *)AES256EncryptWithKey:(NSString *)key;   //加密  

  16. - (NSData *)AES256DecryptWithKey:(NSString *)key;   //解密  

  17.   

  18. @end  


NSData+AES.m文件

  1. //  

  2. //  NSData-AES.h  

  3. //  Smile  

  4. //  

  5. //  Created by 周 敏 on 12-11-24.  

  6. //  Copyright (c) 2012年 BOX. All rights reserved.  

  7. //  

  8.   

  9. #import "NSData+AES.h"  

  10. #import <CommonCrypto/CommonCryptor.h>  

  11.   

  12. @implementation NSData (Encryption)  

  13.   

  14. - (NSData *)AES256EncryptWithKey:(NSString *)key {//加密  

  15.     char keyPtr[kCCKeySizeAES256+1];  

  16.     bzero(keyPtr, sizeof(keyPtr));  

  17.     [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  

  18.     NSUInteger dataLength = [self length];  

  19.     size_t bufferSize = dataLength + kCCBlockSizeAES128;  

  20.     void *buffer = malloc(bufferSize);  

  21.     size_t numBytesEncrypted = 0;  

  22.     CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,  

  23.                                           kCCOptionPKCS7Padding | kCCOptionECBMode,  

  24.                                           keyPtr, kCCBlockSizeAES128,  

  25.                                           NULL,  

  26.                                           [self bytes], dataLength,  

  27.                                           buffer, bufferSize,  

  28.                                           &numBytesEncrypted);  

  29.     if (cryptStatus == kCCSuccess) {  

  30.         return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];  

  31.     }  

  32.     free(buffer);  

  33.     return nil;  

  34. }  

  35.   

  36.   

  37. - (NSData *)AES256DecryptWithKey:(NSString *)key {//解密  

  38.     char keyPtr[kCCKeySizeAES256+1];  

  39.     bzero(keyPtr, sizeof(keyPtr));  

  40.     [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  

  41.     NSUInteger dataLength = [self length];  

  42.     size_t bufferSize = dataLength + kCCBlockSizeAES128;  

  43.     void *buffer = malloc(bufferSize);  

  44.     size_t numBytesDecrypted = 0;  

  45.     CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,  

  46.                                           kCCOptionPKCS7Padding | kCCOptionECBMode,  

  47.                                           keyPtr, kCCBlockSizeAES128,  

  48.                                           NULL,  

  49.                                           [self bytes], dataLength,  

  50.                                           buffer, bufferSize,  

  51.                                           &numBytesDecrypted);  

  52.     if (cryptStatus == kCCSuccess) {  

  53.         return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];  

  54.     }  

  55.     free(buffer);  

  56.     return nil;  

  57. }  

  58.   

  59. @end  

这里AES在iOS加过密以后以nsdata的形式存下来,如果想以nsstring形式存储,那么对nsdata进行base64位编码。

2、BASE64编码

首先下载GTMBase64文件,在工程中加入三个文件
GTMDefines.h
GTMBase64.h
GTMBase64.m
你可以在这里找到这三个文件
http://code.google.com/p/google-toolbox-for-mac/source/browse/trunk/Foundation/?r=87

你也可以在下面的demo里面找到这3个文件,demo会完整实现文章里面常用的3种编码方法。

我在此稍微封装一下:

.h文件

  1. #pragma mark - base64  

  2. + (NSString*)encodeBase64String:(NSString *)input;  

  3. + (NSString*)decodeBase64String:(NSString *)input;  

  4. + (NSString*)encodeBase64Data:(NSData *)data;  

  5. + (NSString*)decodeBase64Data:(NSData *)data;  


.m文件

  1. #pragma mark - base64  

  2. + (NSString*)encodeBase64String:(NSString * )input {   

  3.     NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];   

  4.     data = [GTMBase64 encodeData:data];   

  5.     NSString *base64String = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];   

  6.     return base64String;  

  7. }  

  8.   

  9. + (NSString*)decodeBase64String:(NSString * )input {   

  10.     NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];   

  11.     data = [GTMBase64 decodeData:data];   

  12.     NSString *base64String = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];   

  13.     return base64String;  

  14. }   

  15.   

  16. + (NSString*)encodeBase64Data:(NSData *)data {  

  17.     data = [GTMBase64 encodeData:data];   

  18.     NSString *base64String = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];  

  19.     return base64String;  

  20. }  

  21.   

  22. + (NSString*)decodeBase64Data:(NSData *)data {  

  23.     data = [GTMBase64 decodeData:data];   

  24.     NSString *base64String = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];  

  25.     return base64String;  

  26. }  


3、MD5加密

NSString+MD5.h文件

  1. //  

  2. //  NSString+MD5Encrypt.h  

  3. //  Smile  

  4. //  

  5. //  Created by 周 敏 on 12-11-24.  

  6. //  Copyright (c) 2012年 BOX. All rights reserved.  

  7. //  

  8.   

  9. #import <CommonCrypto/CommonDigest.h>  

  10.   

  11. @interface NSString (MD5)  

  12.   

  13. - (NSString *)md5Encrypt;  

  14.   

  15. @end  



NSString+MD5.m文件

  1. //  

  2. //  NSString+MD5Encrypt.h  

  3. //  Smile  

  4. //  

  5. //  Created by 周 敏 on 12-11-24.  

  6. //  Copyright (c) 2012年 BOX. All rights reserved.  

  7. //  

  8.   

  9. #import "NSString+MD5.h"  

  10.   

  11. @implementation NSString (MD5)  

  12.   

  13. - (NSString *)md5Encrypt {  

  14.     const char *original_str = [self UTF8String];  

  15.     unsigned char result[CC_MD5_DIGEST_LENGTH];  

  16.     CC_MD5(original_str, strlen(original_str), result);  

  17.     NSMutableString *hash = [NSMutableString string];  

  18.     for (int i = 0; i < 16; i++)  

  19.         [hash appendFormat:@"%02X", result[i]];  

  20.     return [hash lowercaseString];  

  21. }  

  22.   

  23. @end  



demo含有这3种的使用方式,在AppDelegate.m文件里面,不会使用的自己参考一下。
demo下载:http://download.csdn.net/detail/z251257144/4884004


本文转载自:

法斗斗
粉丝 23
博文 368
码字总数 17774
作品 0
杨浦
程序员
私信 提问
iOS 实现对称加密多种填充方式(ANSIX923、ISO10126、Zero)

前言 前段时间调研了iOS有关加密的框架.在查阅资料的过程中,有一篇《iOS加密解密:AES,DES,3DES,BLOWFISH(含有多种模式和算法说明)》 的文章。 在文章中作者对需要加密的数据实现PKCS7Pa...

_涼城
2018/05/27
0
0
关于AES256算法java端加密,ios端解密出现无法解密问题的解决方案

我想关于AES算法大家应该都已经了解了,我就不多介绍了。这是本人第一次写技术博文,如果有不对之处欢迎大家指正,共同讨论,一起学习! 之前在项目上用到AES256加密解密算法,刚开始在java端...

Sun1009
2012/12/13
29.8K
32
iOS ZipperDown 漏洞来袭,我们该如何应对?

  昨天傍晚盘古实验室负责任的披露了针对 iOS 应用的 ZipperDown 漏洞,并提供了检索、查询受影响应用的平台: zipperdown.com。基于目前公开的信息,该漏洞的影响面比较大,15000 多个应用...

FreeBuf
2018/05/16
0
0
IOS支持AES算法 PKCS5Padding 的填充方式吗?

我知道安卓端与服务器端的通信方式 AES加密方式支持PKCS5Padding,ios支持 PKCS5Padding吗? 我看官方文档上面只支持 PKCS7Padding ,大家有没有用过ios端 PKCS5Padding的 AES加密方式吗? ...

Java_Coder
2014/12/14
551
0
关于DES加密,密钥和待加密串相同,在android版本和IOS版本得到不同的密文,怎么破?

背景:业务要跟后台系统交互,对信息加密,APP有IOS和android两版本,所以算法必须一致。在用同样的密钥和加密内容进行加密后,得出的密文不同。 我找了些资料,也有很多人遇到。 导致密文不...

andywster
2014/02/13
3.7K
3

没有更多内容

加载失败,请刷新页面

加载更多

Java 8 Optional:优雅地避免 NPE

本篇文章将详细介绍 Optional 类,以及如何用它消除代码中的 null 检查。在开始之前首先来看下什么是 NPE,以及在 Java 8 之前是如何处理 NPE 问题的。 空指针异常(NullPointException,简称...

武培轩
22分钟前
1
0
CountDownLatch实现的并发框架

目录结构 package com.**.**.base.support.executor;import lombok.NoArgsConstructor;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;imp......

MR_TE
24分钟前
7
0
学习记录(day06-事件、按键修饰符、计算属性)

[TOC] 1.1 事件修饰符/按键修饰符 vue 通过事件修饰符对dom事件细节进行控制 <标签 @事件.修饰符="函数"></标签>.prevent ---阻止浏览器默认行为.stop ---阻止浏览器事件冒泡.e...

庭前云落
43分钟前
6
0
006-Sigle-基于blockstack去中心化博客

本篇文章主要讲解有关基于Blockstack的Sigle是一个去中心化的博客项目; 官网地址:https://www.sigle.io/ Github地址:https://github.com/pradel/sigle 页面展示: 介绍: A beautiful de...

Riverzhou
50分钟前
17
0
驰骋工作流引擎开发平台属性功能的隐藏显示介绍

关键字: 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 表单引擎 工作流功能说明 工作流设计 工作流快速开发平台 业务流程管理 bpm工作流系统 java工作流主流框架 自定义...

孟娟
52分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部