2017-01-17 27 views
1

什麼是在iOS中生成RSA密鑰對的最佳方式,並將它們作爲字符串。我已經看到了幾個可以生成的庫文件,但我無法將私鑰作爲字符串。有沒有人知道一個庫或方法來獲取私鑰在字符串?在iOS(Swift)中生成後獲取RSA密鑰對爲字符串?

目前我生成密鑰對這樣

var statusCode: OSStatus 
var publicKey: SecKey? 
var privateKey: SecKey? 

let publicKeyAttr: [NSObject: NSObject] = [kSecAttrIsPermanent:true as NSObject, kSecAttrApplicationTag:"publicTag" as NSObject] 
let privateKeyAttr: [NSObject: NSObject] = [kSecAttrIsPermanent:true as NSObject, kSecAttrApplicationTag:"privateTag" as NSObject] 

var keyPairAttr = [NSObject: NSObject]() 
keyPairAttr[kSecAttrKeyType] = kSecAttrKeyTypeRSA 
keyPairAttr[kSecAttrKeySizeInBits] = 2048 as NSObject? 
keyPairAttr[kSecPublicKeyAttrs] = publicKeyAttr as NSObject? 
keyPairAttr[kSecPrivateKeyAttrs] = privateKeyAttr as NSObject? 

statusCode = SecKeyGeneratePair(keyPairAttr as CFDictionary, &publicKey, &privateKey) 

if statusCode == noErr && publicKey != nil && privateKey != nil { 

    print(publicKey!) 
    print(privateKey!) 

} else { 
    print("Error generating key pair: \(statusCode)") 
} 

其在SecKey。如何將它們轉換爲字符串?還是有另一種方法來做到這一點?

+0

的可能的複製[生成RSA公鑰/私鑰對(http://stackoverflow.com/questions/33021946/generate-an-rsa-public-private-key-pair) –

+0

@OlegGordiichuk它不提及如何獲取字符串中的私鑰。 – spaceMonkey

+0

看看[SecItemCopyMatching](https://developer.apple.com/reference/security/1398306-secitemcopymatching)。我知道你可以得到公鑰的原始數據。我希望它也適用於私鑰。獲得數據後,您可以使用Base64對其進行編碼。 – Codo

回答

1

下面是一個使用SecItemCopyMatching代碼:

let PublicKeyTag = "publicTag" 
let PrivateKeyTag = "privateTag" 

let publicKeyAttr: [NSString: Any] = [ 
    kSecAttrIsPermanent: NSNumber(value: true), 
    kSecAttrApplicationTag: PublicKeyTag 
] 
let privateKeyAttr: [NSString: Any] = [ 
    kSecAttrIsPermanent: NSNumber(value: true), 
    kSecAttrApplicationTag: PrivateKeyTag 
] 

let keyPairAttr: [NSString: Any] = [ 
    kSecAttrKeyType: kSecAttrKeyTypeRSA, 
    kSecAttrKeySizeInBits: 2048 as NSObject, 
    kSecPublicKeyAttrs: publicKeyAttr, 
    kSecPrivateKeyAttrs: privateKeyAttr 
] 

var publicKey: SecKey? 
var privateKey: SecKey? 
var statusCode: OSStatus 
statusCode = SecKeyGeneratePair(keyPairAttr as CFDictionary, &publicKey, &privateKey) 

if statusCode == noErr && publicKey != nil && privateKey != nil { 
    print(publicKey!) 
    print(privateKey!) 
} else { 
    print("Error generating key pair: \(statusCode)") 
} 

var dataPtr: AnyObject? 
let query: [NSString: Any] = [ 
    kSecClass: kSecClassKey, 
    kSecAttrApplicationTag: PrivateKeyTag, 
    kSecReturnData: NSNumber(value: true) 
] 
statusCode = SecItemCopyMatching(query as CFDictionary, &dataPtr) 

let privateKeyData = dataPtr as! Data 
let privateKeyString = privateKeyData.base64EncodedString(options: []) 
print(privateKeyString) 

privateKeyData似乎包含ASN.1編碼信息。最終的結果是Base64編碼。