OC学习61:AES对称加密算法

张建 lol

前言

AES(英文:Advanced Encryption Standard)即 高级加密标准算法,是一种 对称加密算法,是美国联邦政府采用的一种区块加密标准,目前在实际应用中极为广泛。

AES 固定长度为 128Bit秘钥 长度则可以是 128/192/256Bit

AES 加密模式

AES 有多种加密模式,ECB、CBC、CFB、OFB 四种,至于选择那种,你需要和服务端人员协商好,要一致。

使用

  1. 导入头文件
1
2
#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonCrypto.h>
  1. 封装AES加解密方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// AES加解密
- (NSData *)AES128Operation:(CCOperation)operation data:(NSData *)data key:(NSString *)key iv:(NSString *)iv{
// kCCKeySizeAES128 是加密位数,可以替换成192/256位的
char keyPtr[kCCKeySizeAES128 + 1];
/*
memset(<#void *__b#>, <#int __c#>, <#size_t __len#>)
将 keyPtr 后面长度为 sizeof(keyPtr) 用 0 替换,返回新 keyPtr
*/
memset(keyPtr, 0, sizeof(keyPtr));
// NSString 转为 char *
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

// iv
char ivPtr[kCCBlockSizeAES128 + 1];
// 等价memset
bzero(ivPtr, sizeof(ivPtr));
[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];

// 原数据大小
size_t bufferSize = [data length] + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;

// 设置加密参数
/*
iOS默认是CBC,如果需要其他加密方式如 ECB,则在 kCCOptionPKCS7Padding 后面加上 kCCOptionECBMode
即 kCCOptionPKCS7Padding | kCCOptionECBMode,但是记得修改上边的偏移量,因为只有CBC模式有偏移量之说
*/
CCCryptorStatus cryptorStatus = CCCrypt(operation,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
keyPtr,
kCCKeySizeAES128,
ivPtr,
[data bytes],
[data length],
buffer,
bufferSize,
&numBytesEncrypted);
if (cryptorStatus == kCCSuccess) {
NSLog(@"Success");
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}else {
NSLog(@"Error");
}
free(buffer);
return nil;
}

  1. 使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 客户端与服务端协商一致的 key
NSString * AES_KEY = @"zj";
// 客户端与服务端协商一致的 iv(偏移量)
NSString * AES_IV = @"zhangjian";

// 需要加密的字符串
NSString * str = @"需要加解密的字符串";

// 加密
NSData * data_str = [str dataUsingEncoding:NSUTF8StringEncoding];
NSData * encrypt_data = [self AES128Operation:kCCEncrypt data:data_str key:AES_KEY iv:AES_IV];
NSString * encrypt_str = [encrypt_data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];;
NSLog(@"AES加密:%@",encrypt_str);

// 解密
NSData * decrypt_data = [self AES128Operation:kCCDecrypt data:encrypt_data key:AES_KEY iv:AES_IV];
NSString * decrypt_str = [[NSString alloc] initWithData:decrypt_data encoding:NSUTF8StringEncoding];
NSLog(@"AES解密:%@",decrypt_str);
  • Post title:OC学习61:AES对称加密算法
  • Post author:张建
  • Create time:2023-06-15 15:44:40
  • Post link:https://redefine.ohevan.com/2023/06/15/OC/OC学习61:AES对称加密算法/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
On this page
OC学习61:AES对称加密算法