iOS AES加密的Swift(CryptoSwift)实现及OC实现

一. 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 {
    // 异常处理
}

你可能感兴趣的:(iOS AES加密的Swift(CryptoSwift)实现及OC实现)