2013-08-30 64 views
2

我有.p12文件,我使用openssl解壓私鑰,我有一個提取密碼。從pkcs12提取私鑰並進行文本加密

openssl pkcs12 -in my.p12 -nocerts -out privateKey.pem 

後,我讓我的私鑰,我試圖使用加密該密鑰:

public static void main(String[] args) throws Exception { 
     Security.addProvider(new BouncyCastleProvider()); 
     KeyPair keyPair = readKeyPair(privateKey, "testpassword".toCharArray()); 
     Cipher cipher = Cipher.getInstance("RSA"); 
     cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic()); 
     byte[] textEncrypted = cipher.doFinal("hello world".getBytes()); 
     System.out.println("encrypted: "+new String(textEncrypted)); 
     cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate()); 
     byte[] textDecrypted = cipher.doFinal(textEncrypted); 
     System.out.println("decrypted: "+new String(textDecrypted)); 
    } 

    private static KeyPair readKeyPair(File privateKey, char[] keyPassword) throws IOException { 
     FileReader fileReader = new FileReader(privateKey); 
     PEMReader r = new PEMReader(fileReader, new DefaultPasswordFinder(keyPassword)); 
     try { 
      return (KeyPair) r.readObject(); // this returns null 
     } catch (IOException ex) { 
      throw new IOException("The private key could not be decrypted", ex); 
     } finally { 
      r.close(); 
      fileReader.close(); 
     } 
    } 

r.readObject();返回null。但是,當我通過此命令自己創建私鑰時:

openssl genrsa -out privkey.pem 2048 

上述代碼正常工作。

  • 如何正確提取p12文件的私鑰?
  • 或者是否有任何方法使用p12文件加密/解密文本 而不通過命令行解壓?

我知道這只是PKCS#12只是存儲密鑰的古董文件。

回答

2

我不知道你的代碼有什麼問題,但我有代碼從密鑰存儲區讀取內容。我將文件讀入KeyStore實例,然後根據需要訪問密鑰或條目。下面是一些相關的呼叫:

char[] password; 
String alias; 
java.security.KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC"); 
keyStore.load(inputStream, password); 
java.security.PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, password); 
java.security.keystore.PrivateKeyEntry privateKeyEntry = (PrivateKeyEntry) keyStore.getEntry(alias, new KeyStore.PasswordProtection(password)); 

要找到你感興趣,我建議使用密鑰工具條目的別名(自帶JDK):

keytool -list -v -keystore keystore.pkcs12 -storetype pkcs12 

你會被提示keystore密碼,然後得到這樣的信息:

Keystore type: PKCS12 
Keystore provider: SunJSSE 

Your keystore contains 1 entry 

Alias name: thealias 
Creation date: Aug 30, 2013 
Entry type: PrivateKeyEntry 
Certificate chain length: 2 
[... lots of info about the certificates deleted ...] 
+0

嗨羅布謝謝你的回答。我之前嘗試過這種方式。我的密鑰庫沒有任何別名。有什麼辦法可以找出辦法。我有一個與p12文件一起的證書。 – user2662294

+0

添加了一些關於列出密鑰庫內容的細節,因此也許您可以找到您感興趣的項目上的別名。 – Rob

+0

它向我顯示了這個:'Keystore type:PKCS12 Keystore provider:SunJSSE Your keystore包含0條目,順便說一句,我有* .cer,文件以及我的.p12文件。有什麼關係嗎?謝謝! – user2662294