Подтвердить что ты не робот

Получить SecKeyRef из кодированной строки base64

Я работаю над iOS-приложением, и я получаю открытый ключ с кодировкой base64, например:

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

Я хотел бы закодировать некоторый текст с этим открытым ключом, но я не могу найти способ преобразовать эту строку в полезный открытый ключ.

Что мне нужно сделать?

4b9b3361

Ответ 1

Сначала вы должны base64 декодировать NSString в NSData: См. этот ответ для решений. Если вы разрабатываете 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.