在哪里可以找到一些用于Mac OS X上的公钥加密和解密的简单示例代码?我很沮丧,Apple的“证书,密钥和信任服务编程指南”显示了如何在iOS上执行此操作,但所需的API(SecKeyEncrypt
,SecKeyDecrypt
)显然在Mac OS上不可用X.在“CryptoSample”中可能有一种方法可以做到这一点,但它看起来并不清晰或简单,并且示例项目太旧而无法使用当前版本的Xcode打开。
答案 0 :(得分:6)
安全框架API在Mac OS版本之间频繁更改。最佳方法取决于您定位的版本:
如果您的代码只需要在10.7及更高版本上运行,则可以使用安全转换,这是一种用于加密转换的新的高级公共API。 安全性转换编程指南具有有用(且简单!)的示例代码:
您需要使用SecEncryptTransformCreate
或SecDecryptTransformCreate
创建转换,使用SecTransformSetAttribute
设置其输入并使用SecTransformExecute
执行。
如果您需要支持Mac OS 10.6或更低版本,则必须使用低级且相当可怕的CDSA API。 CryptoSample
的{{1}}是一个简明的例子。
您可以分别使用cdsaEncrypt
和CSSM_CSP_HANDLE
从SecKeyRef获取CSSM_KEY
和SecKeyGetCSPHandle
。
要了解有关CDSA的更多信息,可从Open Group获取完整规范(免费,但需要注册):
https://www2.opengroup.org/ogsys/jsp/publications/PublicationDetails.jsp?publicationid=11287
祝你好运!如果私钥创建为可导出,则可以以不受保护的格式导出私钥并直接使用openssl。这会将原始密钥数据直接放在应用程序的地址空间中,因此它会破坏Keychain的主要用途之一。不要这样做。
最后,你可以搞乱私人功能。 Mac OS 10.6和10.7包含但不公开声明SecKeyGetCSSMKey
和SecKeyEncrypt
,其参数与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的前身。