Como fazer criptografia/descriptografia assimétrica com OSX 10.7+ sem openssl?
-
13-12-2019 - |
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?
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.