Как сделать асимметричное шифрование / дешифрование с помощью OSX 10.7+ без OpenSSL?
-
13-12-2019 - |
Вопрос
Поскольку OpenSSL устарел в OSX 10.7+, я хотел бы переключиться с OpenSSL во внутренний OSX Beychain и Crypto Function.
Но теперь я застрял на асимметричном шифровании / дешифровании.
Как я могу сделать шифрование / дешифрование случайно сгенерированного симметричного ключа с асимметричной (RSA) ключом.С OpenSSL это довольно легко.
в apple dev docs , Говорят, что Commoncrypto поддерживает асимметричное шифрование, но при проверке заголовков я могу видеть только поддержку симметричной вещи.
Любые подсказки?
Решение
Посмотрите на сервитографические услуги Cryptographics Systance и посмотрите, могут ли это сделать то, что вам нужно.
Кроме того, вы неправильно разбираетесь в Опссссс. Библиотеки OpenSSL, которые отправляются с ОС, устарены. Это не значит, что вы не можете продолжать использовать OpenSSL. OpenSSL - это открытый источник, и нет ничего остановить вас от загрузки его и свободно использовать его в своем приложении.
Амортизация Apple просто означает, что если вы используете 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;
}
.
Вы должны иметь возможность довольно легко адаптировать код для дешифрования; Мне не нужна его для моих целей, поэтому я не писал эту функцию.