从base64编码的字符串获取SecKeyRef

14
我正在开发一款iOS应用程序,我得到了一个Base64编码的公钥,如下所示:

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

我想用这个公钥来加密一些文本,但是我找不到将这个字符串转换为有用的公钥的方法。
我需要做什么?

你可能需要使用SecItemAdd,然后使用SecItemCopyMatching来完成这个任务。 - bobobobo
请参见:http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/ - bobobobo
你有没有得到你的问题的答案? - Devarshi
1个回答

12

首先,您需要将NSString解码为NSData:

请参考此答案中的解决方案。如果您正在开发iOS 7,您可以使用initWithBase64EncodedString::options方法。

一旦您将字符串解码为NSData,就可以尝试从其创建证书。您收到的证书格式很重要 - 您可以使用DER(常见格式)或PKCS12格式。您可能会获得DER格式的证书,因此我假设您需要指导如何处理它。

创建证书和策略:

SecCertificateRef   cert    = NULL;
SecPolicyRef        policy  = NULL;

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

如果在传递给SecCertificateCreateWithData的证书数据格式不正确,您将得到一个空结果。

此时您已经拥有证书,但没有公钥。要获取公钥,必须创建信任引用并评估证书的信任级别

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。Security框架中的SecBase.h提供了有关这些错误代码的更详细信息。
现在,您拥有一个带有公钥的SecKeyRef,使用相应的私钥对数据进行加密,在编程指南中有很好的介绍。
请注意,您需要使用ARC或CFRelease释放上面分配的资源(策略、证书)。

做PKCS1是可能的吗?比如说我得到了由不同系统生成的密钥对? - Wojtek Turowicz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接