2016-11-14 17 views
0

我试图通过在CryptoSwift中使用AES加密来实现。有人建议cryptoswift比commonCrypto慢500到1000倍。任何人都可以帮助我将commonCrypto集成到我的项目中。一步一步解释?swift 2.3和Xcode8.1中的常见加密方式

我正在使用XCode8.1和SWIFT 2.3

由于提前

+0

上有SO> 100个命中为'[迅速] commoncrypto'。请显示您尝试的内容以及您卡住的位置。就目前而言,你的问题太广泛了。 –

+0

我试图整合,但它显示出一些错误。我无法做到这一点 – iPhone25

+0

最好避免使用CryptoSwift,其他事情比基于Common Crypto的实现慢500到1000倍。 Apple的Common Crypto已通过FIPS认证,并且经过充分审查,使用CryptoSwift正在考虑正确性和安全性。 – zaph

回答

1

如果您正在寻找整合相当容易使用RNCryptor一个完整安全的解决方案。

如果你正在寻找一个部分解决方案,那就是没有密码导出或认证看看这个例子执行AES加密:从已停用文档部分

例子:

AES加密CBC模式随机IV(SWIFT 3+)

的IV被前缀到加密的数据

aesCBC128Encrypt将创建一个RANDO m IV并以加密码为前缀。 aesCBC128Decrypt将在解密期间使用前缀IV。

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

密钥应该正好是128位(16字节)。对于其他密钥大小,请参阅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("clearData") 
let keyData = toData("keyData89") 

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>