2012-04-16 6 views
6

पर जेनरेट की गई सार्वजनिक कुंजी को प्रकाशित करने का तरीका पता नहीं लगा सकता है। मैं आरएसए कुंजी की एक जोड़ी बनाने के लिए आईफोन पर commoncrypto लाइब्रेरी का उपयोग कर रहा हूं और मैं सार्वजनिक कुंजी को एक सर्वर (पायथन) भेजने की कोशिश कर रहा हूं ताकि मैं इसका उपयोग कर सकूं यह फोन से भेजे गए हस्ताक्षर को सत्यापित करने के लिए।आईफोन

मैं CommonCrypto उदाहरण से सटीक कोड का उपयोग कर रहा विधि getPublicKeyBits() जो इस तरह दिखता है का उपयोग करते हुए:

`- (NSData ) getPublicKeyBits { OSStatus sanityCheck = noErr; एनएसडीटा publicKeyBits = शून्य; एनएसडीटा * पब्लिकटाग = [[एनएसडीएटी आवंटन] initWithBytes: publicKeyIdentifier लंबाई: sizeof (publicKeyIdentifier)]; CFDataRef cfresult = NULL;

NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init]; 

// Set the public key query dictionary. 
[queryPublicKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass]; 
[queryPublicKey setObject:publicTag forKey:(__bridge id)kSecAttrApplicationTag]; 
[queryPublicKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType]; 
[queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnData]; 

// Get the key bits. 
sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)queryPublicKey, (CFTypeRef*)&cfresult); 


if (sanityCheck != noErr) 
{ 
    publicKeyBits = nil; 
} 
else 
{ 
    publicKeyBits = (__bridge_transfer NSData *)cfresult; 
} 

return publicKeyBits; 

} `

समस्या मैं इसे कैसे, वास्तव में, कुंजी संग्रहीत किया जा रहा है या कैसे पारित करने के लिए नहीं पता है कि है। मैं संरचना में प्राप्त करने के लिए getPublicKeyBits() का उपयोग कर रहा हूं, और मैंने इसे base64 में एन्कोड करने के लिए एक लाइब्रेरी आयात की है। मुझे एक कुंजी मिल रही है (SHA1, मैं SHA256 पर जाना चाहता हूं, लेकिन यह काम करने के लिए यह द्वितीयक है) और base64 संस्करण अन्य कुंजियों की तरह दिखता है जो मैंने यहां पाया है और अन्य लोगों में आरएसए समस्याओं को हल करना है।

मैं पाइथन में M2Crypto लाइब्रेरी का उपयोग करने की कोशिश कर रहा हूं और जब मैं सत्यापित करने का प्रयास करता हूं कि मुझे त्रुटि "RSA Error: No Start Line" मिल रही है।

pubKey = request.form['publickey'] 

uid = uuid4().hex 
while not unique(uid, User): 
    uid = uuid.uuid4().hex 
user = User(uid, email, secret, pubKey) 

और कोड मैं हस्ताक्षर की जांच करने के लिए उपयोग कर रहा हूँ:

def validate(sessionKey, sig, pem): 
    bio = BIO.MemoryBuffer(pem.encode('ascii')) 
    rsa = RSA.load_pub_key_bio(bio) 
    pubkey = EVP.PKey() 
    pubkey.assign_rsa(rsa) 

    pubkey.reset_context(md='sha1') 
    pubkey.verify_init() 
    pubkey.verify_update(sessionKey) 

    return pubkey.verify_final(sig) 

मैं वास्तव में मैं क्या कर रहा हूँ के रूप में स्टम्प्ड हूँ यहाँ कोड मैं सार्वजनिक कुंजी प्राप्त करने के लिए उपयोग कर रहा हूँ है गलत कर रहा है लेकिन मुझे लगता है कि मैं करीब आ रहा हूं। अगर मेरी पूरी विधि यह नहीं है कि आप इसे कैसे करेंगे, तो मुझे फोन पर आरएसए कुंजी बनाने के लिए किसी अन्य तरीके से सुनना अच्छा लगेगा, सार्वजनिक कुंजी को सर्वर पर प्रकाशित करें, और उसके बाद उस सर्वर पर फोन से हस्ताक्षर सत्यापित करें ।

धन्यवाद!

+0

क्या आप अपना आईओएस कोड भी पोस्ट कर सकते हैं जिसका उपयोग आप सार्वजनिक कुंजी डेटा बनाने के लिए करते हैं? – MrTJ

+0

कोड – brennen

उत्तर

1

आप एप्पल CryptoExercise कोड

https://developer.apple.com/library/ios/#samplecode/CryptoExercise/Listings/Classes_SecKeyWrapper_h.html

में SecKeyWrapper से getPublicKeyBits विधि का उपयोग कर सकते हैं यह आपको डीईआर बाइनरी डेटा इनकोडिंग मिल जाएगा। फिर पाइथन में M2Crypto में लोड करने के लिए निम्न विधि का उपयोग करें: (मूल रूप से, बस इसे बेस 64 और एक विधि का आह्वान करें।)

https://stackoverflow.com/a/5765576/584616

मैं एक एआरसी सक्षम इस getPublicKeyBits विधि का संस्करण है, लेकिन मैं चारों ओर यह अभी तक पोस्ट करने से नहीं मिला है।

अद्यतन - आपके सवाल का फिर से पढ़ने पर, इस सवाल का जवाब वास्तव में यहाँ है:

How to find out the modulus and exponent of RSA Public Key on iPhone/Objective C

आप इस का उपयोग कर सकते हैं NSData, के रूप में मापांक और प्रतिपादक जिसे आप आसानी से करने के लिए सक्षम होना चाहिए प्राप्त करने के लिए बेस 64 या अपनी पसंद के प्रतिनिधित्व में परिवर्तित करें।

0

एम 2 सी स्ट्रिपो का अंतर्निहित कार्यान्वयन ओपनएसएसएल है। ओपनएसएसएल आपके शुद्ध सार्वजनिक कुंजी को आयात नहीं करेगा क्योंकि आपने इसे निर्यात किया है, लेकिन केवल तभी यदि यह संभवतः स्वयं हस्ताक्षरित प्रमाणपत्र में "एम्बेडेड" है। सामान्य क्रिप्टो या सुरक्षा ढांचे के साथ एक स्व-हस्ताक्षरित प्रमाणपत्र कैसे बनाएं, अपनी सार्वजनिक कुंजी एम्बेड करें और इसे अपनी निजी कुंजी से साइन करें, अपना डेटा निकालें और इसे अपने सर्वर पर भेजें: इसे काम करना चाहिए।

भी openssl_pkey_get_public not open public key, "no start line" error (दूसरा जवाब) देखें

+0

के साथ अद्यतन पोस्ट का मतलब क्या है "इसका डेटा निकालें"? – brennen

+0

वही बात जो आपने अपनी निजी कुंजी के लिए उपयोग की थी: एक बार जब आपके पास स्मृति में प्रमाणपत्र हो, तो बाइनरी डेटा को NSData में कॉपी करें और सर्वर पर बाइट स्ट्रीम भेजें। – MrTJ