首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有openssl的情况下使用OSX 10.7+进行非对称加密/解密?

如何在没有openssl的情况下使用OSX 10.7+进行非对称加密/解密?
EN

Stack Overflow用户
提问于 2012-07-30 03:52:51
回答 1查看 1.6K关注 0票数 2

由于openssl在osx 10.7+中已被弃用,我想从openssl切换到内部的osx密钥链和加密函数。

但现在我被非对称加密/解密卡住了。

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

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

有什么提示吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-18 07:16:38

看一下加密消息语法服务,看看它是否能满足您的需求。

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

苹果的弃用只是意味着如果你使用OpenSSL,你需要包括你的自己的OpenSSL库的副本,这样就会负责保持你的OpenSSL库最新,并修复你这样做时发生的任何破坏。:-)

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

苹果将来可能不可能在不破坏模拟器的情况下移除这些功能,但是如果你提交到应用商店,他们给你带来了使用它们的痛苦,这里是一个使用Security Transforms API构建的SecKeyEncrypt的大致兼容的替代品:

代码语言:javascript
复制
// 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;
}

您应该能够相当容易地调整代码以进行解密;我并不需要它来实现我的目的,所以我没有编写该函数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11712440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档