一. iOS AES:
OC中提供了原生的AES加密方法,但swift并沒(méi)有提供,所以如果在swift中使用AES加密的話,需要橋接使用OC代碼,或者使用第三方框架CryptoSwift
AES加密中除需加密的內(nèi)容外,還需傳入兩個(gè)參數(shù),key為必須,iv偏移量為可選
//MARK:key
OC中的AES加密是通過(guò)key的bytes數(shù)組位數(shù)來(lái)進(jìn)行AES128/192/256加密
key -> 加密方式
16 -> AES128
24 -> AES192
32 -> AES256
//MARK: iv
iv:偏移量,加密過(guò)程中會(huì)按照偏移量進(jìn)行循環(huán)位移
//MARK:OC
1. 引入頭文件 #include <CommonCrypto/CommonCrypto.h>
- (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代碼進(jìn)行橋接,但在開(kāi)發(fā)中會(huì)帶來(lái)更多的麻煩,我在嘗試后放棄李,果斷使用CryptoSwift這個(gè)框架,功能豐富,簡(jiǎn)單易用。
在使用CryptoSwift時(shí),我們可以使用比原聲更豐富的AES加密選項(xiàng),比如加密模式/填充方式等:
填充方式:
- parameters:
- noPadding
- zeroPadding
- pkcs7
- pkcs5
加密模式:
- CBC
— CTR
- OFB
- CFB
- ECB
使用方式也很簡(jiǎn)單
// do-catch進(jìn)行異常拋出
do {
// 出初始化AES
let aes = try AES(key: byteKey, blockMode: CBC(iv: byteIv), padding: .pkcs5)
// 進(jìn)行AES加密
encryptBytes = try aes.encrypt(byteText)
} catch {
// 異常處理
}