1

我有一个私钥/公钥对,我正在尝试用它们中的任何一个加密一个字符串。该代码在 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 并且不能在此位置使用。

4

1 回答 1

0

尽管这是一个很老的问题,但我会回答它以节省其他人一些时间:)

我遇到了同样的问题,出现SecTransformExecuteEXC_BAD_ACCESS错误。我注意到该错误只会在我更改或清理项目并重新构建应用程序时发生,但不会在我运行相同的调试版本时发生。

最后,使用开发证书对应用程序进行签名为我解决了这个问题,因为在应用程序无法使用密钥之前,由于 Xcode 提供了不同的自动签名身份。

于 2018-02-15T19:52:28.210 回答