2012-09-07 11 views
12

मैं किसी iOS एप्लिकेशन पर काम कर रहा हूँ बेस 64 से SecKeyRef और मैं एक बेस 64 जैसे सार्वजनिक कुंजी कोडित हो:प्राप्त कोडित स्ट्रिंग

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3gn + tJ1 + PbP0GHa6hmM35WsVyibpypWAwRuBYY4MGfh3VWoXgiyiLo5HJTW1eR9BUFq3z + yOG1rwzSabZ8I4zneWm0kH7xErSjNrMbmjirbL7e6TQNa1ujP/x4x9XVbqf3vIsNVs19kn/qSX/HGzd5Ct3TGAo0AT0T4JwkCfciwIDAQAB

मैं इस सार्वजनिक कुंजी के साथ कुछ पाठ एन्कोड करना चाहता हूं, लेकिन मुझे इस स्ट्रिंग को एक उपयोगी सार्वजनिक कुंजी में बदलने का कोई तरीका नहीं मिल रहा है।

मुझे क्या करने की ज़रूरत है?

+0

ऐसा करने के लिए आपको ['SecItemAdd', फिर' SecItemCopyMatching'] (https://developer.apple.com/library/ios/#documentation/security/conceptual/keychainServConcepts/iPhoneTasks/iPhoneTasks.html) करना पड़ सकता है । – bobobobo

+0

[यह भी देखें] (http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/) – bobobobo

+0

क्या आपने कभी अपने प्रश्न का उत्तर प्राप्त किया है? – Devarshi

उत्तर

10

सबसे पहले, आपको अपने एनएसएसटींग को NSData में बेस 64 डीकोड करना होगा: समाधान के लिए this answer देखें। यदि आप आईओएस 7 के लिए विकास कर रहे हैं, तो आप initWithBase64EncodedString::options का उपयोग कर सकते हैं।

एक बार जब आपके पास NSData के रूप में डीकोड किया गया स्ट्रिंग हो, तो आप इससे प्रमाणपत्र तैयार करने का प्रयास कर सकते हैं। आपके द्वारा प्राप्त प्रमाण पत्र का प्रारूप महत्वपूर्ण है - आप डीईआर (जो आम है) या पीकेसीएस 12 का उपयोग कर सकते हैं। आपको इसे डीईआर के रूप में प्राप्त करने की संभावना है, इसलिए मुझे लगता है कि आपको मार्गदर्शन की आवश्यकता है।

एक प्रमाण पत्र और नीति बनाएं:

SecCertificateRef cert = NULL; 
SecPolicyRef  policy = NULL; 

cert = SecCertificateCreateWithData(kCFAllocatorDefault, data); 
policy = SecPolicyCreateBasicX509(); 

cerificate डेटा गलत प्रारूप में था जब SecCertificateCreateWithData के लिए पारित आप एक शून्य परिणाम मिल जाएगा।

इस बिंदु पर आपके पास प्रमाण पत्र है, लेकिन सार्वजनिक कुंजी नहीं है। सार्वजनिक कुंजी प्राप्त करने के लिए आपको प्रमाणपत्र के create a trust reference and evaluate the trust अवश्य होना चाहिए।

OSStatus  status  = noErr; 
SecKeyRef  *publicKey = NULL; 
SecTrustRef  trust  = NULL; 
SecTrustResultType trustType = kSecTrustResultInvalid; 

if (cert != NULL){ 
    SecCertificateRef certArray[1] = {cert}; 
    certs = CFArrayCreate(kCFAllocatorDefault, (void *)certArray, 1, NULL); 
    status = SecTrustCreateWithCertificates(certs, policy, &trust); 

    if (status == errSecSuccess){ 
     status = SecTrustEvaluate(trust, &trustType); 

     // Evaulate the trust. 
     switch (trustType) { 
      case kSecTrustResultInvalid: 
      case kSecTrustResultConfirm: 
      case kSecTrustResultDeny: 
      case kSecTrustResultUnspecified: 
      case kSecTrustResultFatalTrustFailure: 
      case kSecTrustResultOtherError: 
       break; 
      case kSecTrustResultRecoverableTrustFailure: 
       *publicKey = SecTrustCopyPublicKey(trust); 
       break; 
      case kSecTrustResultProceed: 
       *publicKey = SecTrustCopyPublicKey(trust); 
       break; 
     } 

    } 
} 

यदि सब कुछ ठीक हो गया, तो अब आपके पास सार्वजनिक कुंजी के साथ एक आबादी वाले SecKeyRef होना चाहिए। यदि यह अच्छी तरह से नहीं चला है, तो आपके पास एक नल सेककीरफ और एक ओएसएसटैटस होगा जो दर्शाता है कि क्या गलत हुआ। सुरक्षा ढांचे में SecBase.h उन त्रुटि कोडों पर अधिक विस्तृत जानकारी देता है।

अब आपके पास एक सार्वजनिक कुंजी के साथ एक सेककेयरफ है, इसका उपयोग किसी निजी कुंजी के साथ डेटा एन्क्रिप्ट करने के लिए programming guide द्वारा अच्छी तरह से कवर किया गया है।

ध्यान दें कि आपको एआरसी या सीएफआरलीज का उपयोग करके उपरोक्त आवंटित चीजें (पॉलिसी, कॉर्ट) जारी करनी होंगी।

+0

क्या पीकेसीएस 1 संभव है? मान लें कि मुझे अलग-अलग सिस्टम द्वारा उत्पन्न कुंजी जोड़ी मिलती है? – Turowicz

संबंधित मुद्दे