我在哪里可以找到一些简单的示例代码,用于在Mac OS X上进行公钥加密和解密?我感到沮丧的是,苹果的“证书,密钥和信任服务编程指南”展示了如何在iOS上做这些事情,但所需的API(SecKeyEncrypt
,SecKeyDecrypt
)显然在Mac OS X上不可用。可能有办法它在“CryptoSample”中,但它看起来并不清晰或简单,并且示例项目太旧而无法用当前版本的Xcode打开。Mac上的公钥加密/解密示例代码?
回答
在Mac OS发行版之间,安全框架API更改频繁。最好的方法取决于你的目标是什么版本:
如果你的代码只需要在运行10.7及以上版本,你可以使用安全变换,用于加密变换的新的高层次的公共API。该安全变换编程指南有有益的(简单!)示例代码:
你要创建一个转换使用
SecEncryptTransformCreate
或SecDecryptTransformCreate
,使用SecTransformSetAttribute
与SecTransformExecute
执行它设置它的输入。如果您需要支持Mac OS 10.6或更低版本,则必须使用低级且相当可怕的CDSA API。
CryptoSample
的cdsaEncrypt
是一个简明的例子。您可以通过使用分别
SecKeyGetCSPHandle
和SecKeyGetCSSMKey
,得到一个SecKeyRef一个CSSM_CSP_HANDLE
和CSSM_KEY
。要了解更多关于CDSA,完整的规范可从公开组(免费,但需要注册):
https://www2.opengroup.org/ogsys/jsp/publications/PublicationDetails.jsp?publicationid=11287
祝你好运!
如果私钥创建为可导出,则可以以不受保护的格式导出并直接使用openssl。这将原始密钥数据直接放在应用程序的地址空间中,所以它将击败Keychain的一个主要目的。不要这样做。
最后,你可以使用私人功能。 Mac OS 10.6和10.7包括但不公开声明
SecKeyEncrypt
和SecKeyDecrypt
,其参数与iOS上相同。 quick'n'dirty解决方案是简单地声明和使用它们(与通常的注意事项相关性较弱)。在您打算分发给其他人的代码中,这可能是一个糟糕的主意。
有一个使用公钥的解密数据的实现:https://github.com/karstenBriksoft/CSSMPublicKeyDecrypt。 Security.framework没有用于这种功能的公共API,这就是为什么CSSM需要直接使用,即使其标记为已弃用。 要使用公钥进行加密,只需使用SecEncryptTransformCreate,但对于公钥解密,您需要使用CSSMPublicKeyDecrypt类。
是不是应该使用私钥解密? – 2014-08-25 11:32:47
它可以两种方式。使用私钥进行加密并使用公钥进行解密就像数字签名(请参阅http://en.wikipedia.org/wiki/Public-key_cryptography#Inverse_Public_Key_Encryption)。 – Karsten 2014-08-26 12:47:33
- 1. 从密钥代码解析密钥
- 2. 公钥加密
- 3. AES加密,示例代码
- 4. 在OpenSSL API代码中查找主密钥的MAC密钥,加密密钥和初始化向量
- 5. Mac OS上的加密/解密错误
- 6. RSA加密公钥?
- 7. iphone - 如何用公钥加密NSData并用私钥解密?
- 8. 用RSA公钥和私钥加密和解密一个SecretKey
- 9. 红宝石:文件加密/解密与私有/公共密钥
- 10. Ruby中的公钥加密演示
- 11. 秘密密钥分配与Diffie-Hellman的公钥加密
- 12. 用公钥解密RSA
- 13. 用公钥解密,openssl_public_decrypt像
- 14. 用公钥解密文件
- 15. 为什么解密的密钥与加密密钥不一样?
- 16. 问题在公钥密码
- 17. AES加密和解密的源代码
- 18. Python:Pycrypto RSA公共密钥加密错误
- 19. RSA密钥加密/解密问题
- 20. 用密钥加密和解密数据
- 21. 无法解密RSA加密密钥
- 22. RSA加密基于公钥
- 23. RSA使用公钥加密
- 24. Bouncycastle:用公钥加密
- 25. C/C++加密/与公钥
- 26. 公钥邮件加密
- 27. 解密Windows实例密码
- 28. Eclipse:Android上的AES加密和解密密钥
- 29. PHP - 解密加密密码
- 30. 从密码导出加密密钥
根据文档,安全性转换不能使用RSA密钥,并且不推荐使用OpenSSL在第三方应用程序中使用。所以只有#2和#4是现实的。我无法想象*为什么Apple在OS X中没有制作SecKeyEncrypt和SecKeyDecrypt公共API。他们无法切实避免在不打破iOS模拟器的情况下支持它们(永远和永远),并且iOS SDK将它们列为可用在OS X中。有人可能会将#if放在错误的位置,并从头文件中错误地清除。请提交一个错误。 – dgatwood 2015-03-20 21:33:58