我有一个私钥/公钥对,我正在尝试用它们中的任何一个加密一个字符串。该代码在 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 相关的错误,默认情况下会将填充设置为 PKCS1。但是,我无法将此值设置为 NULL,因为 Swift 已将其替换为 nil 并且不能在此位置使用。