Swift AES加解密

首先需要导入包CryptoSwift

导入方式一

swift-pakage

https://github.com/krzyzanowskim/CryptoSwift.git

导入方式二

pod

pod 'CryptoSwift', '~> 1.7.2'

导入方式三

Carthage

github "krzyzanowskim/CryptoSwift"

工具类

/// 加密工具类
public class AESEncyptUtil: NSObject {
    /// AES-ECB 在进行 AES 加密时,CryptoSwift 会根据密钥的长度自动选择对应的加密算法(AES128, AES192, AES256)
    /// - Parameters:
    ///   - encryptText: 需要加密的数据
    ///   - key: 密钥 AES-128 = 16 bytes, AES-192 = 24 bytes, AES-256 = 32 bytes,不够位数,则自动尾部补0,直到自动补齐至加密位数
    /// - Returns: 加密后的数据
    public static func encrypt_AES_ECB(encryptText: String, key: String) throws -> String {
        /// 使用AES_ECB模式
        let aes = try AES(key: Padding.zeroPadding.add(to: key.bytes, blockSize: AES.blockSize),
                          blockMode: ECB())
        /// 开始加密
        let encrypted = try aes.encrypt(encryptText.bytes)
        /// 将加密结果转成base64形式
        return encrypted.toBase64()
    }
    
    /// AES-ECB 在进行 AES 加密时,CryptoSwift 会根据密钥的长度自动选择对应的加密算法(AES128, AES192, AES256)
    /// - Parameters:
    ///   - encryptData: 需要加密的数据
    ///   - key: 密钥 AES-128 = 16 bytes, AES-192 = 24 bytes, AES-256 = 32 bytes,不够位数,则自动尾部补0,直到自动补齐至加密位数
    /// - Returns: 加密后的数据
    public static func encryptData_AES_ECB(encryptData: Data, key: String) throws -> Data {
        /// 使用AES_ECB模式
        let aes = try AES(key: Padding.zeroPadding.add(to: key.bytes, blockSize: AES.blockSize),
                          blockMode: ECB())
        /// 开始加密
        let encrypted = try aes.encrypt(encryptData.bytes)
        /// 将加密结果转成base64形式
        return Data(encrypted)
    }

    /// AES-ECB解密
    /// - Parameters:
    ///   - decryptText: 需要解密的数据
    ///   - key: 密钥
    /// - Returns: 解密后的内容
    public static func decrypt_AES_ECB(decryptText: String, key: String) throws -> String {
        /// 使用AES_ECB模式
        let aes = try AES(key: Padding.zeroPadding.add(to: key.bytes, blockSize: AES.blockSize),
                          blockMode: ECB())
        let decrypted = try decryptText.decryptBase64ToString(cipher: aes)
        return decrypted
    }
    
    /// AES-ECB解密
    /// - Parameters:
    ///   - decryptData: 需要解密的数据
    ///   - key: 密钥
    /// - Returns: 解密后的内容
    public static func decryptData_AES_ECB(decryptData: Data, key: String) throws -> Data {
        /// 使用AES_ECB模式
        let aes = try AES(key: Padding.zeroPadding.add(to: key.bytes, blockSize: AES.blockSize),
                          blockMode: ECB())
        let decrypted = try aes.decrypt(decryptData.bytes)
        return Data(decrypted)
    }

    /// AES_CBC 加密
    /// - Parameters:
    ///   - encryptText: 需要加密的数据
    ///   - key: 密钥
    ///   - ivs: 密钥偏移量
    /// - Returns: 加密后的数据
    public static func encrypt_AES_CBC(encryptText: String, key: String, ivs: String) throws -> String {
        /// 使用AES_CBC模式
        let aes = try AES(key: Padding.zeroPadding.add(to: key.bytes, blockSize: AES.blockSize), blockMode: CBC(iv: ivs.bytes))

        /// 开始加密
        let encrypted = try aes.encrypt(encryptText.bytes)
        /// 将加密结果转成base64形式
        return encrypted.toBase64()
    }

    /// AES_CBC 解密
    /// - Parameters:
    ///   - decryptText: 需要解密的数据
    ///   - key: 秘钥
    ///   - ivs: 密钥偏移量
    /// - Returns: 解密后的数据
    public static func decrypt_AES_CBC(decryptText: String, key: String, ivs: String) throws -> String {
        /// 使用AES_CBC模式
        let aes = try AES(key: Padding.zeroPadding.add(to: key.bytes, blockSize: AES.blockSize), blockMode: CBC(iv: ivs.bytes))
        /// 开始解密 从加密后的base64字符串解密
        let decrypted = try decryptText.decryptBase64ToString(cipher: aes)
        return decrypted
    }

