macos - 如何在不使用 openssl 的情况下使用 OSX 10.7+ 进行非对称加密/解密?

标签 macos openssl keychain commoncrypto security-framework

由于 openssl 在 osx 10.7+ 中已弃用,我想从 openssl 切换到内部 osx 钥匙串(keychain)和加密功能。

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

如何使用非对称 (RSA) key 对随机生成的对称 key 进行加密/解密。使用 openssl 这非常容易。

apple dev docs ,他们说 CommonCrypto 支持非对称加密,但在检查 header 时,我只能看到对对称内容的支持。

有什么提示吗?

最佳答案

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

此外,您有点误读了 OpenSSL 的内容。操作系统附带的 OpenSSL 库已弃用。这并不意味着您不能继续使用 OpenSSL。 OpenSSL 是开源的,没有什么可以阻止您下载它并在您的应用程序中自由使用它。

Apple 的弃用只是意味着,如果您使用 OpenSSL,则需要包含您自己的 OpenSSL 库副本,以便负责保持 OpenSSL 库的最新状态 -最新信息并修复您执行此操作时发生的任何损坏。 :-)

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

苹果将来可能不可能在不破坏模拟器的情况下删除这些功能,但是如果您向应用程序商店提交并且他们让您对使用它们感到悲伤,这里有一个大致兼容的 SecKeyEncrypt 替代品使用安全转换 API:

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

您应该能够相当轻松地调整解密代码;我的目的不需要它,所以我没有编写该函数。

关于macos - 如何在不使用 openssl 的情况下使用 OSX 10.7+ 进行非对称加密/解密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11712440/

相关文章:

macos - 安装libjpeg v8到/opt/local

windows - 警告 : can't open config file: ./bin/openssl.cnf

c++ - Boost、asio、https 和主机/证书验证

ios - 如何使用 SecIdentityRef 或持久引用从钥匙串(keychain)中删除身份?

objective-c - Mac OS X -- 在最前面的窗口更改时收到通知

swift - Xib 包含 NSSCrollView 时加载崩溃

macos - 执行错误 : Finder got an error: Application isn’t running. (-600)

linux - 为什么 openssl/md5.h 链接到 "crypto"而不是 "ssl"

objective-c - Objective-C : Exporting Private and Public Key from Keychain

ios - 如何处理弃用函数 'unarchiveObject(with:)' ?