Security Mac上公钥加密/解密的示例代码?

Security Mac上公钥加密/解密的示例代码?,security,macos,openssl,Security,Macos,Openssl,在哪里可以找到Mac OS X上公钥加密和解密的简单示例代码?苹果公司的《证书、密钥和信任服务编程指南》展示了如何在iOS上实现这一功能,我对此感到失望,但所需的API(SecKeyEncrypt,SecKeyDecrypt)显然无法在Mac OS X上实现。在“CryptoSample”中可能有实现这一功能的方法,但它看起来并不清晰或简单,而且示例项目太旧,无法使用当前版本的Xcode打开。Mac OS X在libcrypto中包含OpenSSL。CommonCrypto框架似乎源自OpenS

在哪里可以找到Mac OS X上公钥加密和解密的简单示例代码?苹果公司的《证书、密钥和信任服务编程指南》展示了如何在iOS上实现这一功能,我对此感到失望,但所需的API(
SecKeyEncrypt
SecKeyDecrypt
)显然无法在Mac OS X上实现。在“CryptoSample”中可能有实现这一功能的方法,但它看起来并不清晰或简单,而且示例项目太旧,无法使用当前版本的Xcode打开。

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

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

  • 如果您的代码只需要在10.7及以上版本上运行,则可以使用安全转换,这是一种用于加密转换的新的高级公共API。《安全转换编程指南》提供了有用(且简单!)的示例代码:

    您需要使用
    SecEncryptTransformCreate
    SecDecryptTransformCreate
    创建转换,使用
    SecTransformStatAttribute
    设置其输入,并使用
    SecTransformExecute
    执行转换

  • 如果您需要支持MacOS10.6或更低版本,则必须使用低级别且相当可怕的CDSAAPI
    CryptoSample
    cdsaEncrypt
    就是一个简明的例子

    您可以分别使用
    seckeyGetCsHandle
    SecKeyGetCSSMKey
    从SecKeyRef获取
    CSSM\u句柄和
    cssmkey

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

    祝你好运

  • 如果私钥是创建为可导出的,则可以将其以不受保护的格式导出,并直接使用openssl。这会将原始密钥数据直接放在应用程序的地址空间中,因此会破坏密钥链的主要用途之一。不要这样做

  • 最后,您可以随意处理私有函数。Mac OS 10.6和10.7包括但不公开声明,
    SecKeyEncrypt
    SecKeyDecrypt
    ,参数与iOS上相同。快速的“脏”解决方案是简单地声明和使用它们(弱链接,带有通常的警告)。在您计划分发给其他人的代码中执行此操作可能不是一个好主意


  • 在以下位置有一个使用公钥解密数据的实现:。 Security.framework没有用于此类功能的公共API,这就是为什么CSSM需要直接使用的原因,即使它被标记为已弃用。
    要使用公钥进行加密,只需使用SecEncryptTransformCreate,但要进行公钥解密,您需要使用CSSMPublicKeyDecrypt类。

    我不怀疑Mac OS X有API可以做到这一点,但问题是关于“简单示例代码”。苹果强烈反对在Mac上使用openssl。苹果方面的争论是openssl的API不够稳定。Mac OS X上推荐的API是使用Security.framework。您不应该使用私钥解密吗?它可以双向使用。使用私钥加密和使用公钥解密类似于数字签名(请参阅)。根据文档,安全转换不能使用RSA密钥,并且OpenSSL不推荐在第三方应用程序中使用。所以只有#2和#4是现实的。我无法想象苹果为什么没有在OS X中使用SecKeyEncrypt和SecKeyDecrypt公共API。他们无法在不破坏iOS模拟器的情况下(永远)避免支持这些API,并且iOS SDK将它们列为OS X中可用的API。可能有人在错误的位置放置了一个#if,并且它被错误地从标题中删除。请提交一个bug。