2015-12-26 21 views
1

我正在使用Xcode版本7.1(7B91b),我正在使用Swift并构建OSX应用程序(10.11.2)。我正在尝试生成并存储用于数据加密/解密的RSA密钥对。以下是已经从采取的实现:“AsymmetricCrypto Github[Swift._NSContiguousString bytes]:发送到实例的无法识别的选择器

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

怪异的部分是密钥(公共和私人)在钥匙串实际创建这样:

Keys generated in the keychain from the code above

这是什么错误,以及如何能得到预期的行为出来的代码以上?

回答

0

我从Apple开发者论坛得到了问题的答案。问题是:

private let kAsymmetricCryptoManagerApplicationTag = "com.AsymmetricCrypto.keypair" 

关键kSecAttrApplicationTag值的PARAMS字典需要一个CFDataRef,不串。下面的行解决了这个问题。

private let kAsymmetricCryptoManagerApplicationTag = "com.sectest.keypair".dataUsingEncoding(NSUTF8StringEncoding)! 
相关问题