我正在尝试使用密钥对加密来验证我的应用程序和我的
PHP服务器之间的身份.为此,我需要在我的应用程序中生成公钥后将公钥发送到服务器.
if let pubKey = NSData(base64EncodedData: publicKey,options: NSDataBase64DecodingOptions.allZeros)! { println(pubKey) }
publicKey的类型为Unmanaged< SecKey>.
我在上面的代码中得到的错误是:调用中的额外参数’base64EncodedData’
我该怎么办?有没有更好的办法?
编辑:这是密钥对的生成方式:
var publicKeyPtr,privateKeyPtr: Unmanaged<SecKey>? let parameters = [ String(kSecAttrKeyType): kSecAttrKeyTypeRSA,String(kSecAttrKeySizeInBits): 2048 ] let result = SecKeyGeneratePair(parameters,&publicKeyPtr,&privateKeyPtr) let publicKey = publicKeyPtr!.takeRetainedValue() let privateKey = privateKeyPtr!.takeRetainedValue() let blockSize = SecKeyGetBlockSize(publicKey)
编辑2:所以问题是SecKey不是NSData,所以我的问题应该是:如何将publicKey:SecKey转换为NSData?
您似乎可以将密钥临时存储到钥匙串,然后将其恢复并将其转换为数据:
func convertSecKeyToBase64(inputKey: SecKey) ->String? { // First Temp add to keychain let tempTag = "de.a-bundle-id.temp" let addParameters :[String:AnyObject] = [ String(kSecclass): kSecclassKey,String(kSecAttrApplicationTag): tempTag,String(kSecAttrKeyType): kSecAttrKeyTypeRSA,String(kSecValueRef): inputKey,String(kSecReturnData):kcfBooleanTrue ] var keyPtr: Unmanaged<AnyObject>? let result = SecItemAdd(addParameters,&keyPtr) switch result { case noErr: let data = keyPtr!.takeRetainedValue() as! NSData // Remove from Keychain again: SecItemDelete(addParameters) let encodingParameter = NSDataBase64EncodingOptions(rawValue: 0) return data.base64EncodedStringWithOptions(encodingParameter) case errSecDuplicateItem: println("Duplicate Item") SecItemDelete(addParameters) return nil case errSecItemNotFound: println("Not found!") return nil default: println("Error: \(result)") return nil } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。