【问题标题】:SecKeyRef from X.509 ASN.1 RSA Public Key in iOS来自 iOS 中 X.509 ASN.1 RSA 公钥的 SecKeyRef
【发布时间】:2013-07-20 04:51:00
【问题描述】:

我意识到有很多类似的问题与我即将在 Stack Overflow 上提出的问题类似,但没有一个问题有明确的答案可以真正满足我的需求,所以我们开始吧:

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

我还考虑过通过 base64 编码将其转换为普通 PEM 并将其包装在 '-----BEGIN PUBLIC KEY-----' 和 '-----END PUBLIC KEY-- 中的可能性---' 然后将其加载到 SecKeyRef 中,但我也没有看到这样做的方法。

另外,我在密钥类型、密钥格式等方面没有太多选择。它来自第 3 方 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 很容易,但随之而来的是各种出口法规和其他问题。

【问题讨论】:

  • +1 for - PS:为什么苹果让这变得如此困难? :(

标签: iphone objective-c encryption rsa commoncrypto


【解决方案1】:

问题显然出在“证书”的来源上,实际上并不比the key wrapped in some DER tags多多少。

多亏了这篇 http://blog.wingsofhermes.org/?p=75 博文中的黑魔法,我已经成功地实现了我的大部分目标。

成功:

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

不太成功:

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

我仍然不太清楚 if 语句与循环和大量幻数混合的数组究竟做了什么,但至少它有效,因为密钥总是来自同一个来源,它不应该中断,除非他们更改了 Java 安全提供程序...哦,等等,这实际上有点可能...哦,好吧...至少它在 Java 7 标准中有点具体。

*交叉手指* *希望没有任何问题*

【讨论】:

  • 我也关注了与您相同的博客文章,但我无法在 Java 端正确解密加密的 AES 密钥。您能否分享有关如何将 SecKeyEncrypt 与 SecKeyRef 公钥一起使用以及如何解密的代码?我发布了这个问题,但还没有得到答案:stackoverflow.com/questions/26108672/… ...谢谢!
猜你喜欢
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
相关资源
最近更新 更多