首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >普通密码在Wave2.3和Xcode8.1中的应用

普通密码在Wave2.3和Xcode8.1中的应用
EN

Stack Overflow用户
提问于 2016-11-14 12:15:43
回答 1查看 202关注 0票数 0

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

我正在使用XCode8.1和Swid2.3

提前谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-14 12:26:23

如果您正在寻找一个完整的安全解决方案,非常容易地集成使用RNCryptor

如果您正在寻找一种部分解决方案,即不需要密码派生或身份验证的AES加密,请参阅下面的示例实现:

示例来自日落文档部分:

随机IV (Swift 3+)模式下的CBC加密

该iv以加密数据为前缀。

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

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

键应该是128位(16字节).有关其他密钥大小,请参见SWIFT3.0示例。

默认设置PKCS#7填充。

此示例需要通用密码(它需要为项目设置一个桥接头):

导入

将Security.framework添加到项目中。

注意事项见Swift 3示例。

这是一个例子,而不是生产代码。

代码语言:javascript
复制
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;
}

示例用法:

代码语言:javascript
复制
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))")

示例输出:

代码语言:javascript
复制
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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40588569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档