Domanda

Poiché OpenSSL è deprecato in OSX 10.7+, vorrei passare da OpenSSL alla funzione OSX Internal OSX e Funzione Crypto.

Ma ora sono bloccato sulla crittografia asimmetrica / decrittografia.

Come posso effettuare la crittografia / decrittografia di una chiave simmetrica generata a caso con un tasto asimmetrico (RSA).Con OpenSSL è abbastanza facile.

in Apple Dev Docs , dicono che Commoncrypto supporta la crittografia asimmetrica, ma mentre controlla le intestazioni, posso solo vedere il supporto per cose simmetriche.

Qualche suggerimento?

È stato utile?

Soluzione

Dai un'occhiata ai servizi di sintassi dei messaggi crittografici e vedere se ciò può fare ciò di cui hai bisogno.

Inoltre, stai fraintendendo la cosa openssl solo un po '. Le librerie OpenSSL che spediscono con il sistema operativo sono deprecate. Ciò non significa che non puoi continuare a usare openssl. OpenSSL è open source, e non c'è niente che ti fermi dal download e usarlo liberamente nella tua applicazione.

La deprecazione di Apple significa solo che se si utilizza OpenSSL, è necessario includere la tua proprietaria copia delle librerie OpenSSL in modo che You sia responsabile di mantenere la libreria OpenSSL to-date e per fissare qualsiasi rottura che si verifica ogni volta che lo fai. : -)

E in caso contrario, le funzioni di crittografia asimmetrica e decrittografia iOS (SeckeyCryprypt e SegnoScordyDecryprypry) esistono in OS X, e l'intestazione iOS mostra anche che sono disponibili in OS X. Non sono sicuro del motivo per cui non sono dentro il sistema operativo X SDK. Ho archiviato un bug ed è stato contrassegnato come un DUP.

Probabilmente non sarebbe possibile per Apple rimuovere quelle funzioni in futuro senza rompere il simulatore, ma se stai inviando all'App Store e ti danno dolore per usarli, ecco una sostituzione approssimativamente compatibile per SociaKeKencrypt Utilizzo dell'API di trasformazione della sicurezza:

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

Dovresti essere in grado di adattare il codice per la decrittografia abbastanza facilmente; Non ne avevo bisogno per i miei scopi, quindi non ho scritto quella funzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top