2017-01-17 10 views
1

iOS에서 RSA 키 쌍을 생성하고 문자열으로 가져 오는 가장 좋은 방법은 무엇입니까? 내가 생성 할 수 있지만 문자열로 개인 키를 얻을 수없는 libs 몇 본적이 있습니다. 누군가 lib 또는 개인 키를 String으로 가져 오는 방법을 알고 있습니까? iOS (Swift)에서 생성 한 후 RSA 키 쌍을 String으로 가져 옵니까?

현재 내가 키 쌍을이 방법으로 SecKey에서

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)") 
} 

그것의를 생성합니다. 그들을 변환하는 방법을 String? 아니면 다른 방법이 있을까요?

+0

[RSA 공개 키/개인 키 쌍 생성] 가능한 복제본 (http://stackoverflow.com/questions/33021946/generate-ana-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로 인코딩됩니다.