我有一个私钥/公钥对,我正试图用它们中的任何一个加密字符串。该代码在OSX 10.11和Xcode 7.2 上运行
func encryptMessageWithKey(message: String, keyType: KeyType,
withCompletionBlock: (success: Bool, data: NSData?, error: AsymCryptoExceptions.Exceptions?)
-> Void) {
let uintData = [UInt8](message.utf8)
let sourceData = CFDataCreate(kCFAllocatorDefault, uintData, uintData.count)
let privKey = self.getPrivateKeyReference()!
var errorRef: Unmanaged<CFError>?
let encoder = SecEncryptTransformCreate(privKey, &errorRef)
SecTransformSetAttribute(encoder,
kSecPaddingKey,
kSecPaddingPKCS1Key,
&errorRef)
SecTransformSetAttribute(encoder,
kSecTransformInputAttributeName,
sourceData,
&errorRef)
var encryptedData = SecTransformExecute(encoder, &errorRef)
if (errorRef != nil) {
let error = errorRef!.takeRetainedValue()
print(error)
}
}
上述操作失败得很惨,导致应用程序在运行时使用EXEC_BAD_ACCESS
崩溃。没有错误,什么都没有。
我的研究表明,可能存在一个与显式指定kSecPaddingPKCS1Key
而不是NULL有关的错误,NULL将默认情况下将填充设置为PKCS1。然而,我无法将此值设置为NULL,因为Swift已将其替换为nil,并且不能在此处使用。
即使这是一个很老的问题,我也会回答它,也许可以为其他人节省一些时间:)
我遇到了同样的问题,SecTransformExecute
给出了EXC_BAD_ACCESS
错误。我注意到,只有当我更改或清理项目并重新构建应用程序时才会出现错误,但当我运行相同的调试构建时不会出现错误。
最后,用开发证书对应用程序进行签名是我解决问题的方法,因为之前由于Xcode提供的自动签名身份不同,应用程序无法使用密钥。