由于OpenSSL在OSX 10.7+中弃用,我想从OpenSSL切换到内部OSX钥匙链和Crypto功能。

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

如何使用非对称(RSA)键进行加密/解密随机生成的对称密钥。openssl它很容易。

Apple dev文档,他们说commoncrepto支持不对称加密,但在检查标题时,我只能看到对对称的东西的支持。

任何提示?

有帮助吗?

解决方案

看看加密消息语法服务,看看是否可以执行所需的。

此外,您就误读了OpenSSL的东西。不推荐使用操作系统的OpenSSL库。这并不意味着您无法继续使用OpenSSL。 openssl是开源的,并且没有什么可以阻止您从下载它并在您的应用程序中自由使用它。

Apple的弃用只意味着如果您使用openssl,则需要包含openssl库的自己副本,以便负责保持您的openssl库 - 迄今为止,用于修复随后发生的任何破损。 : - )

如果不是,则在OS X中存在IOS非对称加密和解密功能(SeckeyEncrypt和SeckeyDecrypt),并且iOS头甚至会显示它们在OS X中可用。我不确定为什么不在OS X SDK。我提出了一个错误,它被标记为杜普。

Apple可能无法在将来删除这些功能,而不会破坏模拟器,但如果您正在向App Store提交,并且他们会给您悲伤的话,这是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;
}
.

您应该能够相当容易地调整解密的代码;我的目的我不需要它,所以我没有写这个功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top