iOS AES加密的Swift(CryptoSwift)實(shí)現(xiàn)及OC實(shí)現(xiàn)

一. 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 {
    // 異常處理
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明AI閱讀 16,193評(píng)論 3 119
  • 無(wú)論你會(huì)多少種拳法都擋不住我蠻力一揮拳,那你為什么不揮拳與我對(duì)打呢?因?yàn)榱鉀](méi)有我大所以才要靠招式來(lái)贏!招式好學(xué),...
    咸魚也要有夢(mèng)想閱讀 272評(píng)論 0 0
  • 一半青光瀲滟 一半烏云相欺 半陰 半晴 半星閃爍 這一刻 綠光 動(dòng)人心魄 用掉我多少幸運(yùn) 才換得來(lái) 這 夢(mèng)中魔幻的...
    莫小薰閱讀 449評(píng)論 3 3
  • 早上我在練習(xí)聽(tīng)伴奏,小蛋兒叫醒的時(shí)候就沒(méi)理會(huì),等到第二次喊神奇時(shí)間的時(shí)候,給娃放了《the fox》的神曲,一分鐘...
    顏小彥_d20b閱讀 281評(píng)論 0 0

友情鏈接更多精彩內(nèi)容