ios - swift 2.3 和 Xcode8.1 中的通用加密

标签 ios iphone json swift commoncrypto

我正在尝试通过在 CryptoSwift 中使用 AES 加密来实现。有人建议 cryptoswift 比 commonCrypto 慢 500 到 1000 倍。任何人都可以帮助我将 commonCrypto 集成到我的项目中。一步步解释?

我在 XCode8.1 和 swift 2.3 中使用

提前致谢

最佳答案

如果您正在寻找可以轻松集成的完整安全解决方案,请使用 RNCryptor

如果您正在寻找部分解决方案,那只是没有密码派生或身份验证的 AES 加密,请查看此示例实现:

来自已停用文档部分的示例:

CBC 模式下的 AES 加密,带有随机 IV (Swift 3+)

iv是加密数据的前缀

aesCBC128Encrypt 将创建一个随机 IV 并作为加密代码的前缀。 aesCBC128Decrypt 将在解密过程中使用带前缀的 IV。

输入是数据,键是数据对象。如果需要在调用方法中转换为和/或自 Base64 等编码形式。

key 应该正好是 128 位(16 字节)。对于其他 key 大小,请参阅 Swift 3.0 示例。

默认设置 PKCS#7 填充。

这个例子需要通用加密 必须有一个到项目的桥接头:

导入

将 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>

关于ios - swift 2.3 和 Xcode8.1 中的通用加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40588569/

相关文章:

ios - object-c 中的属性下划线实例和 getter 及其在 swift 中的等效项

ios - 使iOS App具有与Excel Sheet相同的功能

ios - 为什么动画中的图像无法显示?

iphone - 调用了 "StopUpdatingLocation"但 GPS 箭头没有消失

iphone - 默认 UITableViewCellStyleSubtitle 字体大小?

json - 为嵌套的 JSON 数据创建 Hive 表

iOS 使用日期选择器动态更改单元格的内容

iphone - iOS - 播放带有效果的流媒体(mp3)音频

java - 该列表的格式是什么?

javascript - 如何使用 Ajax 和 JSON 制作下拉菜单?