2017-10-23 3 views
2

必要な要求のscrenshotを追加しました。SecKeyの文字列表現を取得する

私はMacOsアプリをSwift 4で作成しようとしています。このアプリは、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でエンコードされていますが、何か他のものはバックスラッシュを2倍にしています)。あなたの最後のステップは、新たなラインと-----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

ありがとうございます!質問を更新し、リクエストのスクリーンショットを追加しました。ご覧のとおり、PCKS#1文字列でなければなりません。これはbase64でエンコードされたBLOBではありませんか? – Dastin

+0

@Dastinこれは実際にbase64でエンコードされたBLOBです。 *人間が読める*接頭辞と接尾辞( '\ n'文字を含む)を追加する必要があります。' .lineLength64Characters'オプションを 'base64EncodedString(options:)'に渡す必要があります。 – vadian

関連する問題