一. iOS AES:
OC中提供了原生的AES加密方法,但swift并没有提供,所以如果在swift中使用AES加密的话,需要桥接使用OC代码,或者使用第三方框架CryptoSwift
AES加密中除需加密的内容外,还需传入两个参数,key为必须,iv偏移量为可选
//MARK:key
OC中的AES加密是通过key的bytes数组位数来进行AES128/192/256加密
key -> 加密方式
16 -> AES128
24 -> AES192
32 -> AES256
//MARK: iv
iv:偏移量,加密过程中会按照偏移量进行循环位移
//MARK:OC
1. 引入头文件 #include
- (NSData *)aesEncryptWithData:(NSData *)enData andKey:(NSData *)key iv:(NSData *)iv {
if (key.length != 16 && key.length != 24 && key.length != 32) {
return nil;
}
if (iv.length != 16 && iv.length != 0) {
return nil;
}
NSData *result = nil;
size_t bufferSize = enData.length + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
if (!buffer) return nil;
size_t encryptedSize = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,//填充方式
key.bytes,
key.length,
iv.bytes,
enData.bytes,
enData.length,
buffer,
bufferSize,
&encryptedSize);
if (cryptStatus == kCCSuccess) {
result = [[NSData alloc]initWithBytes:buffer length:encryptedSize];
free(buffer);
return result;
} else {
free(buffer);
return nil;
}
}
- (NSData *)aesDecryptWithData:(NSData *)deData andKey:(NSData *)key iv:(NSData *)iv {
if (key.length != 16 && key.length != 24 && key.length != 32) {
return nil;
}
if (iv.length != 16 && iv.length != 0) {
return nil;
}
NSData *result = nil;
size_t bufferSize = deData.length + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
if (!buffer) return nil;
size_t encryptedSize = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,//填充方式
key.bytes,
key.length,
iv.bytes,
deData.bytes,
deData.length,
buffer,
bufferSize,
&encryptedSize);
if (cryptStatus == kCCSuccess) {
result = [[NSData alloc]initWithBytes:buffer length:encryptedSize];
free(buffer);
return result;
} else {
free(buffer);
return nil;
}
}
Swift
swift中可以使用oc代码进行桥接,但在开发中会带来更多的麻烦,我在尝试后放弃李,果断使用CryptoSwift这个框架,功能丰富,简单易用。
在使用CryptoSwift时,我们可以使用比原声更丰富的AES加密选项,比如加密模式/填充方式等:
填充方式:
- parameters:
- noPadding
- zeroPadding
- pkcs7
- pkcs5
加密模式:
- CBC
— CTR
- OFB
- CFB
- ECB
使用方式也很简单
// do-catch进行异常抛出
do {
// 出初始化AES
let aes = try AES(key: byteKey, blockMode: CBC(iv: byteIv), padding: .pkcs5)
// 进行AES加密
encryptBytes = try aes.encrypt(byteText)
} catch {
// 异常处理
}