2012-09-07 11 views
12

Estoy trabajando en una aplicación para iOS codificados y me da una base 64 codificado de clave pública tales como:get SecKeyRef de base 64 cuerdas

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

Me gustaría codificar texto con esta clave pública, pero no puedo encontrar la manera de convertir esta cadena en una clave pública útil.

¿Qué debo hacer?

+0

Puede que tenga que ['SecItemAdd', luego' SecItemCopyMatching'] (https://developer.apple.com/library/ios/#documentation/security/conceptual/keychainServConcepts/iPhoneTasks/iPhoneTasks.html) para hacer esto . – bobobobo

+0

[Ver también] (http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/) – bobobobo

+0

¿Alguna vez recibió respuesta a su pregunta? – Devarshi

Respuesta

10

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.

+0

¿Está haciendo PKCS1 posible? Digamos que obtengo el par de claves generado por un sistema diferente? – Turowicz