You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中Triple DES加解密实现及CCAlgorithm等库引入问题求助

解决Swift中Triple DES加解密的库引入与实现问题

嘿,作为Swift和Xcode新手,碰到Triple DES的库问题确实容易懵,我来一步步帮你解决!

一、关于CCAlgorithm和CCOptions的库引入(系统CommonCrypto)

你提到的CCAlgorithm、CCOptions这些属于苹果系统自带的CommonCrypto框架,但Swift不能直接通过import引入它,需要做个桥接操作:

  1. 创建桥接文件
    • 在Xcode里右键项目 -> New File -> 选择Objective-C File(随便起个名字,比如CryptoBridge,类型选Header File)
    • 打开这个CryptoBridge.h文件,添加一行代码:
      #import <CommonCrypto/CommonCrypto.h>
      
  2. 配置桥接路径
    • 选中项目根目录,进入Build Settings -> 搜索Objective-C Bridging Header
    • 在对应输入框里填入桥接文件的路径,比如你的项目叫MyApp,路径就是MyApp/CryptoBridge.h(如果文件在子文件夹里要对应调整)

完成这两步后,你就能在Swift代码里直接用kCCAlgorithm3DES(对应CCAlgorithm的Triple DES)、kCCOptionPKCS7Padding(CCOptions的填充方式)这些常量了。

用CommonCrypto实现Triple DES加密的示例代码

import UIKit

class CypherSwift: NSObject {
    func tripleDesEncrypt(pass: String, key: String, iv: String) -> String? {
        guard let keyData = key.data(using: .utf8),
              let ivData = iv.data(using: .utf8),
              let plainData = pass.data(using: .utf8) else {
            return nil
        }
        
        // Triple DES要求密钥长度为24字节(3*8),如果你的key不够,建议先哈希处理
        let keyBytes = keyData.prefix(24) // 取前24字节,或者用SHA256哈希后取前24字节
        let ivBytes = ivData.prefix(8) // IV长度为8字节
        
        let bufferSize = plainData.count + kCCBlockSize3DES
        var buffer = Data(count: bufferSize)
        var numBytesEncrypted: size_t = 0
        
        let status = CCCrypt(CCOperation(kCCEncrypt),
                             CCAlgorithm(kCCAlgorithm3DES),
                             CCOptions(kCCOptionPKCS7Padding),
                             keyBytes.baseAddress, keyBytes.count,
                             ivBytes.baseAddress,
                             plainData.baseAddress, plainData.count,
                             buffer.mutableBytes, bufferSize,
                             &numBytesEncrypted)
        
        guard status == kCCSuccess else {
            print("加密失败,错误码:\(status)")
            return nil
        }
        
        buffer.removeSubrange(numBytesEncrypted..<buffer.count)
        return buffer.base64EncodedString()
    }
}

二、用你已导入的CryptoSwift实现Triple DES(更简单)

既然你已经导入了CryptoSwift,其实可以直接用它封装好的Triple DES功能,不用折腾CommonCrypto的桥接:

示例代码

import UIKit
import CryptoSwift

class CypherSwift: NSObject {
    func tripleDesEncrypt(pass: String, key: String, iv: String) -> String? {
        do {
            // 处理密钥:Triple DES需要24字节密钥,这里用SHA256哈希后取前24字节
            let keyData = key.data(using: .utf8)!
            let hashedKey = SHA256.hash(data: keyData)
            let desKey = Array(hashedKey.prefix(24))
            
            // 处理IV:需要8字节
            let ivData = iv.data(using: .utf8)!
            let desIv = Array(ivData.prefix(8))
            
            // 加密:模式用CBC,填充用PKCS7(CryptoSwift默认)
            let encrypted = try DES3(key: desKey, blockMode: CBC(iv: desIv), padding: .pkcs7).encrypt(pass.utf8.map { $0 })
            
            // 转成Base64字符串返回
            return Data(encrypted).base64EncodedString()
        } catch {
            print("加密失败:\(error.localizedDescription)")
            return nil
        }
    }
}

注意事项

  • Triple DES的密钥必须是24字节(如果是16字节的话是双DES,不过标准Triple DES用24字节),所以如果你的密码字符串长度不够,一定要做哈希或者填充处理,避免加密失败。
  • IV(初始化向量)需要是8字节,通常建议用随机生成的IV,加密时和密文一起存储,解密时用同一个IV。

内容的提问来源于stack exchange,提问作者john

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:05:45