En primer lugar, debe base64 decodificar su NSString a NSData: Consulte this answer para obtener soluciones. Si está desarrollando para iOS 7, puede usar initWithBase64EncodedString::options
.
Una vez que haya decodificado la cadena como NSData, puede intentar crear un certificado a partir de ella. El formato del certificado que recibió importa: puede usar DER (que es común) o PKCS12. Es probable que lo obtengas como DER, así que supongo que necesitas orientación.
crear un certificado y la política:
SecCertificateRef cert = NULL;
SecPolicyRef policy = NULL;
cert = SecCertificateCreateWithData(kCFAllocatorDefault, data);
policy = SecPolicyCreateBasicX509();
Si los datos cerificate estaba en un formato incorrecto cuando se pasa a SecCertificateCreateWithData
obtendrá un resultado nulo.
En este momento tiene el certificado, pero no la clave pública. Para obtener la clave pública, debe create a trust reference and evaluate the trust del certificado.
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;
}
}
}
Si todo ha ido bien, ahora debería tener un SecKeyRef lleno con la clave pública. Si no salió bien, tendrá un SecKeyRef NULO y un estado OSS que indica qué salió mal. SecBase.h
en el marco de seguridad proporciona información más detallada sobre esos códigos de error.
Ahora que tiene un SecKeyRef con una clave pública, usarlo para encriptar datos con una clave privada correspondiente está bien cubierto por el programming guide.
Tenga en cuenta que tendrá que liberar las cosas que asignó anteriormente (política, certs) usando ARC o CFRelease.
Puede que tenga que ['SecItemAdd', luego' SecItemCopyMatching'] (https://developer.apple.com/library/ios/#documentation/security/conceptual/keychainServConcepts/iPhoneTasks/iPhoneTasks.html) para hacer esto . – bobobobo
[Ver también] (http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/) – bobobobo
¿Alguna vez recibió respuesta a su pregunta? – Devarshi