2013-10-28 7 views
7

मेरी ऐप में मैं एक सार्वजनिक/निजी कुंजी जोड़ी उत्पन्न करता हूं और डिस्क पर बाद में उपयोग के लिए उन्हें संग्रहीत करता हूं। निजी कुंजी लोड हो रहा है और पुनः आरंभ करना ठीक काम करता है लेकिन निजी कुंजी के लिए मुझे अज्ञात कीस्पेक प्रकार मिलता है: java.security.spec.PKCS8EncodedKeySpec - और मुझे नहीं पता कि क्यों।फ़ाइल से सार्वजनिक कुंजी डेटा लोड करें

है कि मैं कैसे बना सकते हैं और कुंजियों (कोड थोड़ा आसान हो करने के लिए सरल पढ़ने के लिए) को बचाने:

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
kpg.initialize(4096); 
KeyPair keyPair = kpg.generateKeyPair(); 
privKey =keyPair.getPrivate(); 
pubKey =keyPair.getPublic();   

DataOutputStream out=new DataOutputStream(ctx.openFileOutput(PRIVKEY_FILE,Context.MODE_PRIVATE)); 
byte[] data=privKey.getEncoded(); 
out.write(data); 
out.close(); 

DataOutputStream out=new DataOutputStream(ctx.openFileOutput(PUBKEY_FILE,Context.MODE_PRIVATE)); 
byte[] data=pubKey.getEncoded(); 
out.write(data); 
out.close(); 

निजी कुंजी का अगला लोड हो रहा है ठीक काम करता है:

DataInputStream in=new DataInputStream(ctx.openFileInput(PRIVKEY_FILE)); 
byte[] data=new byte[in.available()]; 
in.readFully(data); 

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(data); 
KeyFactory kf = KeyFactory.getInstance("RSA"); 
privKey = kf.generatePrivate(keySpec); 

decryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
decryptCipher.init(Cipher.DECRYPT_MODE, privKey); 

इसी कोड के लिए सार्वजनिक कुंजी बुरी तरह विफल हो जाती है:

DataInputStream in=new DataInputStream(ctx.openFileInput(PUBKEY_FILE)); 
byte[] data=new byte[in.available()]; 
in.readFully(data); 

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(data); 
KeyFactory kf = KeyFactory.getInstance("RSA"); 
pubKey = kf.generatePublic(keySpec); --> here the exception is thrown 

encryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
encryptCipher.init(Cipher.ENCRYPT_MODE, pubKey);    

तो मैं क्या गलत कर रहा हूं? डिस्क से सार्वजनिक कुंजी डेटा लोड करने का सही तरीका क्या है?

धन्यवाद!

उत्तर

14

सार्वजनिक और निजी कुंजी अलग-अलग एन्कोड किए गए हैं। जबकि निजी कुंजी पीकेसीएस # 8 में एन्कोड की जाती है, सार्वजनिक कुंजी नहीं होती है। एएसएन.1 विनिर्देशों के अनुसार उन्हें एक्स.50 9 में एन्कोड किया गया है। विधि Key.getFormat() से

विवरण:

इस कुंजी का प्राथमिक एन्कोडिंग प्रारूप, या नल अगर इस कुंजी एन्कोडिंग का समर्थन नहीं करता का नाम देता है। प्राथमिक एन्कोडिंग प्रारूप को उपयुक्त ASN.1 डेटा प्रारूप के संदर्भ में नामित किया गया है, यदि इस कुंजी के लिए ASN.1 विनिर्देश मौजूद है। उदाहरण के लिए, सार्वजनिक कुंजी के लिए ASN.1 डेटा प्रारूप का नाम SubjectPublicKeyInfo है, जैसा कि X.50 9 मानक द्वारा परिभाषित किया गया है; इस मामले में, लौटा प्रारूप "एक्स.50 9" है। इसी तरह, निजी कुंजी के लिए ASN.1 डेटा प्रारूप का नाम निजी KeyInfo है, जैसा कि पीकेसीएस # 8 मानक द्वारा परिभाषित किया गया है; इस मामले में, लौटा प्रारूप "पीकेसीएस # 8" है।

इसके अनुसार, सार्वजनिक कुंजी को पीकेसीएस # 8 के रूप में पढ़ने के बजाय, आपको इसे X.509 के रूप में पढ़ना चाहिए।

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(data); 

लिए:

X509EncodedKeySpec keySpec = new X509EncodedKeySpec(data); 

से अपने सार्वजनिक कुंजी पढ़ने कोड को बदलने पर विचार

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