来自iOS中X.509 ASN.1 RSA公钥的SecKeyRef

Arjunyg

我意识到在Stack Overflow上已经有很多我要问的问题类似的问题,但是没有一个问题有明确的答案可以真正满足我的需求,所以我们开始:

我的程序通过网络接收了ASN.1编码的RSA公钥。我将数据存储在一个简单的NSData实例中。我希望使用该公钥对16个字节的数据进行编码,然后通过网络返回这些数据。根据我的研究,最好的方法似乎是使用SecKeyRef。根据Apple提供的可笑的模糊文档,可以使用一些代码来完成此操作。但是,他们的代码存在问题。每次我想使用公钥时,都需要将其添加到钥匙串中并为其赋予唯一标识符。问题是该密钥只能使用一次我正在寻找一种获取SecKeyRef的方法,该密钥不在钥匙串中,而是从ASN.1编码的钥匙创建的。

我还考虑了通过base64编码将其转换为通用PEM并将其包装在'----- BEGIN PUBLIC KEY -----'和'----- END PUBLIC KEY -----中的可能性。然后将其加载到SecKeyRef中,但是我也没有找到执行此操作的方法。

另外,我在密钥类型,密钥格式等方面没有太多选择。它来自第三方Java服务器。耶。

我目前有另一种加载密钥的方法,(也许)没有将它们添加到密钥链中,但是显然(通过反复试验:D)密钥不是DER格式的,因此我不能像这样加载它。

SecCertificateRef certificateRef = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)data); //data contains the public key - received over the network
SecPolicyRef policyRef = SecPolicyCreateBasicX509();
SecTrustRef trustRef;

OSStatus status = SecTrustCreateWithCertificates(certificateRef, policyRef, &trustRef);
NSAssert(status == errSecSuccess, @"SecTrustCreateWithCertificates failed.");

SecTrustResultType trustResult;
status = SecTrustEvaluate(trustRef, &trustResult);
NSAssert(status == errSecSuccess, @"SecTrustEvaluate failed.");

SecKeyRef publicKey = SecTrustCopyPublicKey(trustRef); //The Result :)
NSAssert(publicKey != NULL, @"SecTrustCopyPublicKey failed.");

if (certificateRef) CFRelease(certificateRef);
if (policyRef) CFRelease(policyRef);
if (trustRef) CFRelease(trustRef);

PS:苹果为什么要这么难?静态链接OpenSSL很容易,但是随后适用各种出口法规和其他问题。

Arjunyg

问题显然出在“证书”的来源上,它实际上只不过是包裹在某些DER标签中的钥匙而已

从正面来看,由于这篇http://blog.wingsofhermes.org/?p=75博客文章中的黑魔法,我成功地实现了我的大部分目标。

成功:

  • 从数据而不是文件加载密钥
  • Java服务器成功读取了密钥(AES)的加密。

成功较少:

  • 不得不使用唯一的标识符,但是我重复使用了它,因此不需要疯狂的命名方案。
  • 钥匙暂时添加到钥匙串中,但是我将其一次性使用后将其删除,因此也可以解决。

我仍然不太清楚if语句数组与循环和大量魔术数字混合的确切作用,但是至少它可以工作,并且由于密钥始终来自同一来源,因此除非它们更改了key,否则它不会中断。 Java安全提供程序...等等,这实际上很有可能...哦,好吧……至少它在Java 7标准中有些特定。

*交叉手指* *希望一切都不会中断*

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用ASN.1定义的x509 algorithmIdentifier

来自分类Dev

生成1024位RSA密钥对并将公钥以ASN.1格式(hex)保存在node.js中

来自分类Dev

使用Java将ASN1序列解码为RSA公钥

来自分类Dev

使用来自 X509 证书 C++ 的公钥的 RSA 公共加密

来自分类常见问题

使用Apache CXF时org.bouncycastle.asn1.x509.SubjectPublicKeyInfo的NoClassDefFoundError

来自分类Dev

X.509证书中ECDSA签名的ASN.1结构

来自分类Dev

错误:0D0680A8:asn1编码例程:ASN1_CHECK_TLEN:导入RSA公钥时标记错误

