首先,您需要将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);
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释放上面分配的资源(策略、证书)。
SecItemAdd
,然后使用SecItemCopyMatching
来完成这个任务。 - bobobobo