Pergunta

Como o openssl está obsoleto no osx 10.7+, gostaria de mudar do openssl para o chaveiro interno do osx e a função de criptografia.

Mas agora estou preso na criptografia/descriptografia assimétrica.

Como posso criptografar/descriptografar uma chave simétrica gerada aleatoriamente com uma chave assimétrica (RSA).Com o openssl é bem fácil.

No documentos de desenvolvimento da Apple, eles dizem que o CommonCrypto suporta criptografia assimétrica, mas ao verificar os cabeçalhos, só consigo ver suporte para coisas simétricas.

Alguma dica?

Foi útil?

Solução

Dê uma olhada em Serviços de sintaxe de mensagens criptográficas e veja se isso pode fazer o que você precisa.

Além disso, você está interpretando mal o OpenSSL um pouco.As bibliotecas OpenSSL fornecidas com o sistema operacional estão obsoletas.Isso não significa que você não possa continuar usando o OpenSSL.OpenSSL é Open Source e nada impede você de baixá-lo e usá-lo gratuitamente em seu aplicativo.

A descontinuação da Apple significa apenas que se você usa OpenSSL, você precisa incluir seu ter cópia das bibliotecas OpenSSL para que você são responsáveis ​​por manter sua biblioteca OpenSSL atualizada e por consertar qualquer falha que ocorra sempre que você fizer isso.:-)

E se não, as funções de criptografia e descriptografia assimétricas do iOS (SecKeyEncrypt e SecKeyDecrypt) existem no OS X, e o cabeçalho do iOS mostra até que elas estão disponíveis no OS X.Não sei por que eles não estão no SDK do OS X.Eu registrei um bug e ele foi marcado como uma fraude.

Provavelmente não seria possível para a Apple remover essas funções no futuro sem quebrar o Simulador, mas se você estiver enviando para a app store e eles te incomodarem por usá-las, aqui está um substituto aproximadamente compatível para SecKeyEncrypt construído usando o Security API de transformações:

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

Você deve ser capaz de adaptar o código para descriptografia com bastante facilidade;Eu não precisava disso para meus propósitos, então não escrevi essa função.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top