2017-01-17 5 views
1

Каков наилучший способ создания пары ключей RSA в iOS и получить их как String. Я видел пару libs, которые могут генерировать, но я не могу получить Private Key как String. Кто-нибудь знает lib или способ получить секретный ключ в String?Получить пару ключей RSA как строку после генерации в iOS (Swift)?

В настоящее время я генерации пары ключей таким образом

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. Как их преобразовать в String? или есть другой способ сделать это?

+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.