2010-04-16 17 views
13

मेरे पास PKCS8 DER प्रारूप में फ़ाइल में संग्रहीत निजी कुंजी है और पासवर्ड द्वारा संरक्षित है। इसे पढ़ने का सबसे आसान तरीका क्या है?जावा के साथ पासवर्ड एन्क्रिप्टेड कुंजी कैसे पढ़ा जाए?

InputStream in = new FileInputStream(privateKeyFilename); 
byte[] privateKeydata = new byte[in.available()]; 
in.read(privateKeydata); 
in.close(); 
KeyFactory privateKeyFactory = KeyFactory.getInstance("RSA"); 
PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(privateKeydata); 
PrivateKey privateKey = privateKeyFactory.generatePrivate(encodedKeySpec); 

यह वही विनिर्देशन के साथ एन्क्रिप्ट नहीं किए गए चाबी के लिए ठीक काम करता है:

यहाँ कोड मैं एन्क्रिप्ट नहीं किए गए एक लोड करने के लिए इस्तेमाल करते हैं। वैसे, मैं BouncyCastle का उपयोग कर रहा हूँ।

मैं openssl आदेश

openssl pkcs8 -in ./privatekey.key -inform DER -passin pass:thisismypass 

कृपया, मदद निम्नलिखित का उपयोग कर इस निजी कुंजी देख सकते हैं !!!

मैंने इस विषय के अपने उत्तर में कुछ समाधान पोस्ट किए हैं। लेकिन अगर कोई अतिरिक्त लाइब्रेरी के बिना काम करने में मदद कर सकता है, तो बस बाउंसीकास्टल में सवाल उठाएगा।

उत्तर

7

मुझे समाधान मिला! हो सकता है कि इसकी इतनी सुंदर नहीं है, लेकिन ... यहाँ मैं पोस्ट करेंगे दो समाधान:

  1. Prefferable, लेकिन एक कार्य
  2. काम नहीं कर रहा, लेकिन अतिरिक्त पुस्तकालय

पहले की आवश्यकता है :

मुझे एक प्रकार का समाधान here मिला, लेकिन यह अपवाद फेंकता है। समाधान:

import java.io.*; 
import java.security.*; 
import java.security.interfaces.RSAPrivateCrtKey; 
import java.security.interfaces.RSAPublicKey; 
import java.security.spec.*; 

import javax.crypto.*; 
import javax.crypto.spec.*; 

/* 
* This class demonstrates how to import an encrypted RSA private key as 
* generated by openssl. The input file is presumed to be in DER 
* format. 
*/ 
public class ImportEncryptedPrivateKey 
{ 
    public static byte[] readPK8FromFile(String fileName) throws IOException 
    { 
     File f = new File(fileName); 
     DataInputStream dis = new DataInputStream(new FileInputStream(f)); 
     byte[] theData = new byte[(int) f.length()]; 
     dis.readFully(theData); 
     return theData; 
    } 

    public static void main(String[] args) throws IOException, 
      NoSuchAlgorithmException, NoSuchPaddingException, 
      InvalidKeySpecException, InvalidKeyException, 
      InvalidAlgorithmParameterException 
    { 
     byte[] encryptedPKInfo = readPK8FromFile("rsapriv.pk8"); 
     EncryptedPrivateKeyInfo ePKInfo = new EncryptedPrivateKeyInfo(
       encryptedPKInfo); 
     char[] password = { 'p', 'a', 's', 's', 'w', 'o', 'r', 'd' }; 
     Cipher cipher = Cipher.getInstance(ePKInfo.getAlgName()); 
     PBEKeySpec pbeKeySpec = new PBEKeySpec(password); 
     // Now create the Key from the PBEKeySpec 
     SecretKeyFactory skFac = SecretKeyFactory.getInstance(ePKInfo 
       .getAlgName()); 
     Key pbeKey = skFac.generateSecret(pbeKeySpec); 
     // Extract the iteration count and the salt 
     AlgorithmParameters algParams = ePKInfo.getAlgParameters(); 
     cipher.init(Cipher.DECRYPT_MODE, pbeKey, algParams); 
     // Decrypt the encryped private key into a PKCS8EncodedKeySpec 
     KeySpec pkcs8KeySpec = ePKInfo.getKeySpec(cipher); 
     // Now retrieve the RSA Public and private keys by using an 
     // RSA keyfactory. 
     KeyFactory rsaKeyFac = KeyFactory.getInstance("RSA"); 
     // First get the private key 
     RSAPrivateCrtKey rsaPriv = (RSAPrivateCrtKey) rsaKeyFac.generatePrivate(pkcs8KeySpec); 
     // Now derive the RSA public key from the private key 
     RSAPublicKeySpec rsaPubKeySpec = new RSAPublicKeySpec(rsaPriv.getModulus(), rsaPriv.getPublicExponent()); 
     RSAPublicKey rsaPubKey = (RSAPublicKey) rsaKeyFac.generatePublic(rsaPubKeySpec); 
    } 

} 

और मेरे अपवाद:

Exception in thread "main" java.security.NoSuchAlgorithmException: No such algorithm: 1.2.840.113549.1.5.13 

दूसरा:

और निम्नलिखित इस http://juliusdavies.ca/commons-ssl/pkcs8.html आप दूसरे के बारे में पढ़ सकते हैं, काम कर समाधान

+0

+1 अभी तक-कॉमन्स-एसएसएल के लिए +1। आपको तब बाउंसी कैसल की भी आवश्यकता नहीं है। दूसरे समाधान के लिए – Thilo

+1

। क्या आप यहां कोड पेस्ट कर सकते हैं? मैं उस लिंक को नहीं खोल सकता। आपने किस पुस्तकालय का उपयोग किया था? – BRabbit27

+0

यह वास्तव में मेरे लिए काम करता है। –

1

यह मेरा कोड और यह काम करता है :)

File f = new File(keyFile); 
FileInputStream fis = new FileInputStream(f); 
DataInputStream dis = new DataInputStream(fis); 
byte[] keyBytes = new byte[(int)f.length()]; 
dis.readFully(keyBytes); 
dis.close(); 
EncryptedPrivateKeyInfo encryptPKInfo = new EncryptedPrivateKeyInfo(keyBytes); 
Cipher cipher = Cipher.getInstance(encryptPKInfo.getAlgName()); 
PBEKeySpec pbeKeySpec = new PBEKeySpec(passwd.toCharArray()); 
SecretKeyFactory secFac = SecretKeyFactory.getInstance(encryptPKInfo.getAlgName()); 
Key pbeKey = secFac.generateSecret(pbeKeySpec); 
AlgorithmParameters algParams = encryptPKInfo.getAlgParameters(); 
cipher.init(Cipher.DECRYPT_MODE, pbeKey, algParams); 
KeySpec pkcs8KeySpec = encryptPKInfo.getKeySpec(cipher); 
KeyFactory kf = KeyFactory.getInstance("RSA"); 
return kf.generatePrivate(pkcs8KeySpec); 
+1

केवल जेडीके (नो बाउंसी कैसल) के साथ मुझे "1.2540.113549.1.5.13 का समर्थन करने वाला कोई प्रदाता नहीं मिल रहा है" (जो PBEWithMD5AndDES के लिए आईडी है)। – Thilo

+1

क्या आपने केवल जावा एपीआई के साथ निजी कुंजी को पढ़ा है? – BRabbit27