Pregunta

Dado que OpenSSL está en desuso en OSX 10.7+, me gustaría cambiar de OpenSSL al llavero interno de OSX y la función Crypto.

Pero ahora estoy atascado en el cifrado / descifrado asimétrico.

¿Cómo puedo hacer cifrado / descifrado de una llave simétrica generada al azar con una clave asimétrica (RSA)?Con openssl es bastante fácil.

En la Apple dev docs , dicen que CommonCrypto admite el cifrado asimétrico, pero al verificar los encabezados, solo puedo ver el soporte para cosas simétricas.

¿Algún sugerencia?

¿Fue útil?

Solución

Eche un vistazo a los servicios de sintaxis de mensajes criptográficos y vea si eso puede hacer lo que necesita.

también, estás malinterpretado a la cosa openssl solo un poco. Las bibliotecas openssl que se envían con el sistema operativo están desaprobadas. Eso no significa que no puedas seguir usando OpenSSL. OpenSSL es de código abierto, y no hay nada detenerlo de descargarlo y usarlo libremente en su aplicación.

La deprecación de Apple solo significa que si usa OpenSSL, debe incluir su propios copia de las bibliotecas openssl para que usted sea responsable de mantener su biblioteca de OpenSSL hasta la fecha y para solucionar cualquier rotura que ocurra cuando lo haga. - -)

y, si no, las funciones asimétricas de cifrado y descifrado de iOS (Seckeyncrypt y SeckeyDecrypt) existen en OS X, y el encabezado de iOS incluso muestra que están disponibles en OS X. No estoy seguro de por qué no están en El OS X SDK. Presenté un error, y estaba marcado como un DUP.

Probablemente no sería posible que Apple eliminen esas funciones en el futuro sin romper el simulador, pero si está enviando a la App Store y le dan dolor al usarlas, aquí hay un reemplazo aproximadamente compatible para Seckeyncrypt. Usando la API transforma la seguridad:

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

Debe poder adaptar el código para descifrar de manera bastante fácil; No lo necesitaba para mis propósitos, así que no escribí esa función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top