    /// AES_GCM 加密
    /// - Parameters:
    ///   - encryptText: 需要加密的数据
    ///   - key: 密钥
    ///   - ivs: 密钥偏移量
    /// - Returns: 加密后的数据
    public static func encrypt_AES_GCM(encryptText: Array<UInt8>, key: Array<UInt8>, ivs: Array<UInt8>) throws -> Array<UInt8> {
        let gcm = GCM(iv: ivs, mode: .combined)
        let aes = try AES(key: key, blockMode: gcm, padding: .noPadding)
        let encrypted = try aes.encrypt(encryptText)
        _ = gcm.authenticationTag
        return encrypted
    }

    /// AES_GCM 解密
    /// - Parameters:
    ///   - decryptText: 需要解密的数据
    ///   - key: 秘钥
    ///   - ivs: 密钥偏移量
    /// - Returns: 解密后的数据
    public static func decrypt_AES_GCM(decryptText: Array<UInt8>, key: Array<UInt8>, ivs: Array<UInt8>) throws -> Array<UInt8> {
        let gcm = GCM(iv: ivs, mode: .combined)
        let aes = try AES(key: key, blockMode: gcm, padding: .noPadding)
        return try aes.decrypt(decryptText)
    }
}

使用示例

/// 加密
let key = "1234567890123456"
let en = try? AESEncyptUtil.encrypt_AES_ECB(encryptText: "123", key: key)
if let str = en {
   print(str)
/// 加密
   let de = try? AESEncyptUtil.decrypt_AES_ECB(decryptText: str, key: key)
    print(de)
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Swift中提供了ASE加密解密的功能,可以使用CommonCrypto库来实现。下面是一个简单的示例代码: ```swift import CommonCrypto // 加密函数 func encryptAES(data: Data, key: Data, iv: Data) throws -> Data { let cryptLength = size_t(data.count + kCCBlockSizeAES128) var cryptData = Data(count: cryptLength) var numBytesEncrypted: size_t = 0 let cryptStatus = cryptData.withUnsafeMutableBytes { cryptBytes in data.withUnsafeBytes { dataBytes in key.withUnsafeBytes { keyBytes in iv.withUnsafeBytes { ivBytes in CCCrypt(CCOperation(kCCEncrypt), CCAlgorithm(kCCAlgorithmAES), CCOptions(kCCOptionPKCS7Padding), keyBytes, key.count, ivBytes, dataBytes, data.count, cryptBytes, cryptLength, &numBytesEncrypted) } } } } guard cryptStatus == kCCSuccess else { throw NSError(domain: "Encryption Error", code: Int(cryptStatus), userInfo: nil) } cryptData.removeSubrange(numBytesEncrypted..<cryptData.count) return cryptData } // 解密函数 func decryptAES(data: Data, key: Data, iv: Data) throws -> Data { let cryptLength = size_t(data.count + kCCBlockSizeAES128) var cryptData = Data(count: cryptLength) var numBytesDecrypted: size_t = 0 let cryptStatus = cryptData.withUnsafeMutableBytes { cryptBytes in data.withUnsafeBytes { dataBytes in key.withUnsafeBytes { keyBytes in iv.withUnsafeBytes { ivBytes in CCCrypt(CCOperation(kCCDecrypt), CCAlgorithm(kCCAlgorithmAES), CCOptions(kCCOptionPKCS7Padding), keyBytes, key.count, ivBytes, dataBytes, data.count, cryptBytes, cryptLength, &numBytesDecrypted) } } } } guard cryptStatus == kCCSuccess else { throw NSError(domain: "Decryption Error", code: Int(cryptStatus), userInfo: nil) } cryptData.removeSubrange(numBytesDecrypted..<cryptData.count) return cryptData } // 使用示例 let plaintext = "Hello, World!" let key = Data("01234567890123456789012345678901".utf8) let iv = Data("abcdefghijklmnop".utf8) let encryptedData = try encryptAES(data: Data(plaintext.utf8), key: key, iv: iv) print("Encrypted: \(encryptedData.base64EncodedString())") let decryptedData = try decryptAES(data: encryptedData, key: key, iv: iv) let decryptedText = String(data: decryptedData, encoding: .utf8) print("Decrypted: \(decryptedText ?? "")") ``` 上述代码中的`key`和`iv`需要根据实际情况来设置,其中`key`必须是16、24或32字节长度的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张子都

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值