iOS开发 --- 加密与解密框架CommonCrypto之CommonCryptor.h(对称加密算法)(二)

#include <CommonCrypto/CommonCryptor.h>//常用加解密算法,例如AES、DES、CAST、RC4、RC2、Blowfish等

详细介绍第一个文件CommonCryptor的具体使用以及相关内容。

CommonCryptor中提供的用于加解密的方法如下,有两种方式去获取加解密处理的数据。

  • CCCrytorCreate() | CCCryptorCreateFromData()| CCCryptorCreateWithMode(), CCCryptorUpdate(), CCCryptorFinal(),和 CCCryptorRelease();

  • CCCrypt()

第一种:

调用顺序

  1. CCryptorCreateWithMode //创建CCCryptorRef对象

  2. CCCryptorUpdate

  3. 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> CCCryptorCreateFromData()

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加解密最重要的干货:CCCrypt

iOS逆向之还原CCCrypt加解密算法

iOS CommonCrypto 对称加密 AES ecb,cbc

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值