#include <CommonCrypto/CommonCryptor.h>//常用加解密算法,例如AES、DES、CAST、RC4、RC2、Blowfish等
详细介绍第一个文件CommonCryptor的具体使用以及相关内容。
CommonCryptor中提供的用于加解密的方法如下,有两种方式去获取加解密处理的数据。
CCCrytorCreate() | CCCryptorCreate
FromData()| CCCryptorCreateWithMode(), CCCryptorUpdate(), CCCryptorFinal(),和 CCCryptorRelease()
;CCCrypt()
。
第一种:
调用顺序
CCryptorCreateWithMode //创建CCCryptorRef对象
CCCryptorUpdate
CCCryptorFinal、CCCryptorRelease
Create
:苹果官方有提供了三种方法创建:
1> CCCryptorCreate()
:快速创建的方法,默认是CBC模式下,可选ECB模式。
CCCryptorCreate()方法
通过指定加解密、算法、默认CBC模式、密匙长度和密匙字节及向量字节返回一个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 */ API_AVAILABLE(macos(10.4), ios(2.0));
CCOperation operation = kCCEncrypt; //kCCEncrypt | KCCDecrypt 加密 | 解密 CCAlgorithm algorithm = kCCAlgorithmAES128; // 算法以AES为例
CCOptions options = kCCOptionPKCS7Padding; // 填补方式以 kCCOptionPKCS7Padding 为例.
2>
CCCryptorCreate
FromData()
CCCryptorStatus CCCryptorCreateFromData( 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 */ const void *data, /* caller-supplied memory */ size_t dataLength, /* length of data in bytes */ CCCryptorRef *cryptorRef, /* RETURNED */ size_t *dataUsed) /* optional, RETURNED */ API_AVAILABLE(macos(10.4), ios(2.0));
3>
CCCryptorCreateWithMode()
可以选择加密模式、以及填补模式。CCCryptorStatus CCCryptorCreateWithMode( CCOperation op, /* kCCEncrypt, kCCDecrypt */ CCMode mode, CCAlgorithm alg, CCPadding padding, const void *iv, /* optional initialization vector */ const void *key, /* raw key material */ size_t keyLength, const void *tweak, /* raw tweak material */ size_t tweakLength, int numRounds, /* 0 == default */ CCModeOptions options, CCCryptorRef *cryptorRef) /* RETURNED */ API_AVAILABLE(macos(10.7), ios(5.0));
CCMode mode = kCCModeCBC; // 可选加密模式 CBC、EBC,官方提供的文档还可以选择CFB、CTR、 OFB、XTS等. CCPadding padding = ccPKCS7Padding; //填补模式 ccPKCS7Padding、ccNoPadding.
Update:
CCCryptorUpdate()
函数用于处理(加密,解密)数据,如果有结果的话,写入开发者提供的缓冲区。/*! cryptorRef:从上面三个create方法中获得。 dataOut:通过方法CCCryptorGetOutputLength()获得。 dataOutAvailable:通过方法CCCryptorGetOutputLength()获得。 dataOutMoved:通过方法CCCryptorGetOutputLength()获得。 */ 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 */ API_AVAILABLE(macos(10.4), ios(2.0));
Final 、Release:
结果处理和释放对象的操作需要用到
CCCryptorFinal()
和CCCryptorRelease()
两个方法。
CCCryptorFinal()方法
用于完成加密或解密操作,并获得(可能的)最终数据输出。如果在执行对称加解密的时候并没有使用填补或者进行流加密操作时,可以不调用
CCCryptorFinal()方法
。CCCryptorStatus CCCryptorFinal( CCCryptorRef cryptorRef, void *dataOut, size_t dataOutAvailable, size_t *dataOutMoved) /* number of bytes written */ API_AVAILABLE(macos(10.4), ios(2.0));
CCCryptorRelease()
函数则用于释放CCCryptorRef对象。CCCryptorStatus CCCryptorRelease( CCCryptorRef cryptorRef) API_AVAILABLE(macos(10.4), ios(2.0));
第二种:
CCCrypt()
函数其实是基于第一种模式下的二次封装,是一个单次执行加解密操作的函数。(PS:这次我用的是这种方法,简单方便!)
函数定义
/*! @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个字节,EBC模式不需要,. @param dataIn 输入的数据. @param dataInLength 输入的数据长度. @param dataOut 输出的数据. @param dataOutAvailable 输出数据时需要的可用空间大小. @param dataOutMoved 成功之后实际占用的空间大c. @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) API_AVAILABLE(macos(10.4), ios(2.0));
参数说明
1,CCOperation op:加密:kCCEncrypt = 0,解密:kCCDecrypt = 1
2,CCAlgorithm alg:加解密算法标准。
enum { kCCAlgorithmAES128 = 0, /* Deprecated, name phased out due to ambiguity with key size */ kCCAlgorithmAES = 0, kCCAlgorithmDES, kCCAlgorithm3DES, kCCAlgorithmCAST, kCCAlgorithmRC4, kCCAlgorithmRC2, kCCAlgorithmBlowfish }; typedef uint32_t CCAlgorithm;
3,CCOptions options:补码方式,默认是CBC模式。
enum { /* options for block ciphers */ kCCOptionPKCS7Padding = 0x0001, kCCOptionECBMode = 0x0002 /* stream ciphers currently have no options */ }; typedef uint32_t CCOptions;
4,const void *key:密钥,对称加密,加解密的密钥都一样,依据选择的算法标准,密钥长度不同。
//传入的密钥,经过从cstring utf8转成字节类型 NSData *aSymmetricKey = [key dataUsingEncoding:NSUTF8StringEncoding];
5,size_t keyLength:密钥长度,加解密时依据keyLength取密钥的长度。
enum { kCCKeySizeAES128 = 16, kCCKeySizeAES192 = 24, kCCKeySizeAES256 = 32, kCCKeySizeDES = 8, kCCKeySize3DES = 24, kCCKeySizeMinCAST = 5, kCCKeySizeMaxCAST = 16, kCCKeySizeMinRC4 = 1, kCCKeySizeMaxRC4 = 512, kCCKeySizeMinRC2 = 1, kCCKeySizeMaxRC2 = 128, kCCKeySizeMinBlowfish = 8, kCCKeySizeMaxBlowfish = 56, };
6,const void *iv:偏移向量。CBC模式下需要,不传默认16位0,只有在ECB模式下不需要。
7,const void *dataIn:进行加解密的原始数据。
8,size_t dataInLength:进行加解密的原始数据的长度。
9,void *dataOut:加解密完后,数据保存的地方。
10,size_t dataOutAvailable:保存加解密后的数据需要的空间。
11,size_t *dataOutMoved:保存数据后,写入的数据的具体长度。
相关文章
iOS 关于CommonCrypto框架 ②(CommonCryptor AES|DES|3DES|CAST|BlowFish)
iOS CommonCrypto 对称加密 AES ecb,cbc