Question

Étant donné que OpenSSL est obsolète dans OSX 10.7+, j'aimerais passer de OpenSSL à la fonction interne des porte-clés OSX et Crypto.

Mais maintenant je suis coincé sur un cryptage asymétrique / décryptage.

Comment puis-je faire un cryptage / décryptage d'une clé symétrique générée de manière aléatoire avec une clé asymétrique (RSA).Avec openssl c'est assez facile.

dans le Apple Documents , ils disent que le communCRYPTO prend en charge le cryptage asymétrique, mais lors de la vérification des en-têtes, je ne peux voir que le support des trucs symétriques.

Toute astuce?

Était-ce utile?

La solution

Vérifiez les services de syntaxe des messages cryptographiques et voir si cela peut faire ce dont vous avez besoin.

En outre, vous faites mal à la fois la chose OpenSSL un peu. Les bibliothèques OpenSSL qui expédient avec le système d'exploitation sont obsolètes. Cela ne signifie pas que vous ne pouvez pas continuer à utiliser OpenSSL. OpenSSL est open source, et rien ne vous empêche de le télécharger et de l'utiliser librement dans votre application.

L'amorcation d'Apple signifie simplement que si vous utilisez OpenSSL, vous devez inclure votre copie propre des bibliothèques OpenSSL afin que vous est responsable de la conservation de votre bibliothèque OpenSSL. à ce jour et pour la réparation de toute rupture qui se produit chaque fois que vous le faites. : -)

et si non, les fonctions de cryptage et de déchiffrement iOS asymétriques et de secrètes (SECKECYENCRYPTYPTYPYPTYPYPTYPYPTYPYPTYPYPTYPYPT) et que l'en-tête iOS montre même qu'ils sont disponibles dans OS X. Je ne sais pas pourquoi ils ne sont pas dans le SDK OS X. J'ai déposé un bug, et il a été marqué comme un DUP.

Il ne serait probablement pas possible pour Apple de supprimer ces fonctions à l'avenir sans casser le simulateur, mais si vous soumettez à l'App Store et que vous vous souciez de les utiliser, voici un remplacement approximativement compatible pour SECKECYPRYPT Utiliser l'API Transforms de sécurité:

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

Vous devriez être capable d'adapter le code pour le déchiffrement assez facilement; Je n'en ai pas besoin pour mes besoins, donc je n'ai pas écrit cette fonction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top