2010-11-10 96 views
6

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

回答

6

在Mac OS发行版之间,安全框架API更改频繁。最好的方法取决于你的目标是什么版本:

  1. 如果你的代码只需要在运行10.7及以上版本,你可以使用安全变换,用于加密变换的新的高层次的公共API。该安全变换编程指南有有益的(简单!)示例代码:

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

    你要创建一个转换使用SecEncryptTransformCreateSecDecryptTransformCreate,使用SecTransformSetAttributeSecTransformExecute执行它设置它的输入。

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

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

    您可以通过使用分别SecKeyGetCSPHandleSecKeyGetCSSMKey,得到一个SecKeyRef一个CSSM_CSP_HANDLECSSM_KEY

    要了解更多关于CDSA,完整的规范可从公开组(免费,但需要注册):

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

    祝你好运!

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

  4. 最后,你可以使用私人功能。 Mac OS 10.6和10.7包括但不公开声明SecKeyEncryptSecKeyDecrypt,其参数与iOS上相同。 quick'n'dirty解决方案是简单地声明和使用它们(与通常的注意事项相关性较弱)。在您打算分发给其他人的代码中,这可能是一个糟糕的主意。

+0

根据文档,安全性转换不能使用RSA密钥,并且不推荐使用OpenSSL在第三方应用程序中使用。所以只有#2和#4是现实的。我无法想象*为什么Apple在OS X中没有制作SecKeyEncrypt和SecKeyDecrypt公共API。他们无法切实避免在不打破iOS模拟器的情况下支持它们(永远和永远),并且iOS SDK将它们列为可用在OS X中。有人可能会将#if放在错误的位置,并从头文件中错误地清除。请提交一个错误。 – dgatwood 2015-03-20 21:33:58

1

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

+0

我不怀疑Mac OS X具有可以实现它的API,但问题是关于“简单示例代码”。 – JWWalker 2010-11-10 18:37:48

+0

苹果*强烈*不鼓励在Mac上使用openssl。苹果方面的观点是openssl不太稳定的API。使用Security.framework是Mac OS X上的推荐API。 – Trenskow 2013-08-24 13:22:40

4

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

+0

是不是应该使用私钥解密? – 2014-08-25 11:32:47

+1

它可以两种方式。使用私钥进行加密并使用公钥进行解密就像数字签名(请参阅http://en.wikipedia.org/wiki/Public-key_cryptography#Inverse_Public_Key_Encryption)。 – Karsten 2014-08-26 12:47:33