swift - [Swift._NSContiguousString 字节] : unrecognized selector sent to instance

标签 swift macos encryption foundation

我正在使用 Xcode 7.1 版 (7B91b),我正在使用 Swift 并构建一个 OSX 应用程序 (10.11.2)。我正在尝试生成并存储用于数据加密/解密的 RSA key 对。这是从以下位置获取的实现:'AsymmetricCrypto Github

// Constants
private let kAsymmetricCryptoManagerApplicationTag = "com.AsymmetricCrypto.keypair"
private let kAsymmetricCryptoManagerKeyType = kSecAttrKeyTypeRSA
private let kAsymmetricCryptoManagerKeySize = 2048
private let kAsymmetricCryptoManagerCypheredBufferSize = 1024
private let kAsymmetricCryptoManagerSecPadding: SecPadding = .PKCS1

func createSecureKeyPair(completion: ((success: Bool, error: AsymmetricCryptoException?) -> Void)? = nil) {
    // private key parameters
    let privateKeyParams: [String: AnyObject] = [
        kSecAttrIsPermanent as String: false,
        kSecAttrApplicationTag as String: kAsymmetricCryptoManagerApplicationTag
    ]

    // private key parameters
    let publicKeyParams: [String: AnyObject] = [
        kSecAttrIsPermanent as String: false,
        kSecAttrApplicationTag as String: kAsymmetricCryptoManagerApplicationTag
    ]

    // global parameters for our key generation
    let parameters: [String: AnyObject] = [
        kSecAttrKeyType as String:          kAsymmetricCryptoManagerKeyType,
        kSecAttrKeySizeInBits as String:    kAsymmetricCryptoManagerKeySize,
        kSecPublicKeyAttrs as String:       publicKeyParams,
        kSecPrivateKeyAttrs as String:      privateKeyParams,
    ]

    // asynchronously generate the key pair and call the completion block
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
        var pubKey, privKey: SecKeyRef?
        let status = SecKeyGeneratePair(parameters, &pubKey, &privKey)

        if status == errSecSuccess {
            dispatch_async(dispatch_get_main_queue(), { completion?(success: true, error: nil) })
        } else {
            var error = AsymmetricCryptoException.UnknownError
            switch (status) {
            case errSecDuplicateItem: error = .DuplicateFoundWhileTryingToCreateKey
            case errSecItemNotFound: error = .KeyNotFound
            case errSecAuthFailed: error = .AuthFailed
            default: break
            }
            dispatch_async(dispatch_get_main_queue(), { completion?(success: false, error: error) })
        }
    }
}

调用createSecureKeyPair()后,如下:

AsymmetricCryptoManager.sharedInstance.createSecureKeyPair({
    (success, error) -> Void in
        if (success) {
            print("keys created")
        } else {
            print("error: \(error)")
        }
    })

我收到这个错误:

2015-12-26 03:55:46.113 sectest[17165:20928431] -[Swift._NSContiguousString bytes]: unrecognized selector sent to instance 0x610000045880

当然,异常 AsymmetricCryptoException.UnknownError 被返回(意味着错误是未知性质的),如果有帮助,SecKeyGeneratePair() 返回值 -2070

奇怪的是 key (公钥和私钥)实际上是在钥匙串(keychain)中创建的:

Keys generated in the keychain from the code above

这个错误是什么以及如何从上面的代码中得到预期的行为?

最佳答案

我从 Apple Developer Forums 得到了问题的答案。问题在于:

private let kAsymmetricCryptoManagerApplicationTag = "com.AsymmetricCrypto.keypair"

参数字典的键 kSecAttrApplicationTag 的值需要是 CFDataRef,而不是字符串。下面一行,解决了这个问题。

private let kAsymmetricCryptoManagerApplicationTag = "com.sectest.keypair".dataUsingEncoding(NSUTF8StringEncoding)!

关于swift - [Swift._NSContiguousString 字节] : unrecognized selector sent to instance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34467722/

相关文章:

c# - 对于 AES 256 位,在 Java 中加密并在 C# 中解密

node.js - Nodejs 使用加密解密错误最终 block 长度错误

ios - sizeToFit() 返回错误的高度 - 需要在 heightForRow 中找到单元格宽度

macos - 如何在Mac OS X 10.6上安装GNU LD?

linux - 如何将日志文件重定向(管道)到控制台?

macos - 订阅 Spotify 事件

ios - 在无法存储原始字符串的情况下可逆地对 NSString 进行加扰

arrays - 是否存在 Swift 数组分配不一致的原因(既不是引用也不是深层复制)?

xcode - 确定 SpriteNode 何时落在矩形 SpriteNode 上

ios - 在 viewDidLoad Swift 之前更改初始 View