加密
一、加密算法:
1.对称加密:信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的。常见的有AES,DES,3DES。
2.非对称加密:发送双方A,B事先均生成各自的公钥和私钥,然后A将自己的公匙发送给B,B将自己的公匙发送给A,如果A要给B发送消息,则先需要用B的公匙进行消息加密,然后发送给B端,此时B端再用自己的私匙进行消息解密,B向A发送消息时为同样的道理。常见的非对称加密算法有RSA,DSA,ECC
二、AES介绍
1.AES是基于数据块的加密方式,也就是说,每次处理的数据是一块(128比特),当数据不是128比特的倍数时填充,这就是所谓的分组密码(区别于基于比特位的流密码),128比特是分组长度。
2.密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)
3.分组加密的几种方式
3.1 ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
3.2 CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度。CBC会在第一个密码块运算时加入一个初始化向量。
3.3 CFB/OFB实际上是一种反馈模式,目的也是增强破解的难度。
三、AES加解密(使用CBC及PKCS7Padding)
1.对称密钥生成器:
/* @param algorithm 加密算法
* 为指定的加密算法生成对称密钥。使用的密钥长度如下:(Byte)
* kCCAlgorithmAES -> kCCKeySizeAES256 -> 32
* kCCAlgorithmDES -> kCCKeySizeDES -> 8
* kCCAlgorithm3DES -> kCCKeySize3DES -> 24
* kCCAlgorithmCAST -> kCCKeySizeMaxCAST -> 16
* kCCAlgorithmRC4 -> kCCKeySizeMaxRC4 -> 512
* kCCAlgorithmRC2 -> kCCKeySizeMaxRC2 -> 128
* kCCAlgorithmBlowfish -> kCCKeySizeMaxBlowfish -> 56
* @return 密钥
*/
+ (NSData *)generateSymmetricKeyForAlgorithm:(CCAlgorithm)algorithm;
+ (NSData *)generateSymmetricKeyForAlgorithm:(CCAlgorithm)algorithm
keySize:(unsigned int)keySize;
2.初始化向量生成器
/* 为指定的加密算法生成初始化向量,初始化向量的大小与算法分组的大小相同。
* @param algorithm 加密算法,不能是流加密算法
* @return 初始化向量
*/
+ (NSData *)generateIVForAlgorithm:(CCAlgorithm)algorithm;
3.分组对称加解密
/* 使用分组对称加密算法对数据进行加解密。
* 初始化向量释疑:初始化向量完全是可选的。CBC模式下才会使用到它。
* 如果初始化向量不为空,那么,其长度必须与算法分组大小(以字节为单位)一致。
* 如果使用了CBC模式,且没有指定初始化向量,会自动使用以0填充的初始化向量。
* 当使用ECB模式时或使用的是流加密算法时,初始化向量会被忽略掉。
* @param algorithm 算法,不能是流加密算法
* @param key 密钥
* @param iv 初始化向量,可以为空。
* @param operation 加密(kCCEncrypt)/解密(kCCDecrypt)
* @param isPKCS7Padding 是否使用PKCS7Padding填充模式,如不使用,则是使用NoPadding填充模式
* @param isECB 是否使用ECB模式,如不使用,则是使用CBC模式
* @return 加密/解密后的数据
*/
- (NSData *)doBlockCipherWithAlgorithm:(CCAlgorithm)algorithm
key:(NSData *)key
iv:(NSData *)iv
operation:(CCOperation)operation
isPKCS7Padding:(BOOL)isPKCS7Padding
isECB:(BOOL)isECB;
/* 更新密钥。
* kCCKeySizeAES128 = 16
* kCCKeySizeAES192 = 24
* kCCKeySizeAES256 = 32
* keySize必须为上面中的某个,单位字节。
*/
- (void)updateKeyWithKeySize:(unsigned int)keySize;
//更新初始化向量
- (void)updateIV;
/* AES-128 加密
* @param plainData 待加密数据(明文数据)
* @return 加密后的数据(密文数据)
*/
- (NSData *)AES128Encrypt:(NSData *)plainData;
/* AES-128 解密
* @param cipherData 待解密数据(密文数据)
* @return 解密后的数据(明文数据)
*/
- (NSData *)AES128Decrypt:(NSData *)cipherData;
/* 加解密。当需要使用指定的密钥或初始化向量时,可以使用该方法。会修改_key、_iv。
* @param data 明文/密文
* @param key 密钥
* @param iv 初始化向量,可以为空
* @param operation kCCEncrypt/kCCDecrypt
* @return 加密/解密后的数据
*/
- (NSData *)doCipher:(NSData *)data
key:(NSData *)key
iv:(NSData *)iv
operation:(CCOperation)operation;
一、加密算法:
1.对称加密:信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的。常见的有AES,DES,3DES。
2.非对称加密:发送双方A,B事先均生成各自的公钥和私钥,然后A将自己的公匙发送给B,B将自己的公匙发送给A,如果A要给B发送消息,则先需要用B的公匙进行消息加密,然后发送给B端,此时B端再用自己的私匙进行消息解密,B向A发送消息时为同样的道理。常见的非对称加密算法有RSA,DSA,ECC
二、AES介绍
1.AES是基于数据块的加密方式,也就是说,每次处理的数据是一块(128比特),当数据不是128比特的倍数时填充,这就是所谓的分组密码(区别于基于比特位的流密码),128比特是分组长度。
2.密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)
3.分组加密的几种方式
3.1 ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
3.2 CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度。CBC会在第一个密码块运算时加入一个初始化向量。
3.3 CFB/OFB实际上是一种反馈模式,目的也是增强破解的难度。
三、AES加解密(使用CBC及PKCS7Padding)
1.对称密钥生成器:
/* @param algorithm 加密算法
* 为指定的加密算法生成对称密钥。使用的密钥长度如下:(Byte)
* kCCAlgorithmAES -> kCCKeySizeAES256 -> 32
* kCCAlgorithmDES -> kCCKeySizeDES -> 8
* kCCAlgorithm3DES -> kCCKeySize3DES -> 24
* kCCAlgorithmCAST -> kCCKeySizeMaxCAST -> 16
* kCCAlgorithmRC4 -> kCCKeySizeMaxRC4 -> 512
* kCCAlgorithmRC2 -> kCCKeySizeMaxRC2 -> 128
* kCCAlgorithmBlowfish -> kCCKeySizeMaxBlowfish -> 56
* @return 密钥
*/
+ (NSData *)generateSymmetricKeyForAlgorithm:(CCAlgorithm)algorithm;
+ (NSData *)generateSymmetricKeyForAlgorithm:(CCAlgorithm)algorithm
keySize:(unsigned int)keySize;
2.初始化向量生成器
/* 为指定的加密算法生成初始化向量,初始化向量的大小与算法分组的大小相同。
* @param algorithm 加密算法,不能是流加密算法
* @return 初始化向量
*/
+ (NSData *)generateIVForAlgorithm:(CCAlgorithm)algorithm;
3.分组对称加解密
/* 使用分组对称加密算法对数据进行加解密。
* 初始化向量释疑:初始化向量完全是可选的。CBC模式下才会使用到它。
* 如果初始化向量不为空,那么,其长度必须与算法分组大小(以字节为单位)一致。
* 如果使用了CBC模式,且没有指定初始化向量,会自动使用以0填充的初始化向量。
* 当使用ECB模式时或使用的是流加密算法时,初始化向量会被忽略掉。
* @param algorithm 算法,不能是流加密算法
* @param key 密钥
* @param iv 初始化向量,可以为空。
* @param operation 加密(kCCEncrypt)/解密(kCCDecrypt)
* @param isPKCS7Padding 是否使用PKCS7Padding填充模式,如不使用,则是使用NoPadding填充模式
* @param isECB 是否使用ECB模式,如不使用,则是使用CBC模式
* @return 加密/解密后的数据
*/
- (NSData *)doBlockCipherWithAlgorithm:(CCAlgorithm)algorithm
key:(NSData *)key
iv:(NSData *)iv
operation:(CCOperation)operation
isPKCS7Padding:(BOOL)isPKCS7Padding
isECB:(BOOL)isECB;
/* 更新密钥。
* kCCKeySizeAES128 = 16
* kCCKeySizeAES192 = 24
* kCCKeySizeAES256 = 32
* keySize必须为上面中的某个,单位字节。
*/
- (void)updateKeyWithKeySize:(unsigned int)keySize;
//更新初始化向量
- (void)updateIV;
/* AES-128 加密
* @param plainData 待加密数据(明文数据)
* @return 加密后的数据(密文数据)
*/
- (NSData *)AES128Encrypt:(NSData *)plainData;
/* AES-128 解密
* @param cipherData 待解密数据(密文数据)
* @return 解密后的数据(明文数据)
*/
- (NSData *)AES128Decrypt:(NSData *)cipherData;
/* 加解密。当需要使用指定的密钥或初始化向量时,可以使用该方法。会修改_key、_iv。
* @param data 明文/密文
* @param key 密钥
* @param iv 初始化向量,可以为空
* @param operation kCCEncrypt/kCCDecrypt
* @return 加密/解密后的数据
*/
- (NSData *)doCipher:(NSData *)data
key:(NSData *)key
iv:(NSData *)iv
operation:(CCOperation)operation;