[英]SecKeyRef from X.509 ASN.1 RSA Public Key in iOS
我意識到我在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很容易,但隨后出現各種出口法規和其他問題。
問題顯然是“證書”的來源,它實際上並不比一些DER標簽包含的密鑰多得多。
在http://blog.wingsofhermes.org/?p=75博客文章中,由於黑魔法,我已經成功地實現了我的大部分目標。
成功:
不太成功:
我仍然不太清楚if語句的數組與循環和魔法數字的數量完全相同,但至少它是有效的,因為密鑰總是來自同一個源,它不應該破壞,除非他們改變了java安全提供程序......哦等等,這實際上有點可能......哦......至少它在Java 7標准中有點具體。
*交叉手指* *希望沒有任何打破*
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.