swift 2.3 和 Xcode8.1 中的通用加密
Posted
技术标签:
【中文标题】swift 2.3 和 Xcode8.1 中的通用加密【英文标题】:common crypto in swift 2.3 and Xcode8.1 【发布时间】:2016-11-14 12:15:43 【问题描述】:我正在尝试通过在 CryptoSwift 中使用 AES 加密来实现。有人建议 cryptoswift 比 commonCrypto 慢 500 到 1000 倍。任何人都可以帮助我将 commonCrypto 集成到我的项目中。一步一步解释?
我在 XCode8.1 和 swift 2.3 中使用
提前致谢
【问题讨论】:
[swift] commoncrypto
在 SO 上有 >100 次点击。请展示您尝试过的内容以及卡在哪里。就目前而言,您的问题太宽泛了。
我试图整合,但它显示了一些错误。我来不及了
最好避免使用 CryptoSwift,除此之外,它比基于 Common Crypto 的实现慢 500 到 1000 倍。 Apple 的 Common Crypto 已通过 FIPS 认证,因此经过严格审查,使用 CryptoSwift 在正确性和安全性方面是有机会的。
@zaph : 你能解释一下整合吗
【参考方案1】:
如果您正在寻找可以轻松集成的完整安全解决方案,请使用RNCryptor。
如果您正在寻找部分解决方案,即只是没有密码派生或身份验证的 AES 加密,请查看此示例实现:
日落文档部分的示例:
CBC 模式下的 AES 加密,带有随机 IV (Swift 3+)
iv 是加密数据的前缀
aesCBC128Encrypt 将创建一个随机 IV 并作为加密代码的前缀。 aesCBC128Decrypt 将在解密过程中使用前缀 IV。
输入是数据,键是数据对象。如果需要在调用方法中转换为和/或从编码形式(如 Base64)。
密钥应该正好是 128 位(16 字节)。有关其他密钥大小,请参阅 Swift 3.0 示例。
默认设置 PKCS#7 填充。
此示例需要 Common Crypto 项目必须有一个桥接头:
进口
将 Security.framework 添加到项目中。
有关注释,请参阅 Swift 3 示例。
这是示例,不是生产代码。
func aesCBC128Encrypt(data data:[UInt8], keyData:[UInt8]) -> [UInt8]?
let keyLength = size_t(kCCKeySizeAES128)
let ivLength = size_t(kCCBlockSizeAES128)
let cryptDataLength = size_t(data.count + kCCBlockSizeAES128)
var cryptData = [UInt8](count:ivLength + cryptDataLength, repeatedValue:0)
let status = SecRandomCopyBytes(kSecRandomDefault, Int(ivLength), UnsafeMutablePointer<UInt8>(cryptData));
if (status != 0)
print("IV Error, errno: \(status)")
return nil
var numBytesEncrypted :size_t = 0
let cryptStatus = CCCrypt(CCOperation(kCCEncrypt),
CCAlgorithm(kCCAlgorithmAES128),
CCOptions(kCCOptionPKCS7Padding),
keyData, keyLength,
cryptData,
data, data.count,
&cryptData + ivLength, cryptDataLength,
&numBytesEncrypted)
if UInt32(cryptStatus) == UInt32(kCCSuccess)
cryptData.removeRange(numBytesEncrypted+ivLength..<cryptData.count)
else
print("Error: \(cryptStatus)")
return nil;
return cryptData;
func aesCBC128Decrypt(data data:[UInt8], keyData:[UInt8]) -> [UInt8]?
let clearLength = size_t(data.count)
var clearData = [UInt8](count:clearLength, repeatedValue:0)
let keyLength = size_t(kCCKeySizeAES128)
let ivLength = size_t(kCCBlockSizeAES128)
var numBytesDecrypted :size_t = 0
let cryptStatus = CCCrypt(CCOperation(kCCDecrypt),
CCAlgorithm(kCCAlgorithmAES128),
CCOptions(kCCOptionPKCS7Padding),
keyData, keyLength,
data,
UnsafePointer<UInt8>(data) + ivLength, data.count - ivLength,
&clearData, clearLength,
&numBytesDecrypted)
if UInt32(cryptStatus) == UInt32(kCCSuccess)
clearData.removeRange(numBytesDecrypted..<clearLength)
else
print("Error: \(cryptStatus)")
return nil;
return clearData;
示例用法:
let clearData = toData("clearData0123456")
let keyData = toData("keyData890123456")
print("clearData: \(toHex(clearData))")
print("keyData: \(toHex(keyData))")
let cryptData = aesCBC128Encrypt(data:clearData, keyData:keyData)!
print("cryptData: \(toHex(cryptData))")
let decryptData = aesCBC128Decrypt(data:cryptData, keyData:keyData)!
print("decryptData: \(toHex(decryptData))")
示例输出:
clearData: <636c6561 72446174 61303132 33343536>
keyData: <6b657944 61746138 39303132 33343536>
cryptData: <9fce4323 830e3734 93dd93bf e464f72a a653a3a5 2c40d5ea e90c1017 958750a7 ff094c53 6a81b458 b1fbd6d4 1f583298>
decryptData: <636c6561 72446174 61303132 33343536>
【讨论】:
以上是关于swift 2.3 和 Xcode8.1 中的通用加密的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 8.2,Swift 编译器错误:错误:意外的输入文件
我无法在 swift 2.3 中播放保存在目录路径和 AVPlayer 中的视频
当我打开 .swift/.xib 文件时,XCode 8.1 崩溃