【问题标题】:Sample code for public key encryption/decryption on Mac?Mac上公钥加密/解密的示例代码?
【发布时间】:2022-05-09 19:40:16
【问题描述】:

在哪里可以找到一些在 Mac OS X 上用于公钥加密和解密的简单示例代码?我很沮丧 Apple 的“证书、密钥和信任服务编程指南”展示了如何在 iOS 上执行此操作,但所需的 API(SecKeyEncryptSecKeyDecrypt)显然在 Mac OS X 上不可用。可能有一种在“CryptoSample”中实现的方法,但它看起来不清晰或不简单,并且示例项目太旧,无法使用当前版本的 Xcode 打开。

【问题讨论】:

    标签: security macos openssl


    【解决方案1】:

    安全框架 API 在 Mac OS 版本之间变化相当频繁。最佳方法取决于您的目标版本:

    1. 如果您的代码只需要在 10.7 及更高版本上运行,您可以使用 Security Transforms,这是一种用于加密转换的新的高级公共 API。 Security Transforms Programming Guide 提供了有用(而且简单!)的示例代码:

    https://developer.apple.com/library/archive/documentation/Security/Conceptual/SecTransformPG/SecurityTransformsBasics/SecurityTransformsBasics.html

    您需要使用SecEncryptTransformCreateSecDecryptTransformCreate 创建一个转换,使用SecTransformSetAttribute 设置其输入并使用SecTransformExecute 执行它。

    1. 如果您需要支持 Mac OS 10.6 或更低版本,则必须使用低级且相当可怕的 CDSA API。 CryptoSamplecdsaEncrypt 就是一个简洁的例子。

    https://developer.apple.com/library/archive/samplecode/CryptoSample/Listings/libCdsaCrypt_libCdsaCrypt_cpp.html

    您可以分别使用SecKeyGetCSPHandleSecKeyGetCSSMKey 从SecKeyRef 中获取CSSM_CSP_HANDLECSSM_KEY

    要了解有关 CDSA 的更多信息,可从 Open Group 获得完整规范(免费,但需要注册):

    https://www2.opengroup.org/ogsys/jsp/publications/PublicationDetails.jsp?publicationid=11287

    祝你好运!

    1. 如果私钥是可导出的,您可以将其导出为不受保护的格式并直接使用 openssl。这会将原始密钥数据直接放在应用程序的地址空间中,因此它违背了钥匙串的主要目的之一。不要这样做。

    2. 最后,您可以使用私有函数。 Mac OS 10.6 和 10.7 包括但不公开声明 SecKeyEncryptSecKeyDecrypt,其参数与 iOS 上相同。 quick'n'dirty 解决方案是简单地声明和使用它们(弱链接,带有通常的警告)。在您计划分发给其他人的代码中,这可能是个坏主意。

    【讨论】:

    • 根据文档,安全转换不能采用 RSA 密钥,并且不推荐在第三方应用中使用 OpenSSL。所以只有#2 和#4 是现实的。我无法想象为什么 Apple 没有在 OS X 中创建 SecKeyEncrypt 和 SecKeyDecrypt 公共 API。在不破坏 iOS 模拟器和 iOS SDK 的情况下,他们无法避免(永远和永远)支持它们将它们列为在 OS X 中可用。有人可能将#if 放在错误的位置,并且它被错误地从标题中剥离。请提交错误。
    【解决方案2】:

    有一个使用公钥解密数据的实现:https://github.com/karstenBriksoft/CSSMPublicKeyDecrypt。 Security.framework 没有用于此类功能的公共 API,这就是为什么 CSSM 需要直接使用,即使它被标记为已弃用。 要使用公钥加密,只需使用 SecEncryptTransformCreate,但对于公钥解密,您需要使用 CSSMPublicKeyDecrypt 类。

    【讨论】:

    • 不应该用私钥解密吗?
    • 它可以双向进行。用私钥加密和用公钥解密就像数字签名(见en.wikipedia.org/wiki/…)。
    【解决方案3】:

    Mac OS X 在 libcrypto 中包含 OpenSSL。 CommonCrypto 框架似乎源自 OpenSSL 的前身 SSLeay。

    【讨论】:

    • 我不怀疑 Mac OS X 有可以做到这一点的 API,但问题是关于“简单示例代码”。
    • Apple强烈不鼓励在 Mac 上使用 openssl。苹果方面的论点是 openssl 的 API 不太稳定。在 Mac OS X 上使用 Security.framework 是推荐的 API。
    猜你喜欢
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 2019-06-30
    • 2018-11-25
    相关资源
    最近更新 更多