2017-10-23 1 views
2

편집 필요한 요청을 추가했습니다.SecKey의 문자열 표현 얻기

저는 스위프트 4에서 MacOs 앱을 만들려고합니다.이 앱은 RSA 암호화가 필요한 API와 통신합니다.

Google은이를 수행 할 수있는 결과를 제공하지 않았습니다. 이 주제에 관한 Apple의 문서는 꽤 광범위하지만 (https://developer.apple.com/library/content/documentation/Security/Conceptual/CertKeyTrustProgGuide/KeyRead.html#//apple_ref/doc/uid/TP40001358-CH222-SW2), 여전히 필요한 것은 아닙니다.

SecKeyCopyExternalRepresentation 함수는 이 String으로 변환 될 수없는 Data 개체를 제공합니다. 설명서에 따르면 PCKS # 1 응답이지만 작동하지는 않습니다.

아래를 포함하여 많은 것을 시도했지만 작동하지 않습니다. Request

스위프트이 가능하다조차 :

func externalRepresentation(_ key: SecKey) -> String? { 
    var error: Unmanaged<CFError>? 

    guard let data = SecKeyCopyExternalRepresentation(key, &error) as Data? else { 
     return nil 
    } 

    return data.base64EncodedString() 
} 

요청은 다음 할 필요가?

답변

1

인증서 또는 RSA 키를 문자열로 사용하는 등의 이진 Blob을 인코딩하는 일반적인 방법은 base64 인코딩을 사용하는 것입니다. base64EncodedString(options:) 함수를 사용하여 Data을 base64로 쉽게 변환 할 수 있습니다. 즉

let myString = myData.base64EncodedString() 

이 정확히이 응용 프로그램에 필요한 것입니다 귀하의 질문에 많은 컨텍스트를 제공하지 않기 때문에 얘기하기 어렵다 여부.

스크린 샷과 base64 인코딩 된 문자열을 보면 머리글과 바닥 글이 필요합니다. 데이터 구조에서 명백히 임의의 문자는 대부분 base64 문자열입니다 (JSON 변환은 줄 넘김을 \n으로 인코딩했으며 다른 것은 백 슬래시를 두 배로 늘 렸습니다). 귀하의 마지막 단계는 새로운 라인과 -----END PUBLIC KEY-----

한 가지 더 추가 -----BEGIN PUBLIC KEY-----와 문자열과 새 줄, 광고를 앞에 추가하는 것이다 : 당신이 Data.init?((base64Encoded base64String:,options:)로 아주 쉽게 다시 base64로 문자열에서 원래의 데이터를 얻을 수 있습니다. 즉

guard let myDataCopy = Data(base64Encoded: myString) 
else { fatalError("the string was not really base64") } 
+0

감사합니다. 질문을 업데이트하고 요청의 스크린 샷을 추가했습니다. 보시다시피, base64로 인코딩 된 BLOB가 아닌 PCKS # 1 문자열이어야합니다. – Dastin

+0

@Dastin 실제로 base64로 인코딩 된 blob입니다. 사람이 읽을 수있는 * 접두사와 접미사 ('\ n' 문자 포함)를 추가해야하고'.lineLength64Characters' 옵션을'base64EncodedString (options :)'에 전달해야합니다. – vadian