14

私は iOS アプリに取り組んでおり、次のような base64 でコード化された公開鍵を取得しています。

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3gn+tJ1+PbP0GHa6hmM35WsVyibpypWAwRuBYY4MGfh3VWoXgiyiLo5HJTW1eR9BUFq3z+yOG1rwzSabZ8I4zneWm0kH7xErSjNrMbmjirbL7e6TQNa1ujP/x4x9XVbqf3vIsNVs19kn/qSX/HGzd5Ct3TGAo0AT0T4JwkCfciwIDAQAB

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

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

4

1 に答える 1

12

まず、NSString を NSData に base64 デコードする必要があります。解決策については、この回答を参照してください。iOS 7 向けに開発している場合は、initWithBase64EncodedString::options.

文字列を NSData としてデコードしたら、それから証明書の作成を試みることができます。受け取った証明書の形式は重要です。DER (一般的) または PKCS12 を使用できます。DER として取得する可能性が高いため、ガイダンスが必要であると想定します。

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

SecCertificateRef   cert    = NULL;
SecPolicyRef        policy  = NULL;

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

証明書データが渡されたときに不適切な形式であった場合SecCertificateCreateWithData、NULL の結果が得られます。

この時点で、証明書はありますが、公開鍵はありません。公開鍵を取得するには、信頼参照を作成し、証明書の信頼を評価する必要があります。

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 を取得したので、それを使用して対応する秘密鍵でデータを暗号化する方法については、プログラミング ガイドで詳しく説明されています。

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

于 2014-05-12T18:31:40.217 に答える