对称加密的特点
- 加密/解密使用
相同的密钥
- 是
可逆
的
经典算法
- DES
- 3DES
- AES
废话不多说 直接上 工具类
提示:
1> 加密过程是先加密,再base64编码
2> 解密过程是先base64解码,再解密
- 实例
#pragma mark - 对称加密
- (void)encryption:(NSString *)pwdStr{
// 秘钥
NSString *keyString = @"abcsdhflasdh sldfhlsdflskdhfalsdf lsdkhfalsd ";
//1.AES---ECB
/*
第一个参数:要加密的字符串
第二个参数:密钥
第三个参数:向量 nil
*/
// 加密
NSLog(@"AES-ECB加密:%@",[[EncryptionTools sharedEncryptionTools] encryptString:pwdStr keyString:keyString iv:nil]);
// 解密
NSLog(@"AES-ECB解密:%@",[[EncryptionTools sharedEncryptionTools] decryptString:@"vvUxQURv1pr20SV0ercEpg==" keyString:keyString iv:nil]);
//2.AES---CBC
uint8_t iv[8] = {1,2,3,4,5,6,7,8};
NSData *data = [[NSData alloc]initWithBytes:iv length:sizeof(iv)];
// 加密
NSLog(@"AES-CBC加密:%@",[[EncryptionTools sharedEncryptionTools] encryptString:pwdStr keyString:keyString iv:data]);
// 解密
NSLog(@"AES-CBC解密:%@",[[EncryptionTools sharedEncryptionTools] decryptString:@"Ylvqls4DdwqJ6zIfvpjgRg==" keyString:keyString iv:data]);
//3.DES ---ECB
[EncryptionTools sharedEncryptionTools].algorithm = kCCAlgorithmDES; //修改加密方式为DES
// 加密
NSLog(@"DES-ECB加密:%@",[[EncryptionTools sharedEncryptionTools] encryptString:pwdStr keyString:keyString iv:nil]);
// 解密
NSLog(@"DES-ECB解密:%@",[[EncryptionTools sharedEncryptionTools] decryptString:@"2TLQyEv635U=" keyString:keyString iv:nil]);
}
结果
相关资料
- .h中
@interface EncryptionTools : NSObject
+ (instancetype)sharedEncryptionTools;
/**
@constant kCCAlgorithmAES 高级加密标准,128位(默认)
@constant kCCAlgorithmDES 数据加密标准
*/
@property (nonatomic, assign) uint32_t algorithm;
/**
* 加密字符串并返回base64编码字符串
*
* @param string 要加密的字符串
* @param keyString 加密密钥
* @param iv 初始化向量(8个字节)
*
* @return 返回加密后的base64编码字符串
*/
- (NSString *)encryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;
/**
* 解密字符串
*
* @param string 加密并base64编码后的字符串
* @param keyString 解密密钥
* @param iv 初始化向量(8个字节)
*
* @return 返回解密后的字符串
*/
- (NSString *)decryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;
@end
- .m中
#import "EncryptionTools.h"
@interface EncryptionTools()
@property (nonatomic, assign) int keySize;
@property (nonatomic, assign) int blockSize;
@end
@implementation EncryptionTools
+ (instancetype)sharedEncryptionTools
{
static EncryptionTools *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
instance.algorithm = kCCAlgorithmAES;
});
return instance;
}
- (void)setAlgorithm:(uint32_t)algorithm
{
_algorithm = algorithm;
switch (algorithm) {
case kCCAlgorithmAES:
self.keySize = kCCKeySizeAES128;
self.blockSize = kCCBlockSizeAES128;
break;
case kCCAlgorithmDES:
self.keySize = kCCKeySizeDES;
self.blockSize = kCCBlockSizeDES;
break;
default:
break;
}
}
- (NSString *)encryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv
{
// 设置秘钥
NSData *keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding];
uint8_t cKey[self.keySize];
bzero(cKey, sizeof(cKey));
[keyData getBytes:cKey length:self.keySize];
// 设置iv
uint8_t cIv[self.blockSize];
bzero(cIv, self.blockSize);
int option = 0;
/**
kCCOptionPKCS7Padding CBC 的加密
kCCOptionPKCS7Padding | kCCOptionECBMode ECB 的加密
*/
if (iv) {
[iv getBytes:cIv length:self.blockSize];
option = kCCOptionPKCS7Padding;
} else {
option = kCCOptionPKCS7Padding | kCCOptionECBMode;
}
// 设置输出缓冲区
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
size_t bufferSize = [data length] + self.blockSize;
void *buffer = malloc(bufferSize);
// 开始加密
size_t encryptedSize = 0;
/*
CCCrypt 对称加密算法的核心函数(加密/解密)
第一个参数:kCCEncrypt 加密/ kCCDecrypt 解密
第二个参数:加密算法,默认使用的是 AES/DES
第三个参数:加密选项 ECB/CBC
kCCOptionPKCS7Padding CBC 的加密
kCCOptionPKCS7Padding | kCCOptionECBMode ECB 的加密
第四个参数:加密密钥
第五个参数:密钥的长度
第六个参数:初始向量
第七个参数:加密的数据
第八个参数:加密的数据长度
第九个参数:密文的内存地址
第十个参数:密文缓冲区的大小
第十一个参数:加密结果的大小
*/
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
self.algorithm,
option,
cKey,
self.keySize,
cIv,
[data bytes],
[data length],
buffer,
bufferSize,
&encryptedSize);
NSData *result = nil;
if (cryptStatus == kCCSuccess) {
result = [NSData dataWithBytesNoCopy:buffer length:encryptedSize];
} else {
free(buffer);
NSLog(@"[错误] 加密失败|状态编码: %d", cryptStatus);
}
return [result base64EncodedStringWithOptions:0];
}
- (NSString *)decryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv
{
// 设置秘钥
NSData *keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding];
uint8_t cKey[self.keySize];
bzero(cKey, sizeof(cKey));
[keyData getBytes:cKey length:self.keySize];
// 设置iv
uint8_t cIv[self.blockSize];
bzero(cIv, self.blockSize);
int option = 0;
if (iv) {
[iv getBytes:cIv length:self.blockSize];
option = kCCOptionPKCS7Padding;
} else {
option = kCCOptionPKCS7Padding | kCCOptionECBMode;
}
// 设置输出缓冲区
NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:0];
size_t bufferSize = [data length] + self.blockSize;
void *buffer = malloc(bufferSize);
// 开始解密
size_t decryptedSize = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
self.algorithm,
option,
cKey,
self.keySize,
cIv,
[data bytes],
[data length],
buffer,
bufferSize,
&decryptedSize);
NSData *result = nil;
if (cryptStatus == kCCSuccess) {
result = [NSData dataWithBytesNoCopy:buffer length:decryptedSize];
} else {
free(buffer);
NSLog(@"[错误] 解密失败|状态编码: %d", cryptStatus);
}
return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
}
@end