Swift中Triple DES加解密实现及CCAlgorithm等库引入问题求助
解决Swift中Triple DES加解密的库引入与实现问题
嘿,作为Swift和Xcode新手,碰到Triple DES的库问题确实容易懵,我来一步步帮你解决!
一、关于CCAlgorithm和CCOptions的库引入(系统CommonCrypto)
你提到的CCAlgorithm、CCOptions这些属于苹果系统自带的CommonCrypto框架,但Swift不能直接通过import引入它,需要做个桥接操作:
- 创建桥接文件
- 在Xcode里右键项目 -> New File -> 选择Objective-C File(随便起个名字,比如
CryptoBridge,类型选Header File) - 打开这个
CryptoBridge.h文件,添加一行代码:#import <CommonCrypto/CommonCrypto.h>
- 在Xcode里右键项目 -> New File -> 选择Objective-C File(随便起个名字,比如
- 配置桥接路径
- 选中项目根目录,进入Build Settings -> 搜索
Objective-C Bridging Header - 在对应输入框里填入桥接文件的路径,比如你的项目叫MyApp,路径就是
MyApp/CryptoBridge.h(如果文件在子文件夹里要对应调整)
- 选中项目根目录,进入Build Settings -> 搜索
完成这两步后,你就能在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
相关产品推荐
相关产品推荐