来自分类Dev

从C#导出用于Java的X509EncodedKeySpec的RSA公钥

来自分类Dev

解码来自CAC / x509证书扩展名的ASN.1数据(主题目录属性>国籍国家)

来自分类Dev

使用Swift生成base64 url编码的X.509格式2048位RSA公钥?

来自分类Dev

从X.509证书中提取PEM公钥

来自分类Dev

无法从x509证书中提取公钥

来自分类Dev

从证书 x509 中提取公钥

来自分类Dev

轻量级的API可以读取Java中的PKCS#1 RSA公钥?

来自分类Dev

X.509 RSA加密/解密iOS

来自分类Dev

如何从Node.js中解析的X509认证中获取公钥长度

来自分类Dev

Android中的RSA公钥实现

来自分类Dev

验证OpenSSL中的RSA公钥?

来自分类Dev

OpenPGP / X.509网桥:如何验证公钥?

来自分类Dev

SAML断言/验证如何与X509公钥一起使用

来自分类Dev

OpenSSL如何找出X509证书中公钥的比特大小是多少

来自分类Dev

Java安全性-具有公钥的X509证书验证

来自分类Dev

在Android(Java / Kotlin)上获取X.509证书ECDH私钥和公钥

来自分类Dev

如何使用x509公钥来验证已签名/已哈希的Alexa请求正文?

来自分类Dev

OpenPGP / X.509网桥:如何验证公钥?

来自分类Dev

Keytool - 使用现有的私钥生成 X.509 格式的公钥

来自分类Dev

如何从X509转换为PKCS1编码的RSA密钥

来自分类Dev

从base64 RSA公钥生成SecKeyRef

来自分类Dev

从base64 RSA公钥生成SecKeyRef

Related 相关文章

  1. 1

    如何使用ASN.1定义的x509 algorithmIdentifier

  2. 2

    生成1024位RSA密钥对并将公钥以ASN.1格式(hex)保存在node.js中

  3. 3

    使用Java将ASN1序列解码为RSA公钥

  4. 4

    使用来自 X509 证书 C++ 的公钥的 RSA 公共加密

  5. 5

    使用Apache CXF时org.bouncycastle.asn1.x509.SubjectPublicKeyInfo的NoClassDefFoundError

  6. 6

    X.509证书中ECDSA签名的ASN.1结构

  7. 7

    错误:0D0680A8:asn1编码例程:ASN1_CHECK_TLEN:导入RSA公钥时标记错误

  8. 8

    从C#导出用于Java的X509EncodedKeySpec的RSA公钥

  9. 9

    解码来自CAC / x509证书扩展名的ASN.1数据(主题目录属性>国籍国家)

  10. 10

    使用Swift生成base64 url编码的X.509格式2048位RSA公钥?

  11. 11

    从X.509证书中提取PEM公钥

  12. 12

    无法从x509证书中提取公钥

  13. 13

    从证书 x509 中提取公钥

  14. 14

    轻量级的API可以读取Java中的PKCS#1 RSA公钥?

  15. 15

    X.509 RSA加密/解密iOS

  16. 16

    如何从Node.js中解析的X509认证中获取公钥长度

  17. 17

    Android中的RSA公钥实现

  18. 18

    验证OpenSSL中的RSA公钥?

  19. 19

    OpenPGP / X.509网桥:如何验证公钥?

  20. 20

    SAML断言/验证如何与X509公钥一起使用

  21. 21

    OpenSSL如何找出X509证书中公钥的比特大小是多少

  22. 22

    Java安全性-具有公钥的X509证书验证

  23. 23

    在Android(Java / Kotlin)上获取X.509证书ECDH私钥和公钥

  24. 24

    如何使用x509公钥来验证已签名/已哈希的Alexa请求正文?

  25. 25

    OpenPGP / X.509网桥:如何验证公钥?

  26. 26

    Keytool - 使用现有的私钥生成 X.509 格式的公钥

  27. 27

    如何从X509转换为PKCS1编码的RSA密钥

  28. 28

    从base64 RSA公钥生成SecKeyRef

  29. 29

    从base64 RSA公钥生成SecKeyRef

热门标签

归档