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

时间:2010-11-10 02:15:09

标签: security macos openssl

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

3 个答案:

答案 0 :(得分:6)

安全框架API在Mac OS版本之间频繁更改。最佳方法取决于您定位的版本:

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

    http://developer.apple.com/library/mac/#documentation/Security/Conceptual/SecTransformPG/SecurityTransformsBasics/SecurityTransformsBasics.html

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

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

    http://developer.apple.com/library/mac/#samplecode/CryptoSample/Listings/libCdsaCrypt_libCdsaCrypt_cpp.html

    您可以分别使用cdsaEncryptCSSM_CSP_HANDLE从SecKeyRef获取CSSM_KEYSecKeyGetCSPHandle

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

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

    祝你好运!

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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