iOS AES CBC 加解密

648 阅读1分钟

背景

最近项目有对一些配置项信息下发做了加解密的工作,所以记录一下。

实现

导入AES加解密框架 CryptoSwift

Easy to use

Convenient extensions for String and Data

Support for incremental updates (stream, ...)

iOS, Android, macOS, AppleTV, watchOS, Linux support 

Hash (Digest)

MD5 | SHA1 | SHA2-224 | SHA2-256 | SHA2-384 | SHA2-512 | SHA3 

Cyclic Redundancy Check (CRC)

CRC32 | CRC32C | CRC16

Cipher 

AES-128, AES-192, AES-256 | ChaCha20 | Rabbit | Blowfish 

RSA (public-key encryption algorithm) 

Encryption, Signature 

Message authenticators 

支持多种算法加解密,很棒的库。

后台数据下发json为16进制字符串,我们要先通过转换成UInt8字节数组来解密

func fx_bytes(from hexStr: String) -> [UInt8] {
    assert(hexStr.count % 2 == 0, "输入字符串格式不对,8位代表一个字符")

    var bytes = [UInt8]()

    var sum = 0

    let intRange = 48...57

    let lowercaseRange = 97...102

    let uppercasedRange = 65...70

    for (index, c) in hexStr.utf8CString.enumerated() {

        var intC = Int(c.byteSwapped)

        if intC == 0 {

        break

    } else if intRange.contains(intC) {

        intC -= 48

    } else if lowercaseRange.contains(intC) {

        intC -= 87

    } else if uppercasedRange.contains(intC) {

        intC -= 55

    } else {

        assertionFailure("输入字符串格式不对,每个字符都需要在0~9,a~f,A~F内")

    }

    sum = sum * 16 + intC

    if index % 2 != 0 {

    bytes.append(UInt8(sum))

    sum = 0

    }

            }

    return bytes

        }

加解密

// AES 解密

public func fx_decryptStr(value: String) -> String {

    var key = "abcdabcdabcdabcdabcdabcdabcdabc"

    let iv = "00000000000000000000000000000000"

    do {
    let aes = try AES(key: fx_bytes(from: key), blockMode: CBC(iv:fx_bytes(from: iv)), padding: .pkcs7)

    let decrypted = try aes.decrypt(fx_bytes(from: value))

    let datastring = String(bytes: decrypted, encoding: .utf8)

    return datastring ?? value

    } catch {

    return value

   }

    }

// AES 加密

public func fx_encryptStr(value: String) -> String {

    var key = "abcdabcdabcdabcdabcdabcdabcdabc"

    let iv = "00000000000000000000000000000000"

    do {

    let aes = try AES(key: fx_bytes(from: key), blockMode: CBC(iv:fx_bytes(from: iv)), padding: .pkcs7)

    let encrypted = try aes.encrypt(fx_bytes(from: value))

    return String(bytes: Data(encrypted).bytes, encoding: .utf8) ?? value

    } catch {

    return value

    }

    }