1.AES加解密

AES加解密

//

//  AESEncryptAndDecrypt.h

//  NSData扩展方法,用于处理aes加解密

//

//  Created by Vie on 16/4/7.

//  Copyright © 2016年 Vie. All rights reserved.

//

#import <Foundation/Foundation.h>

@class NSString;

@interface NSData (AES)

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

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

@end

//

//  AESEncryptAndDecrypt.m

//  NSData扩展方法,用于处理aes加解密

//

//  Created by Vie on 16/4/7.

//  Copyright © 2016年 Vie. All rights reserved.

//

#import "AESEncryptAndDecrypt.h"

#import <CommonCrypto/CommonCryptor.h>

//static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

@implementation NSData (AES)

- (NSData *)AES256EncryptWithKey:(NSData *)key   //加密

{

//AES256加密,密钥应该是32位的

const void * keyPtr2 = [key bytes];

char (*keyPtr)[32] = keyPtr2;

//对于块加密算法,输出大小总是等于或小于输入大小加上一个块的大小

//所以在下边需要再加上一个块的大小

NSUInteger dataLength = [self length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;

void *buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,

kCCOptionPKCS7Padding/*这里就是刚才说到的PKCS7Padding填充了*/| kCCOptionECBMode,

[key bytes], kCCKeySizeAES256,

NULL,/* 初始化向量(可选) */

[self bytes], dataLength,/*输入*/

buffer, bufferSize,/* 输出 */

&numBytesEncrypted);

if (cryptStatus == kCCSuccess) {

return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];

}

free(buffer);//释放buffer

return nil;

}

- (NSData *)AES256DecryptWithKey:(NSData *)key   //解密

{

//同理,解密中,密钥也是32位的

const void * keyPtr2 = [key bytes];

char (*keyPtr)[32] = keyPtr2;

//对于块加密算法,输出大小总是等于或小于输入大小加上一个块的大小

//所以在下边需要再加上一个块的大小

NSUInteger dataLength = [self length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;

void *buffer = malloc(bufferSize);

size_t numBytesDecrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,

kCCOptionPKCS7Padding/*这里就是刚才说到的PKCS7Padding填充了*/| kCCOptionECBMode,

keyPtr, kCCKeySizeAES256,

NULL,/* 初始化向量(可选) */

[self bytes], dataLength,/* 输入 */

buffer, bufferSize,/* 输出 */

&numBytesDecrypted);

if (cryptStatus == kCCSuccess) {

return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

}

free(buffer);

return nil;

}

@end

//处理base64编码的密钥加密,原文转换为base64字符串;返回aes加密后的base64编码字符串

