Macos 如何使用OSX 10.7+;没有openssl?

Macos 如何使用OSX 10.7+;没有openssl?,macos,openssl,keychain,commoncrypto,security-framework,Macos,Openssl,Keychain,Commoncrypto,Security Framework,由于osx 10.7+中不推荐使用openssl,我想从openssl切换到内部osx密钥链和加密功能 但现在我陷入了非对称加密/解密 如何使用非对称(RSA)密钥对随机生成的对称密钥进行加密/解密。使用openssl非常简单 在中,他们说CommonCrypto支持非对称加密,但在检查头时,我只能看到对对称内容的支持 有什么提示吗?看看加密消息语法服务,看看它是否能满足您的需要 另外,您对OpenSSL的理解有点误读。操作系统附带的OpenSSL库已被弃用。这并不意味着你不能继续使用OpenS

由于osx 10.7+中不推荐使用openssl,我想从openssl切换到内部osx密钥链和加密功能

但现在我陷入了非对称加密/解密

如何使用非对称(RSA)密钥对随机生成的对称密钥进行加密/解密。使用openssl非常简单

在中,他们说CommonCrypto支持非对称加密,但在检查头时,我只能看到对对称内容的支持


有什么提示吗?

看看加密消息语法服务,看看它是否能满足您的需要

另外,您对OpenSSL的理解有点误读。操作系统附带的OpenSSL库已被弃用。这并不意味着你不能继续使用OpenSSL。OpenSSL是开源的,没有什么可以阻止您下载它并在应用程序中免费使用它

苹果的反对意见只是意味着,如果你使用OpenSSL,你需要包含你自己的OpenSSL库副本,以便你有责任保持你的OpenSSL库的最新状态,并修复你这样做时出现的任何损坏情况。:-)

如果没有,iOS非对称加密和解密功能(SecKeyEncrypt和SecKeyDecrypt)确实存在于OS X中,并且iOS头甚至显示它们在OS X中可用。我不确定为什么它们不在OS X SDK中。我提交了一个bug,它被标记为dup

苹果将来可能不可能在不破坏模拟器的情况下删除这些功能,但如果你提交给app store,它们会让你为使用它们感到难过,下面是一个使用Security Transforms API构建的大致兼容的SecKeyEncrypt替代品:

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

您应该能够相当容易地对代码进行解密;我不需要它,所以我没有编写该函数。

相关问题:另请参见。“将同时执行异步和同步加密”这个示例似乎只显示了一个边缘情况——即整个明文一次可用的情况。OpenSSL的所有EVP_*更新方法都对无界/流数据进行操作,而您的示例没有,因此没有完全回答这个问题。我的回答是针对最常见的情况的简单回答。出于流传输目的,请使用SectTransformCreateReadTransformWithReadStream创建读取转换,然后使用SectTransformCreateGroupTransform和SectTransformConnectTransforms链接它们。有关更多信息,请参阅苹果的《安全转换编程指南》——具体来说,安全转换基础>执行链式转换。