Swift AES加解密

文章介绍了如何在iOS项目中通过CryptoSwift库实现AES-ECB、CBC和GCM模式的加密与解密操作,以及三种包导入方法:SwiftPackage、CocoaPods和Carthage的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先需要导入包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)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

张子都

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

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

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

打赏作者

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

抵扣说明:

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

余额充值