2013-08-21 6 views
6

मैं जावा में एक स्ट्रिंग (.pem फ़ाइल) से निजी कुंजी जेनरेट करना चाहता हूं।जावा में * पेम स्ट्रिंग से आरएसए निजी कुंजी कैसे उत्पन्न करें

private static final String test = "-----BEGIN RSA PRIVATE KEY-----\n" + 
     "MIIEpAIBAAKCAQEAvcCH8WsT1xyrZqq684VPJzOF3hN5DNbowZ96Ie//PN0BtRW2\n" + 
// and so on 
     "-----END RSA PRIVATE KEY-----"; 

try { 
    String privKeyPEM = test.replace("-----BEGIN RSA PRIVATE KEY-----\n", ""); 
    privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", ""); 

    byte [] encoded = Base64.decode(privKeyPEM); 

    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded); 
    KeyFactory kf = KeyFactory.getInstance("RSA"); 
    PrivateKey privKey = kf.generatePrivate(keySpec); 
} 
catch (Exception e) { 
    e.printStackTrace(); 
} 

आखिरी पंक्ति (generatePrivate समारोह) इस अपवाद फेंक है:

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence 
    at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source) 
    at java.security.KeyFactory.generatePrivate(Unknown Source) 
    at Test.main(Test.java:52) 
Caused by: java.security.InvalidKeyException: IOException : algid parse error, not a sequence 
    at sun.security.pkcs.PKCS8Key.decode(Unknown Source) 
    at sun.security.pkcs.PKCS8Key.decode(Unknown Source) 
    at sun.security.rsa.RSAPrivateCrtKeyImpl.<init>(Unknown Source) 
    at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(Unknown Source) 
    at sun.security.rsa.RSAKeyFactory.generatePrivate(Unknown Source) 
    ... 3 more 

अगर मैं एक .der फ़ाइल यह ठीक से काम से मूल्य के लिए निजी कुंजी बदलने के लिए, लेकिन मैं निजी उत्पन्न करने के लिए की जरूरत है .pem फ़ाइल से मुख्य फ़ाइल।

मैंने स्ट्रिंग के रूप में मुद्रित बाइट्स का एक स्क्रीनशॉट संलग्न किया है (एक बार हार्ड-कोडेड \ n और एक बार हार्ड-कोड किए बिना \ n) और एक बार फ़ाइल से।

Bigger Image

Output

अजीब बात यह है कि फ़ाइल से उत्पादन तार से उत्पादन के लिए अलग है।

यदि मैं बेस 64 के साथ .der फ़ाइल को एन्कोड करने का प्रयास करता हूं, तो परिणाम .pem फ़ाइल में स्ट्रिंग से भिन्न होता है। ऐसा क्यों हैं?

+0

क्या आपको कोई जवाब मिला? –

+0

@ शंकरप वास्तव में नहीं। – Niklas

+0

ठीक है। मुझे समाधान मिला है। "----- BEGIN आरएसए निजी कुंजी" से शुरू होने वाली कुंजी pkcs1 एन्कोडेड फ़ाइलें हैं। यह pkcs1 एन्कोडिंग जावा द्वारा समर्थित नहीं है जब तक कि आप बाहरी पुस्तकालय जैसे BouncyCastle। मैं कल एक ही मुद्दे में भाग गया और लगभग 8 घंटे बाद, समाधान मिला। यदि आप निजी कुंजी को pkcs8 के साथ एन्कोड करते हैं तो यह "--- BEGIN निजी कुंजी ---" जैसा शुरू होगा, जिसे स्टॉक जावा द्वारा संभाला जाएगा। HTH। –

उत्तर

1

आप कहते हैं कि अंतिम पंक्ति keyspecs पर अपवाद फेंक रहा है, यानी

PrivateKey privKey = kf.generatePrivate(keySpec);

से ऊपर सीमा के कार्य सही स्थापित किया जा रहा, यानी

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);

तो वास्तविक समस्या एन्कोडेड बाइट्स के साथ है सरणी। क्या आपने byte [] encoded = Base64.decode(privKeyPEM); के बाद System.out किया है और देखें कि आउटपुट क्या है।

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

अंतिम स्ट्रिंग परीक्षण में आपके द्वारा उपयोग किए जाने वाले मूल पाठ में कुछ '\ n' है। आप नीचे दिए गए पंक्ति में अन्य पाठ से छुटकारा पाने की थी,

String privKeyPEM = test.replace("-----BEGIN RSA PRIVATE KEY-----\n", ""); 
    privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", ""); 

लेकिन, स्ट्रिंग को देखो,

"MIIEpAIBAAKCAQEAvcCH8WsT1xyrZqq684VPJzOF3hN5DNbowZ96Ie//PN0BtRW2\n" + 
// and so on 
     "-----END RSA PRIVATE KEY-----"; 

यह कुछ और हो सकता है '\ n' छोड़ दिया जो कुछ अवांछित पात्रों जब में हो सकता है आप keypec उत्पन्न करते हैं। अधिक System.out आज़माएं और देखें कि एन्कोडेड बाइट सरणी कैसा है और उस चेक से पहले भी स्ट्रिंग privKeyPEM और देखें कि इसमें कोई अतिरिक्त वर्ण नहीं छोड़ा गया है या नहीं।

आशा है कि यह हेप्लस।

+1

मैंने 'एन्कोडेड 'का आउटपुट अपलोड किया। http://pastebin.com/YUsNdhgW। मैंने बिना \ n' के परीक्षण को शुद्ध स्ट्रिंग में बदल दिया और यह भी काम नहीं किया। – Niklas

+0

मैंने स्ट्रिंग के रूप में आउटपुट के साथ एक स्क्रीनशॉट भी अपलोड किया। – Niklas

+0

बेस 64 डिकोडिंग लाइनब्रेक्स और आमतौर पर सभी सफेद जगहों को अनदेखा करता है। –

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