2012-09-07 9 views
12

から私は、iOSアプリに働いていると私は、次のようなbase64でコード化された公開鍵を取得:がget SecKeyRef base64でコード化された文字列

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3gn + TJ1 + PbP0GHa6hmM35WsVyibpypWAwRuBYY4MGfh3VWoXgiyiLo5HJTW1eR9BUFq3z + yOG1rwzSabZ8I4zneWm0kH7xErSjNrMbmjirbL7e6TQNa1ujP/x4x9XVbqf3vIsNVs19kn/QSX/HGzd5Ct3TGAo0AT0T4JwkCfciwIDAQAB

この公開鍵でテキストをエンコードしたいのですが、この文字列を有効な公開鍵に変換する方法が見つかりません。

何をする必要がありますか?

+0

これを行うには、['SecItemAdd'、' 'SecItemCopyMatching'](https://developer.apple.com/library/ios/#documentation/security/conceptual/keychainServConcepts/iPhoneTasks/iPhoneTasks.html)が必要な場合があります。 – bobobobo

+0

[関連項目](http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/) – bobobobo

+0

あなたの質問に答えたことはありますか? – Devarshi

答えて

10

まず、NSStringをNSDataにbase64でデコードする必要があります。 ソリューションについてはthis answerを参照してください。 iOS 7用に開発する場合は、initWithBase64EncodedString::optionsを使用できます。

文字列をNSDataとして復号化したら、そこから証明書を作成できます。受け取った証明書の形式は重要です.DER(これは共通)またはPKCS12を使用できます。あなたはDERとしてそれを得ている可能性が高いので、私はあなたがガイダンスを必要としていると仮定します。 cerificateデータはSecCertificateCreateWithDataに渡されたときに、NULLの結果を取得します間違った形式にあった場合

SecCertificateRef cert = NULL; 
SecPolicyRef  policy = NULL; 

cert = SecCertificateCreateWithData(kCFAllocatorDefault, data); 
policy = SecPolicyCreateBasicX509(); 

は、証明書とポリシーを作成します。

この時点では証明書はありますが、公開鍵はありません。公開鍵を取得するには、証明書のcreate a trust reference and evaluate the trustが必要です。

OSStatus  status  = noErr; 
SecKeyRef  *publicKey = NULL; 
SecTrustRef  trust  = NULL; 
SecTrustResultType trustType = kSecTrustResultInvalid; 

if (cert != NULL){ 
    SecCertificateRef certArray[1] = {cert}; 
    certs = CFArrayCreate(kCFAllocatorDefault, (void *)certArray, 1, NULL); 
    status = SecTrustCreateWithCertificates(certs, policy, &trust); 

    if (status == errSecSuccess){ 
     status = SecTrustEvaluate(trust, &trustType); 

     // Evaulate the trust. 
     switch (trustType) { 
      case kSecTrustResultInvalid: 
      case kSecTrustResultConfirm: 
      case kSecTrustResultDeny: 
      case kSecTrustResultUnspecified: 
      case kSecTrustResultFatalTrustFailure: 
      case kSecTrustResultOtherError: 
       break; 
      case kSecTrustResultRecoverableTrustFailure: 
       *publicKey = SecTrustCopyPublicKey(trust); 
       break; 
      case kSecTrustResultProceed: 
       *publicKey = SecTrustCopyPublicKey(trust); 
       break; 
     } 

    } 
} 

すべてがうまくいったら、公開鍵を使って入力済みのSecKeyRefを取得する必要があります。うまくいかなかった場合、NULL SecKeyRefと何が問題になったのかを示すOSStatusが表示されます。セキュリティフレームワークのSecBase.hには、これらのエラーコードに関する詳細情報が記載されています。

公開キーを持つSecKeyRefがあるので、それを使って対応する秘密鍵でデータを暗号化すると、programming guideでよくカバーされます。

ARCまたはCFReleaseを使用して、上記で割り当てたもの(ポリシー、証明書)をリリースする必要があることに注意してください。

+0

PKCS1は可能ですか?別のシステムで生成された鍵ペアを取得するとします。 – Turowicz

関連する問題