gpt4 book ai didi

ios - 如何在 Swift for IOS 中生成 RSA 非对称 key 对?

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:23 26 4
gpt4 key购买 nike

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

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

Web 服务稍后将使用该公钥来加密一次性密码和其他发送到 IOS 应用程序的敏感值等值。我将为从 IOS 应用程序流向 Web 服务的小块数据实现类似的方案。

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

func SecKeyGeneratePairAsync(_ parameters: CFDictionary!,
_ deliveryQueue: dispatch_queue_t!,
_ result: SecKeyGeneratePairBlock!)

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

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

这太难了,这太荒谬了。我想要做的就是生成一个非对称 key 对。

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

我使用 Swift 是因为我非常讨厌 objective-c 。Swift 是我最终跳入 IOS 开发的原因。

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

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

最佳答案

CertificateSigningRequestSwift_Test 中有一个很好的示例说明如何在 Swift 中执行此操作GitHub 中的项目。只需调用一次 SecKeyCreateRandomKey() 即可同时生成公钥/私钥对,并将它们保存在钥匙串(keychain)中。

        let tagPublic = "com.example.public"
let tagPrivate = "com.example.private"

let publicKeyParameters: [String: AnyObject] = [
String(kSecAttrIsPermanent): kCFBooleanTrue,
String(kSecAttrApplicationTag): tagPublic as AnyObject,
String(kSecAttrAccessible): kSecAttrAccessibleAlways
]

var privateKeyParameters: [String: AnyObject] = [
String(kSecAttrIsPermanent): kCFBooleanTrue,
String(kSecAttrApplicationTag): tagPrivate as AnyObject,
String(kSecAttrAccessible): kSecAttrAccessibleAlways
]

//Define what type of keys to be generated here
var parameters: [String: AnyObject] = [
String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
String(kSecAttrKeySizeInBits): 2048,
String(kSecReturnRef): kCFBooleanTrue,
kSecPublicKeyAttrs as String: publicKeyParameters as AnyObject,
kSecPrivateKeyAttrs as String: privateKeyParameters as AnyObject,
]

//Use Apple Security Framework to generate keys, save them to application keychain
var error: Unmanaged<CFError>?
let privateKey = SecKeyCreateRandomKey(parameters as CFDictionary, &error)

if privateKey == nil{
print("Error creating keys occurred: \(error!.takeRetainedValue() as Error), keys weren't created")
return
}

//Get generated public key
let query: [String: AnyObject] = [
String(kSecClass): kSecClassKey,
String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
String(kSecAttrApplicationTag): tagPublic as AnyObject,
String(kSecReturnRef): kCFBooleanTrue
]

var publicKeyReturn:AnyObject?

let result = SecItemCopyMatching(query as CFDictionary, &publicKeyReturn)

if result != errSecSuccess{
print("Error getting publicKey from keychain occurred: \(result)")
return
}

let publicKey = publicKeyReturn as! SecKey?

//Set block size
let keyBlockSize = SecKeyGetBlockSize(self.publicKey!)

//Ask keychain to provide the publicKey in bits
let query: [String: AnyObject] = [
String(kSecClass): kSecClassKey,
String(kSecAttrKeyType): keyAlgorithm.secKeyAttrType,
String(kSecAttrApplicationTag): tagPublic as AnyObject,
String(kSecReturnData): kCFBooleanTrue
]

var tempPublicKeyBits:AnyObject?

_ = SecItemCopyMatching(query as CFDictionary, &tempPublicKeyBits)

guard let publicKeyBits = tempPublicKeyBits as? Data else {
return
}

关于ios - 如何在 Swift for IOS 中生成 RSA 非对称 key 对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28841580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com