您可以使用下面的方法generateKeyPair创建公钥/私钥对,然后使用SecKeyCopy外部表示外部表示方法。
Swift3
//tuple type for public/private key pair at class level
typealias KeyPair = (publicKey: SecKey, privateKey: SecKey)
// In your code block
let publicKeyTag: String = "com.org.yourapp.publickey"
let privateKeyTag: String = "com.org.yourapp.privatekey"
let keyPair = generateKeyPair(publicKeyTag, privateTag: privateKeyTag, keySize: 2048)
var pbError:Unmanaged<CFError>?
var prError:Unmanaged<CFError>?
guard let pbData = SecKeyCopyExternalRepresentation((keyPair?.publicKey)!, &pbError) as Data? else {
print("error: ", pbError!.takeRetainedValue() as Error)
return
}
guard let prData = SecKeyCopyExternalRepresentation((keyPair?.privateKey)!, &prError) as Data? else {
print("private key error: ")
return
}
let strPublicKey = appendPrefixSuffixTo(pbData.base64EncodedString(options: .lineLength64Characters), prefix: "-----BEGIN RSA PUBLIC KEY-----\n", suffix: "\n-----END RSA PUBLIC KEY-----")
print("public key: \n", strPublicKey)
let strPrivateKey = appendPrefixSuffixTo(prData.base64EncodedString(options: .lineLength64Characters), prefix: "-----BEGIN RSA PRIVATE KEY-----\n", suffix: "\n-----END RSA PRIVATE KEY-----")
print("private key: \n", strPrivateKey)
辅助功能:
func appendPrefixSuffixTo(_ string: String, prefix: String, suffix: String) -> String {
return "\(prefix)\(string)\(suffix)"
}
返回公钥/私钥对的generateKeyPair方法
func generateKeyPair(_ publicTag: String, privateTag: String, keySize: Int) -> KeyPair? {
var sanityCheck: OSStatus = noErr
var publicKey: SecKey?
var privateKey: SecKey?
// Container dictionaries
var privateKeyAttr = [AnyHashable : Any]()
var publicKeyAttr = [AnyHashable: Any]()
var keyPairAttr = [AnyHashable : Any]()
// Set top level dictionary for the keypair
keyPairAttr[(kSecAttrKeyType ) as AnyHashable] = (kSecAttrKeyTypeRSA as Any)
keyPairAttr[(kSecAttrKeySizeInBits as AnyHashable)] = Int(keySize)
// Set private key dictionary
privateKeyAttr[(kSecAttrIsPermanent as AnyHashable)] = Int(true)
privateKeyAttr[(kSecAttrApplicationTag as AnyHashable)] = privateTag
// Set public key dictionary.
publicKeyAttr[(kSecAttrIsPermanent as AnyHashable)] = Int(true)
publicKeyAttr[(kSecAttrApplicationTag as AnyHashable)] = publicTag
keyPairAttr[(kSecPrivateKeyAttrs as AnyHashable)] = privateKeyAttr
keyPairAttr[(kSecPublicKeyAttrs as AnyHashable)] = publicKeyAttr
sanityCheck = SecKeyGeneratePair((keyPairAttr as CFDictionary), &publicKey, &privateKey)
if sanityCheck == noErr && publicKey != nil && privateKey != nil {
print("RSA key pair generation Successful")
return KeyPair(publicKey: publicKey!, privateKey: privateKey!)
}
return nil
}
输出如下:
public key:
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAz1zfbybUt5jZX5P6ymy+g04wj3iTYCV8eGbkFyqFNsfN8Lnk6x4x
zstfnpE6asV6NkBecQnT1a9X6AVxA4Mxq4CeysR10TRr8HGczQGKl7R3Nbvvmgw+
jX8LZGxsQTO6qYWhMAtOPFfsMW9iy3AsDE7OIYfya6y/l919ExbgPzJ+0nLdiBmd
bmmzOQ1PaKt3OcxG6qZyBoixRTTOm4UDCLDzYdjz5dS1rbvb7pD15TpkZBkuMRm5
QDv+xhKcz1UFGQP7ssZS++ZoQlF2CZJuLz8R1uUYg4xQnF0r1IBBrlVtKnblgMcA
ZykNweGwrdPaWF3PeZmbvG+/m+Kt7/4BJwIDAQAB
-----END RSA PUBLIC KEY-----