如何在 Swift 中为 IOS 生成 RSA 非对称密钥对?

C L*_*aux 6 cryptography rsa ios swift

我需要一种在 Swift 中生成 RSA 非对称密钥对的方法。我不需要将它存储在钥匙串或任何东西中。我只需要生成一个密钥对并将两个密钥都推送到 String 变量中。

密钥确实需要与另一端的 PHP 兼容。我将使用对称加密来保护私钥并将其存储在手机上。我会将公钥发送到用 PHP 实现的 Web 服务,Web 服务会将公钥存储在数据库中。

该公钥稍后将被 Web 服务用于加密诸如一次性密码和其他指定给 IOS 应用程序的敏感值之类的值。我将为从 IOS 应用程序流向 Web 服务的小块数据实施类似的方案。

我能找到的用于在 Swift 中生成密钥对的唯一记录的 API 声明显示在 developer.apple.com 上:

func SecKeyGeneratePairAsync(_ parameters: CFDictionary!,
                           _ deliveryQueue: dispatch_queue_t!,
                           _ result: SecKeyGeneratePairBlock!)
Run Code Online (Sandbox Code Playgroud)

我试图弄清楚如何使用它,但 XCode 不喜欢下划线,而且我不确定我实际上应该用它做什么或如何使用它。

即使 XCode 会接受它,我也不确定我将如何调用该函数以及传递它的值等。我在顶部包含了“import Security”,所以这不是问题。

这太难了,真是太可笑了。我想要做的就是生成一个非对称密钥对。

在 PHP 或 .NET 或 Java 或任何其他语言中执行此操作是小菜一碟,但我找不到任何关于 Swift 的明确文档。我必须为这个应用程序使用 Swift。我不想使用 OpenSSL,因为它已被弃用。

我使用 Swift 是因为我非常讨厌 Objective C。Swift 是我最终进入 IOS 开发的原因。

我不知道如何将 Objective C 类与 Swift 集成,如果有的话,我真的宁愿有一个纯 Swift 解决方案。如果没有,我会很感激有关如何集成 Objective C 解决方案并使其工作的一些指示。

上面的代码片段是App​​le提供的唯一函数调用,自然是不完整的,没有意义,也不起作用。

vrw*_*wim 2

海姆达尔似乎就是你要找的人。它易于使用,可以创建 RSA 密钥对、加密、解密、签名和验证。

它使用 iOS/OS X 钥匙串来存储密钥,因此密钥以安全的方式存储。

来自 GitHub 自述文件:

if let heimdall = Heimdall(tagPrefix: "com.example") {
    let testString = "This is a test string"

    // Encryption/Decryption
    if let encryptedString = heimdall.encrypt(testString) {
        println(encryptedString) // "cQzaQCQLhAWqkDyPoHnPrpsVh..."

        if let decryptedString = heimdall.decrypt(encryptedString) {
            println(decryptedString) // "This is a test string"
        }
    }

    // Signatures/Verification
    if let signature = heimdall.sign(testString) {
        println(signature) // "fMVOFj6SQ7h+cZTEXZxkpgaDsMrki..."
        var verified = heimdall.verify(testString, signatureBase64: signature)
        println(verified) // True

        // If someone meddles with the message and the signature becomes invalid
        verified = heimdall.verify(testString + "injected false message",
                                    signatureBase64: signature)
        println(verified) // False
    }
}
Run Code Online (Sandbox Code Playgroud)