iOS CommonCrypto 对称加密 AES ecb,cbc
CommonCrypto 为苹果提供的系统加密接口,支持iOS 和 mac 开发;
不仅限于AES加密,提供的接口还支持其他DES,3DES,RC4,BLOWFISH等算法,
本文章主要讨论AES在iOS的处理,从接口资料描述和测试来看CommonCrypto 与AES相关的一些小结,
- 支持的AES key size 有 128位,192位,256位
- 目前仅支持 AES 128位 blocks 分组
- 数据填充方式:Nopadding,PKCS7 两种
- 分组模式:cbc,ecb 两种默认为 cbc
#import <CommonCrypto/CommonCryptor.h>
1. 主要接口CCCrypt
/*!
@function CCCrypt
@abstract 一个接口来处理加密解密方式.
还可以使用方式二:下面会有示例说明 ,调用流程分几步 ,CCCrytorCreate(),
CCCryptorUpdate(), CCCryptorFinal(), and CCCryptorRelease(). @param alg 加解密使用的算法. @param op 操作类型解密或解密: kCCEncrypt or
kCCDecrypt. @param options 填充方式式通常是kCCOptionPKCS7Padding,默认分组模式cbc,. @param key 密钥. @param keyLength 密钥长度. @param iv 加密使用的向量参数,cbc模式需要,16个字节,ecb模式不需要,. @param dataIn 输入的数据. @param dataInLength 输入的数据长度. @param dataOut 输出的数据. @param dataOutAvailable 输出数据时需要的可用空间大小. @param dataOutMoved 成功之后实际占用的空间大小. @result 结果在为CCCryptorStatus 枚举
*/ CCCryptorStatus CCCrypt(
CCOperation op, /* kCCEncrypt, 等. */
CCAlgorithm alg, /* kCCAlgorithmAES128, 等. */
CCOptions options, /* kCCOptionPKCS7Padding, 等. */
const void *key,
size_t keyLength,
const void *iv, /* 可选的向量 */
const void *dataIn, /*输入*/
size_t dataInLength,
void *dataOut, /* 输出 */
size_t dataOutAvailable,
size_t *dataOutMoved)
如下的封装调用方式,可以根据需要修改
AES_256_cbc 加密或解密
NSData *aes_cbc_256(NSData *inData,NSData *key,CCOperation coType)
{
NSData *retData = nil;
if (!inData || !key) {
return nil;
} if (key.length!=) {
return nil;
} NSUInteger dataLength = [inData length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = ;
CCCryptorStatus cryptStatus;
//ecb 模式不需要使用 iv,cbc模式需要,当cbc模式时,如果不传iv,则默任全0
Byte iv[] = {};
for (int i = ; i < ; i++) {
iv[i] = ;
}
//加密
if (coType==kCCEncrypt) {
cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,//使用AES算法
kCCOptionPKCS7Padding,
key.bytes, kCCKeySizeAES256,
iv,
[inData bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
} //解密
else if(coType ==kCCDecrypt)
{
cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
key.bytes, kCCKeySizeAES256,
iv,
[inData bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
} if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer); return retData;
}
测试:
Byte bkey[] = {};
for (int i = ; i < ; i++) {
bkey[i] = ;
}
NSData *dkey = [NSData dataWithBytes:bkey length:];
NSLog(@"key:%@",dkey);
NSString *srcStr = @"this is test hello string";
NSData *srcData = [srcStr dataUsingEncoding:NSASCIIStringEncoding];
NSLog(@"src:%@",srcData);
NSData *encData = aes_cbc_256(srcData, dkey, kCCEncrypt);
NSLog(@"enc:%@",encData);
NSData *decData = aes_cbc_256(encData, dkey, kCCDecrypt);
NSLog(@"dec:%@",decData);
if (memcmp(srcData.bytes, decData.bytes, srcData.length)==) {
NSLog(@"test PASS");
}
else
{
NSLog(@"NO PASS");
}
输出日志
-- ::09.781 TestCrypt[:] key:< >
-- ::09.782 TestCrypt[:] src:< 2068656c 6c6f2073 7472696e >
-- ::09.782 TestCrypt[:] enc:< f51ac83c bd687f22 d9591dfe e413a769 89b07c41 b047d061 8e0a590c>
-- ::09.782 TestCrypt[:] dec:< 2068656c 6c6f2073 7472696e >
-- ::09.782 TestCrypt[:] test PASS
2. 另外 为了测试,在mac下安装了openssl 1.1.0c的库
在终端下使用 openssl 命令来配合测试,
在终端下openssl 命令加密数据,在ios上解密
在ios上加密数据,在mac终端下使用openssl 命令解密
配合测试的流程如上,我已在本机测试,不在这里贴示例了,说下openssl的命令吧
主要使用openssl enc 命令,如下命令的帮助,其中部分用中文备注了
Valid options are:
-help 查看帮助-ciphers 查看算法列表
-in infile 输入文件
-out outfile 输出结果文件
-pass val 密钥的密码
-e 加密
-d 解密
-p 打印key和iv-P 打印key和iv并退出,这个是大写,实测不会生成out,用上面的小写-v Verbose output
-nopad Disable standard block padding
-salt Use salt in the KDF (default)
-nosalt Do not use salt in the KDF
-debug Print debug info
-a Base64 encode/decode, depending on encryption flag
-base64 Same as option -a
-A Used with -[base64|a] to specify base64 buffer as a single line
-bufsize val Buffer size
-k val Passphrase
-kfile infile Read passphrase from file
-K val 密钥key,16进制-S val Salt, in hex
-iv val 向量iv,16进制-md val Use specified digest to create a key from the passphrase
-none Don't encrypt
-* Any supported cipher
-engine val Use engine, possibly a hardware device
如配合上面测试的 aes_256_cbc 方式,使用上面的密钥和key
加密:
openssl enc -aes--cbc -e -K -iv -in srcTest.txt -out enc.txt -p
解密:
openssl enc -aes--cbc -d -K -iv -in enc.txt -out dec.txt -p
3. 对称加密分步方式二
主要接口
//创建加密器CCCryptorRef
CCCryptorStatus CCCryptorCreate(
CCOperation op, /* kCCEncrypt, etc. */
CCAlgorithm alg, /* kCCAlgorithmDES, etc. */
CCOptions options, /* kCCOptionPKCS7Padding, etc. */
const void *key, /* raw key material */
size_t keyLength,
const void *iv, /* optional initialization vector */
CCCryptorRef *cryptorRef) /* RETURNED */ //获取输出数据的最大长度
size_t CCCryptorGetOutputLength(
CCCryptorRef cryptorRef,
size_t inputLength,
bool final) //加密处理
CCCryptorStatus CCCryptorUpdate(
CCCryptorRef cryptorRef,
const void *dataIn,
size_t dataInLength,
void *dataOut, /* data RETURNED here */
size_t dataOutAvailable,
size_t *dataOutMoved) /* number of bytes written */ //处理最后的数据块
CCCryptorStatus CCCryptorFinal(
CCCryptorRef cryptorRef,
void *dataOut,
size_t dataOutAvailable,
size_t *dataOutMoved) /* number of bytes written */ //释放
CCCryptorStatus CCCryptorRelease(
CCCryptorRef cryptorRef)
如下封装示例调用
aes_256_cbc 加密或解密
NSData *TEST_AES(NSData *indata,CCOperation otype)
{
NSData *retData = nil;
//测试的密钥或向量
Byte tkey[] = {};
for (int i = ; i < ; i++) {
tkey[i] = ;
}
Byte iv[] = {};
for (int i =; i < ; i++) {
iv[i] = ;
}
CCCryptorRef cryptor = NULL; CCCryptorStatus ccret;
//创建加密解密器
if (otype==kCCEncrypt) {
ccret = CCCryptorCreate(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, tkey, kCCKeySizeAES256, iv, &cryptor); }
else if (otype == kCCDecrypt)
{ ccret = CCCryptorCreate(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, tkey, kCCKeySizeAES256, iv, &cryptor); }
if (ccret!=kCCSuccess) {
return nil;
} size_t bufsize = ;
size_t moved = ;
size_t total = ;
//获取最大长度
bufsize = CCCryptorGetOutputLength(cryptor, indata.length, true);
char * buf = (char*)malloc(bufsize);
bzero(buf, bufsize);
//加解密
ccret = CCCryptorUpdate(cryptor,
indata.bytes,indata.length,
buf, bufsize, &moved); total += moved;
if (ccret!=kCCSuccess) {
return nil;
}
//处理最后的数据块
ccret = CCCryptorFinal(cryptor,
buf+total,
bufsize-total, &moved);
if (ccret!=kCCSuccess) {
return nil;
}
total +=moved;
CCCryptorRelease(cryptor);
retData = [NSData dataWithBytes:buf length:total];
free(buf); return retData;
}
测试使用
NSString *srcStr = @"this is test hello string";
NSData *srcData = [srcStr dataUsingEncoding:NSASCIIStringEncoding]; NSData *encData = TEST_AES(srcData, kCCEncrypt);
NSData *decData = TEST_AES(encData, kCCDecrypt); NSLog(@"src:%@",srcData);
NSLog(@"enc:%@",encData);
NSLog(@"dec:%@",decData); if (memcmp(srcData.bytes, decData.bytes, srcData.length)==) {
NSLog(@"PASS");
}
else
{
NSLog(@"NP_PASS");
}
输出日志
-- ::49.105 TestCrypt[:] src:< 2068656c 6c6f2073 7472696e >
-- ::49.106 TestCrypt[:] enc:< f51ac83c bd687f22 d9591dfe e413a769 89b07c41 b047d061 8e0a590c>
-- ::49.106 TestCrypt[:] dec:< 2068656c 6c6f2073 7472696e >
-- ::49.106 TestCrypt[:] PASS
两种方式测试的结果一致;
可见第一种方式其实是苹果内部对第二种方式进一步的封装处理。
4. 总结:
关于在iOS上的对称加密方式;
- 使用本文苹果API,本文:http://www.cnblogs.com/cocoajin/p/6150203.html
- 使用openssl ,见文章:http://www.cnblogs.com/cocoajin/p/6121706.html
- 使用 Cryptopp,见文章:http://www.cnblogs.com/cocoajin/p/6112562.html
封装工具:https://github.com/cocoajin/Security-iOS
iOS CommonCrypto 对称加密 AES ecb,cbc的更多相关文章
- 对称加密----AES和DES加密、解密
目前主流的加密方式有:(对称加密)AES.DES (非对称加密)RSA.DSA 调用AES/DES加密算法包最精要的就是下面两句话: Cipher cipher = Cipher.get ...
- 密码 | 对称加密 - AES
一.AES 算法简介 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准,用来替换 ...
- C#调用Crypto++库AES ECB CBC加解密
本文章使用上一篇<C#调用C++类库例子>的项目代码作为Demo.本文中,C#将调用C++的Crypto++库,实现AES的ECB和CBC加解密. 一.下载Crypto 1.进入Crypt ...
- PHP对称加密-AES加密、DES加密
对称加密 对称加密算法是指,数据发信方将明文(原始数据)和密钥一起经过加密处理后,使其变成复杂的加密密文发送出去.收信方收到密文后,若要解读原文,则需要使用加密密钥及相关算法的逆算法对密文进行解密,使 ...
- 对称加密-AES
假设有一个发送方在向接收方发送消息.如果没有任何加密算法,接收方发送的是一个明文消息:“我是小灰”. 如果消息被中间人截获到,即使中间人无法篡改消息,也可以窥探到消息的内容,从而暴露了通信双方的私密. ...
- 对称加密AES
static void Main(string[] args) { //string str = "rqiJI7eEICT+YZmScpAdbjzLnA4mgL3uU5uHXLBeaE6s8 ...
- 对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)
一. AES对称加密: AES加密 分组 二. 分组密码的填充 分组密码的填充 e.g.: PKCS#5填充方式 三. 流密码: 四. 分组密码加密中的四种模式: 3.1 ECB模式 优点: 1. ...
- [Node.js] 对称加密、公钥加密和RSA
原文地址:http://www.moye.me/2015/06/14/cryptography_rsa/ 引子 对于加解密,我一直处于一种知其然不知其所以然的状态,项目核心部分并不倚重加解密算法时,可 ...
- 加密算法--->对称加密与非对称加密算举例说明
目前主流的加密方式有:(对称加密)AES.DES (非对称加密)RSA.DSA 对称加密例子:des对称加密 des对称加密,对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用 ...
随机推荐
- 最新一代文件结构 超高性能解析IP数据库 qqzeng-ip.dat
高性能IP数据库格式 qqzeng-ip.dat 编码:UTF8 字节序:Little-Endian 返回多个字段信息(如:亚洲|中国|香港|九龙|油尖旺|新世界电讯|810200 ...
- html5 webDatabase 存储中sql语句执行可嵌套使用
html5 webDatabase 存储中sql语句执行可嵌套使用,代码如下: *); data.transaction(function(tx){ tx.executeSql("creat ...
- Extjs swfUpload 多图片上传
一.属性介绍 类型 默认值 描述 upload_url String 处理上传文件的服务器端页面的url地址,可以是绝对地址,也可以是相对地址,当为相对地址时相对的是当前代码所在的文档地址 p ...
- sp_MSforeachtable 与 sp_MSforeachdb
在MSSQL里有许多不公开的系统存储过程,其中可能常用的sp_MSforeachtable和sp_MSforeachdb有这2个.分别用于遍历某数据库的每个用户表.每个数据库. sp_MSforeac ...
- 图说js中的this——深入理解javascript中this指针
没搞错吧!js写了那么多年,this还是会搞错!没搞错,javascript就是回搞错! ………… 文章来源自——周陆军的个人网站:http://zhoulujun.cn/zhoulujun/html ...
- ORACLE工作原理小结
ORACLE工作原理1-连接 我们从一个用户请求开始讲,ORACLE的完整的工作机制是怎样的,首先一个用户进程发出一个连接请求,如果使用的是主机命名或者是本地服务命中的主机名使用的是机器名(非IP地址 ...
- switch 与 python字典
python 中并没有switch语句,但是有一个数据类型与switch语句特别相似,它就是 dict{ key: value, ...} 下面用 dict{ key:value,..} 来简单的实现 ...
- java获取文件的md5值
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- selenium测试(Java)--多窗口切换(十三)
selenium测试(Java)--多窗口切换(十三) 如果遇到点击按钮或链接后出现新窗口的情况,就需要使用窗口切换的方法. 本例中就是先打开百度搜索界面,然后利用js打开一个百度新闻界面,然后通过s ...
- daterangepicker+ bootstrap +php +ajax +datatable双日历的使用
在练习基于bootstrap datatable的使用时,时间插件用到了daterangepicker,特做稍微了解,效果如图: 1.html <div class="panel& ...