2012-09-07 10 views
12

pracuję nad aplikacji iOS i dostaję base64 zakodowany klucz publiczny, takich jak:get SecKeyRef z base64 kodowanych ciąg

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

Chciałbym zakodować trochę tekstu za pomocą tego klucza publicznego, ale nie mogę znaleźć sposobu przekonwertowania tego ciągu na użyteczny klucz publiczny.

Co muszę zrobić?

+0

Być może trzeba będzie [ 'SecItemAdd', następnie' SecItemCopyMatching'] (https://developer.apple.com/library/ios/#documentation/security/conceptual/keychainServConcepts/iPhoneTasks/iPhoneTasks.html), aby to zrobić . – bobobobo

+0

[Zobacz także] (http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/) – bobobobo

+0

czy kiedykolwiek dostałeś odpowiedź na swoje pytanie? – Devarshi

Odpowiedz

10

Najpierw należy zdekodować w formacie base64 NSString do NSData: Zobacz rozwiązania dla rozwiązań this answer. Jeśli tworzysz na iOS 7, możesz użyć initWithBase64EncodedString::options.

Po odkodowaniu łańcucha jako NSData można spróbować utworzyć z niego certyfikat. Forma otrzymanego certyfikatu ma znaczenie - możesz użyć DER (który jest wspólny) lub PKCS12. Prawdopodobnie otrzymujesz go jako DER, więc zakładam, że potrzebujesz wskazówek.

Tworzenie certyfikatu i polityki:

SecCertificateRef cert = NULL; 
SecPolicyRef  policy = NULL; 

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

Jeśli dane cerificate był w nieprawidłowym formacie, gdy przeszedł do SecCertificateCreateWithData dostaniesz wynik NULL.

W tym momencie masz certyfikat, ale nie klucz publiczny. Aby uzyskać klucz publiczny, należy uzyskać create a trust reference and evaluate the trust certyfikatu.

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; 
     } 

    } 
} 

Jeśli wszystko poszło dobrze, powinieneś teraz mieć zaludnionych SecKeyRef z kluczem publicznym. Jeśli nie poszło dobrze, otrzymasz NULL SecKeyRef i OSStatus wskazujące, co poszło nie tak. SecBase.h w strukturze zabezpieczeń zawiera bardziej szczegółowe informacje o tych kodach błędów.

Teraz, gdy masz SecKeyRef z kluczem publicznym, używanie go do szyfrowania danych za pomocą odpowiedniego klucza prywatnego jest dobrze chronione przez programming guide.

Pamiętaj, że będziesz musiał zwolnić rzeczy, które Ci przydzielono (zasady, certyfikaty) za pomocą ARC lub CFRelease.

+0

Czy możliwe jest wykonanie PKCS1? Powiedzmy, że otrzymuję parę kluczy wygenerowaną przez inny system? – Turowicz

Powiązane problemy