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 <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代码进行桥接,但在开发中会带来更多的麻烦,我在尝试后放弃李,果断使用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 {
    // 异常处理
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,019评论 3 119
  • 无论你会多少种拳法都挡不住我蛮力一挥拳,那你为什么不挥拳与我对打呢?因为力气没有我大所以才要靠招式来赢!招式好学,...
    咸鱼也要有梦想阅读 225评论 0 0
  • 一半青光潋滟 一半乌云相欺 半阴 半晴 半星闪烁 这一刻 绿光 动人心魄 用掉我多少幸运 才换得来 这 梦中魔幻的...
    莫小薰阅读 441评论 3 3
  • 早上我在练习听伴奏,小蛋儿叫醒的时候就没理会,等到第二次喊神奇时间的时候,给娃放了《the fox》的神曲,一分钟...
    颜小彦_d20b阅读 263评论 0 0