Как сделать асимметричное шифрование / дешифрование с помощью OSX 10.7+ без OpenSSL?

StackOverflow https://stackoverflow.com//questions/11712440

Вопрос

Поскольку OpenSSL устарел в OSX 10.7+, я хотел бы переключиться с OpenSSL во внутренний OSX Beychain и Crypto Function.

Но теперь я застрял на асимметричном шифровании / дешифровании.

Как я могу сделать шифрование / дешифрование случайно сгенерированного симметричного ключа с асимметричной (RSA) ключом.С OpenSSL это довольно легко.

в apple dev docs , Говорят, что Commoncrypto поддерживает асимметричное шифрование, но при проверке заголовков я могу видеть только поддержку симметричной вещи.

Любые подсказки?

Это было полезно?

Решение

Посмотрите на сервитографические услуги Cryptographics Systance и посмотрите, могут ли это сделать то, что вам нужно.

Кроме того, вы неправильно разбираетесь в Опссссс. Библиотеки OpenSSL, которые отправляются с ОС, устарены. Это не значит, что вы не можете продолжать использовать OpenSSL. OpenSSL - это открытый источник, и нет ничего остановить вас от загрузки его и свободно использовать его в своем приложении.

Амортизация Apple просто означает, что если вы используете OpenSSL, вам нужно включить свой Собственный копию библиотек OpenSSL, чтобы <Сильные> вы несут ответственность за сохранение вашей библиотеки OpenSSL На сегодняшний день и для исправления любого поломки, которое возникает всякий раз, когда вы этого делаете. : -)

И если нет, функции асимметричного шифрования и дешифрования iOS (Seckeencrypt и SeckeEcrypt) существуют в OS X, а заголовок iOS даже показывает, что они доступны в ОС X. Я не уверен, почему они не в OS X SDK. Я подал ошибку, и она была помечена как дуб.

Это, вероятно, не будет возможно для Apple для удаления этих функций в будущем, не нарушая симулятор, но если вы отправляете в App Store, и они дают вам горе, используя их, вот примерно совместимая замена для Seckeencrypt Использование автоматических преобразований API:

// Workaround for SecKeyEncrypt not really being public API in OS X
OSStatus OSXSecKeyEncrypt ( SecKeyRef key, SecPadding padding, const uint8_t *plainText, size_t plainTextLen, uint8_t *cipherText, size_t *cipherTextLen )
{
    CFMutableDictionaryRef parameters = CFDictionaryCreateMutable(
                                                                  kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks,
                                                                  &kCFTypeDictionaryValueCallBacks);
    CFDictionarySetValue(parameters, kSecAttrKeyType, kSecAttrKeyTypeAES);
    CFErrorRef error = NULL;
    SecTransformRef encrypt = SecEncryptTransformCreate(key, &error);

    if (error) {
        AFNSLog(@"Encryption failed: %@\n", (__bridge NSError *)error);
        return (OSStatus)[(__bridge NSError *)error code];
    }

    SecTransformSetAttribute(
                             encrypt,
                             kSecPaddingKey,
                             NULL, // kSecPaddingPKCS1Key (rdar://13661366 : NULL means kSecPaddingPKCS1Key and
                                                                          // kSecPaddingPKCS1Key fails horribly)
                             &error);

    CFDataRef sourceData = CFDataCreate(kCFAllocatorDefault, plainText, plainTextLen);
    SecTransformSetAttribute(encrypt, kSecTransformInputAttributeName,
                             sourceData, &error);

    CFDataRef encryptedData = SecTransformExecute(encrypt, &error);
    if (error) {
        AFNSLog(@"Encryption failed: %@\n", (__bridge NSError *)error);
        return (OSStatus)[(__bridge NSError *)error code];
    }

    if ((unsigned long)CFDataGetLength(encryptedData) > *cipherTextLen) {
        return errSecBufferTooSmall;
    }
    *cipherTextLen = CFDataGetLength(encryptedData);
    CFDataGetBytes(encryptedData, CFRangeMake(0, *cipherTextLen), cipherText);

    return noErr;
}
.

Вы должны иметь возможность довольно легко адаптировать код для дешифрования; Мне не нужна его для моих целей, поэтому я не писал эту функцию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top