2011-01-05 20 views
7

क्या बाइट सरणी से PrivateKey उत्पन्न करने का कोई तरीका है? मुझे getEncoded() विधि का उपयोग करके यह बाइट सरणी मिली है, लेकिन अब मुझे इसे वापस निजीकी में परिवर्तित करना है।बाइट सरणी से निजीकी बनाएं

धन्यवाद, वुक

+0

क्या यह मदद चाहिए? http://forums.oracle.com/forums/thread.jspa?threadID=1525932&tstart=105 –

+0

नहीं, इससे मदद नहीं मिली, लेकिन धन्यवाद – Vuk

उत्तर

5

Java docs

कुंजी पर कहा गया है कि आम तौर पर की जेनरेटर, प्रमाण पत्र, या विभिन्न पहचान कुंजी प्रबंधन करने के लिए इस्तेमाल किया कक्षाओं के माध्यम से प्राप्त कर रहे हैं। मुख्य कारखाने के उपयोग के माध्यम से कुंजी विशिष्ट विनिर्देशों (अंतर्निहित कुंजी सामग्री के पारदर्शी प्रतिनिधित्व) से भी प्राप्त की जा सकती है।

KeyFactory कक्षा इस से आपकी सहायता कर सकती है।

+0

मैं यह कहना भूल गया कि मैं जावाकार्ड के साथ काम कर रहा हूं, जो समर्थन नहीं करता KeyFactory वर्ग। यह कुंजीबिल्डर का समर्थन करता है, लेकिन मैं वास्तव में यह नहीं समझ सकता कि मेरी कक्षा के लिए इस कक्षा का उपयोग कैसे किया जाए। – Vuk

3

एन्कोडेड बाइट सरणी को फेंक दें। जावाकार्ड पर AFAIR को सीधे डीकोड करने का कोई तरीका नहीं है - आपको अलग-अलग महत्वपूर्ण घटकों को अलग से सेट करना होगा। BTW

rsaPrivate = (RSAPrivateKey) javacard.security.KeyBuilder.buildKey 
    (javacard.security.KeyBuilder.TYPE_RSA_PRIVATE, 
    javacard.security.KeyBuilder.LENGTH_RSA_512, false); 

byte[] exponent = {(byte) 7}; 
byte[] modulus = {(byte) 33}; 
rsaPrivate.setExponent(exponent, (short) 0, (short) exponent.length); 
rsaPrivate.setModulus(modulus, (short) 0, (short) modulus.length); 

:

उदाहरण के लिए एक RSAPrivateKey प्रतिपादक और मापांक के साथ प्रारंभ करने की आवश्यकता है JavaCard प्रश्नों के लिए मैं Oracle मंचों में JavaCard Forum सलाह देते हैं। यदि आप RSAPrivateKey के लिए वहां खोज करते हैं तो आपको कुछ रोचक पोस्ट मिलेंगे।

+0

फिर एन्कोडेड होने का क्या मतलब है? उन्होंने एक असमर्थितऑपरेशन अपवाद को भी फेंक दिया हो सकता है। – Jus12

+0

getEncoded() केवल जे 2 एसई पर उपलब्ध है। यह पीकेसीएस # 8 एन्कोडेड फॉर्म में एक निजी कुंजी देता है जिसका उपयोग लगभग हर जगह किया जा सकता है। जावाकार्ड मंच उन अपवादों में से एक है। – Robert

+0

@ रॉबर्ट मैं देखता हूं। स्पष्टीकरण के लिए धन्यवाद। – Jus12

7

मैं भी इस उत्तर की तलाश में था और अंततः इसे पाया। कीबाइट्स मूल रूप से getEncoded() के साथ बनाई गई बाइट सरणी है।

//add BouncyCastle as a provider if you want 
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
//create a keyfactory - use whichever algorithm and provider 
KeyFactory kf = KeyFactory.getInstance("DSA", "BC"); 
//for private keys use PKCS8EncodedKeySpec; for public keys use X509EncodedKeySpec 
PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(keyBytes); 
PrivateKey pk = kf.generatePrivate(ks); 

मैं JavaCard के लिए कुछ भी कभी नहीं किया है, लेकिन इस post से, ऐसा लगता है KeyFactory वर्ग का उपयोग कर सकते लग रहा है। आपको शायद BouncyCastle लाइब्रेरी डाउनलोड करने की आवश्यकता होगी।

+1

धन्यवाद। अच्छा कार्य! आपने मुझे शोध के घंटे बचाए। इसे सही उत्तर के रूप में चुना जाना चाहिए, जब तक ओपी का प्लेटफार्म बाउंसी महल का समर्थन नहीं करता। – Jus12

+0

मुझे "यदि आप चाहते हैं" से आपका क्या मतलब नहीं मिला। क्या यह वैकल्पिक है? – Jus12

+0

@ Jus12 मेरा मतलब था कि यदि आप BouncyCastle का उपयोग करना चाहते हैं और यह आपके द्वारा उपयोग किए जा रहे प्लेटफ़ॉर्म पर प्रदाता के रूप में पहले से शामिल नहीं है। उदाहरण के लिए, एंड्रॉइड पर मैंने BouncyCastle लाइब्रेरी को जोड़ा और बीसी को प्रदाता के रूप में जोड़ने और एल्गोरिदम के बीसी के कार्यान्वयन का उपयोग करने के लिए उस लाइन का उपयोग करना पड़ा। खुशी है कि मैं किसी की मदद कर सकता हूँ! :) – marchica

0

या तो आपको पीकेसीएस # 8 एन्कोडेड ब्लॉब (एएसएन .1 बीईआर पार्सिंग) को डीकोड करना होगा और घटकों को सेट करना होगा, या आप जावा बिगइंटर के रूप में निजी कुंजी (कम से कम निजी एक्सपोनेंट और मॉड्यूलस) से घटक प्राप्त कर सकते हैं , उनको हस्ताक्षरित बाइट सरणी में परिवर्तित करें और उन्हें रॉबर्ट द्वारा समझाए गए अनुसार जावा कार्ड एपीआई में सेट करें। जावा कार्ड पर पीकेसीएस # 8 पार्सिंग किया जा सकता है लेकिन यह एक बहुत ही भयावह व्यायाम है।

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