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

JWW*_*ker 6 security macos openssl

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

Kar*_*tey 6

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

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

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

    您将要使用SecEncryptTransformCreate或创建变换,使用SecDecryptTransformCreate它来设置其输入SecTransformSetAttribute并执行它SecTransformExecute.

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

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

    您可以分别使用和从SecKeyRef中获取a CSSM_CSP_HANDLE和a .CSSM_KEYSecKeyGetCSPHandleSecKeyGetCSSMKey

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

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

    祝好运!

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

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