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.
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
[Zobacz także] (http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/) – bobobobo
czy kiedykolwiek dostałeś odpowiedź na swoje pytanie? – Devarshi