2017-10-05 199 views
0

我有一個使用GPG加密的文件,我想從中提取會話密鑰,以便我可以分別解密會話密鑰。我使用的充氣城堡使用下面的代碼提取會話密鑰:解密OpenPGP會話密鑰

openssl rsautl -decrypt -in session_key_enc.bin -out session_key_dec.bin -inkey private.pem -raw 

我期望的原始輸出到現在:

private static void outputSessionKey(String path) throws FileNotFoundException, IOException { 
    BCPGInputStream input = new BCPGInputStream(PGPUtil.getDecoderStream(new FileInputStream(path))); 
    Packet packet; 
    while((packet = input.readPacket()) != null) { 
     if (packet instanceof PublicKeyEncSessionPacket) { 
      PublicKeyEncSessionPacket encPacket = (PublicKeyEncSessionPacket) packet; 
      byte[] encKey = encPacket.getEncSessionKey()[0]; 
      FileOutputStream output = new FileOutputStream("session_key_enc.bin"); 
      output.write(encKey); 
      output.close(); 
     } 
    } 

    input.close(); 
} 

我然後使用以下命令的OpenSSL解密會話密鑰是解密的會話密鑰,但我無法使用它來使用--override-session-key解密原始文件。

有沒有人有這個設置會出現什麼問題的想法?

回答

0

我看到兩件事(至少)應該出問題了。 (0)你很明顯地假定使用的密鑰(和算法)是RSA,它不是PGP和GPG使用的唯一加密算法。

(1)的PublicKeyEncSessionPacket.getEncSessionKey()元素(s)爲(是)的MPInteger.getEncoded()即從rfc4880 sec 3.2的MPI的編碼,這是兩個八位字節的位長度後跟實際值八位位組的結果。寫入該值時,對於RSA解密應該太大,並且rsautl -decrypt應該給出錯誤,至少假設您使用的是正確的密鑰。 (2)PGP的RSA加密使用PKCS1-v1_5(類型02)填充。糾正後(1)您需要使用默認的-pkcs而不是-raw

隨着這些變化,它適用於我。請注意,按照sec 5.1,RSA加密密鑰塊'm'由1個八位字節對稱算法,實際密鑰和2個八位字節校驗和組成;前兩個用冒號分隔,第三個不包含在GPG的會話密鑰中。

+0

嘿Dave,謝謝你的回答。爲了解決您的觀點:0我不假定GPG使用RSA,因爲這是我設置的默認值。 1.在我的文章中我沒有提到這一點,但是我取走了前兩個字節以隔離加密密鑰的字節。我會嘗試你的建議,看看它是否有效。我能夠從原始字節中提取解密的密鑰,但似乎有小的差異 –