-(NSString *)encryptBase64Key:(NSString *)key originalText:(NSString *)text{

//base64字符串utf8格式转nsdata

NSData *dataUtf8Key=[[NSData alloc] initWithBase64EncodedString:[NSString stringWithUTF8String:[key UTF8String]] options:NSDataBase64DecodingIgnoreUnknownCharacters];

//原文转data

NSData *textData = [text dataUsingEncoding:NSUTF8StringEncoding];

//aes加密

NSData *cipherData = [textData AES256EncryptWithKey:dataUtf8Key];

//密文转为base64字符串

NSString *cipherBase64Str=[cipherData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

NSLog(@"密文:%@",cipherBase64Str);

return cipherBase64Str;

}

//处理base64编码的密钥,密文解密;返回原文

-(NSString *)decryptBase64Key:(NSString *)key cipherText:(NSString *)text{

//密钥base64处理

//base64字符串utf8格式转nsdata

NSData *dataUtf8Key=[[NSData alloc] initWithBase64EncodedString:[NSString stringWithUTF8String:[key UTF8String]] options:NSDataBase64DecodingIgnoreUnknownCharacters];

//密文解base64处理

NSData *dataUtf8Data=[[NSData alloc] initWithBase64EncodedString:[NSString stringWithUTF8String:[text UTF8String]] options:NSDataBase64DecodingIgnoreUnknownCharacters];

//解密原文

NSData *decryptData=[dataUtf8Data AES256DecryptWithKey:dataUtf8Key];

NSString *originalText= [[NSString alloc] initWithData:decryptData encoding:NSUTF8StringEncoding];

NSLog(@"原文:%@",originalText);

return originalText;

}

 //测试加密

[self encryptBase64Key:@"74DhItW47MitqIBGOf8aosUllBdhlUxB7es64TKCsgU=" originalText:@"监察局时间长"];

 //测试解密

[self decryptBase64Key:@"74DhItW47MitqIBGOf8aosUllBdhlUxB7es64TKCsgU=" cipherText:@"bWZMFt1I2H7wy25D9V3Ll26IdbOs+/NOlzaEqcUZ9L8="];

iOS,信息加解密的更多相关文章

  1. iOS URL加解密

    URL加解密 背景介绍 iOS 下URL加解密,项目使用AFNetworking 虽然是使用HTTPS,但是从安全方面考虑,在很多情况下还是需要对url的参数进行加密的. 接口如 https://19 ...

  2. 惊呆了!不改一行 Java 代码竟然就能轻松解决敏感信息加解密|原创

    前言 出于安全考虑,现需要将数据库的中敏感信息加密存储到数据库中,但是正常业务交互还是需要使用明文数据,所以查询返回我们还需要经过相应的解密才能返回给调用方. ps:日常开发中,我们要有一定的安全意识 ...

  3. iOS RSA加解密签名和验证

    转自:http://www.jianshu.com/p/81b0b54436b8 Pre:在公司负责了一个项目,需要用到iOS RSA验证签名的功能.后台给我的仅仅是一个公钥的字符串.经过起初的一段时 ...

  4. iOS RC4加解密算法

    -(NSString *)encrypt:(NSString *)string withKey:(NSString *)key{ self.sBox = [[self frameSBox:key] m ...

  5. java与IOS之间的RSA加解密

    很简单的一个需求,ipad端给密码RSA加密,传到java后台,解密.RSA加密算法是基于一个密钥对的,分为公钥和私钥,一般情况公钥加密,私钥解密,但也可私钥加密,公钥解密.还可以验签,就是先用私钥对 ...

  6. DES跨(C# Android IOS)三个平台通用的加解密方法

          #region   跨平台加解密(c# 安卓 IOS)       //  public static string sKey = "12345678";       ...

  7. 【iOS】FMDB/SQLCipher数据库加解密,迁移

    2016-04-19更新:本文代码可能有些问题,请移步 http://zhengbomo.github.io/2016-04-18/sqlcipher-start/ 查看 sqlite应用几乎在所有的 ...

  8. .net 安卓IOS跨平台des加解密双向的(可以互相加解密)

    #region 跨平台加解密(c# 安卓 IOS) // public static string sKey = "12345678"; // /// // /// 解密 // / ...

  9. ios开发不能不知的动态修复bug补丁第三方库JSPatch 使用学习:JSPatch导入、和使用、.js文件传输加解密

    JSPatch ios开发不能不知的动态修复bug补丁第三方库JSPatch 使用学习:JSPatch导入.和使用..js文件传输加解密 ios开发面临审核周期长,修复bug延迟等让人无奈的问题,所以 ...

随机推荐

  1. 2015ACM/ICPC亚洲区上海站

    5573 Binary Tree(构造) 题意:给你一个二叉树,根节点为1,子节点为父节点的2倍和2倍+1,从根节点开始依次向下走k层,问如何走使得将路径上的数进行加减最终结果得到n. 联想到二进制. ...

  2. win7 eclipse 调试storm

    windows 下eclipse开发storm 用本地模式,直接run as 运行topology解决了可以什么都不用下,直接把storm-starter的源码下下来,1.在eclipse创建一个ja ...

  3. BZOJ 1260&UVa 4394 区间DP

    题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...

  4. 【Linux】vi 命令

    基本上 vi/vim 共分为三种模式,分别是一般模式.编辑模式与指令列命令模式. 这三种模式的作用分别是:     一般模式:以 vi 打开一个档案就直接进入一般模式了(这是默认的模式).在这个模式中 ...

  5. CSS笔记2

    1.     CSS基础选择器 html负责结构 ,css负责样式,js负责行为 css写在head标签里面,容器style标签 <style type="text/css" ...

  6. java分享第八天-01(线程)

     创建线程:1 可以实现Runnable接口.2 可以扩展Thread类本身. 通过实现Runnable创建线程:创建一个线程,最简单的方法是创建一个实现Runnable接口的类.为了实现Runnab ...

  7. JavaScript获取当前日期,昨天,今天日期以及任意天数间隔日期

    <script language="JavaScript" type="text/javascript"> function GetDateStr( ...

  8. --自动创建备份SQL

    --自动创建备份SQL DECLARE @dbname VARCHAR(50) ,--要备份的数据库名称 @bakname VARCHAR(50) ,--备份后的bat名称 @sql VARCHAR( ...

  9. HDU 1281 二分图

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  10. ArcEngine 岛状多边形内部环的获取

    ArcEngine岛状多边形获取其内部环 查阅了帮助文档相关接口,内部环的获方法get_InteriorRingBag() 需要外部环作为参数.而外部环可以直接通过ExteriorRingBag属性获 ...