2012-03-07 62 views
27

Tôi muốn giải mã tệp bằng khóa PGP.Mã hóa PGP và giải mã với Java

Tôi đã tải xuống trình cài đặt và cài đặt khóa PGP. Sử dụng điều đó tôi đã tạo một tệp văn bản và mã hóa tệp văn bản bằng cách sử dụng khóa PGP.

Sau đó, tôi có tệp mở rộng .pgp được mã hóa. Bây giờ tôi muốn giải mã cùng một tệp bằng cách sử dụng mã Java bằng PGP.

Trong Java, Làm cách nào để giải mã tệp văn bản đã được mã hóa bằng khóa PGP?

Trả lời

1

Hãy thử xem JCA CryptoSpec. Tôi không chắc về PGP, nhưng tôi nghĩ bạn có thể tìm thấy một Nhà cung cấp cho mục đích của bạn.

Theo như tôi nhớ mã nên được một cái gì đó như:

// get cipher object for password-based encryption 
Cipher cipher1 = Cipher.getInstance("PBEWithMD5AndDES");//You have to pass here algorithm name which PGP uses. May be you have to find and init provider for it. 

// initialize cipher for decryption, using one of the 
// init() methods that takes an AlgorithmParameters 
// object, and pass it the algParams object from above 
cipher1.init(Cipher.DECRYPT_MODE, myKey, algParams); 


FileInputStream fis; 
FileOutputStream fos; 
CipherInputStream cis; 

fis = new FileInputStream("/tmp/a.txt"); 
cis = new CipherInputStream(fis, cipher1); 
fos = new FileOutputStream("/tmp/b.txt"); 
byte[] b = new byte[8]; 
int i = cis.read(b); 
while (i != -1) { 
    fos.write(b, 0, i); 
    i = cis.read(b); 
} 
fos.close(); 
5

Hãy thử làm xem chủ đề này. Tôi vừa xem qua nó, nhưng tôi nghĩ đó là những gì bạn cần. http://sloanseaman.com/wordpress/2012/05/13/revisited-pgp-encryptiondecryption-in-java/

+2

Giống như hầu hết các câu trả lời khác ở đây, liên quan đến blog của entry sử dụng [Bouncy Castle Java gói] (https://www.bouncycastle.org /java.html). Bản thân cơ sở mã Bouncy Castle bao gồm rất nhiều [ví dụ về PGP] (https://github.com/bcgit/bc-java/tree/master/pg/src/main/java/org/bouncycastle/openpgp/examples). Nếu bạn muốn xem các ví dụ này tách ra thành một dự án độc lập với phụ thuộc Bouncy Caste được Maven kéo vào, hãy xem [openpgp-bc-examples] (https://github.com/george-hawkins/openpgp-bc-examples) . –

3

BouncyCastle có hỗ trợ nhất định cho OpenPGP ("nhất định" vì chúng chỉ đề cập đến RFC 2440 chứ không phải RFC 4880 gần đây hơn). Ngoài ra, bạn có thể xem gói OpenPGPBlackbox của SecureBlackbox (phiên bản Java) của chúng tôi, cung cấp hỗ trợ đầy đủ cho OpenPGP bao gồm truy cập LDAP vào các phím và các chức năng nâng cao khác.

+2

BouncyCastle hiện hỗ trợ RFC4880 quá .. – Saumyaraj

5

Tôi đã viết một mã hoàn chỉnh bằng Java với BounceCastle API và OpenPGP. Trong mã nguồn này, bạn sẽ tìm thấy cách tạo cặp khóa, mã hóa và giải mã các tệp. Hãy xem: https://github.com/damico/OpenPgp-BounceCastle-Example

+0

dự án đó đã làm việc cho tôi sau khi xuất tệp khóa mà không có mặt nạ ascii và "cài đặt" lib JCE. – 4F2E4A2E

4

Bạn có thể viết một trình bao bọc đơn giản xung quanh GNU PGP về cơ bản thực hiện lệnh GPG từ Java.

Ưu điểm của việc sử dụng GNU PGP là bạn sẽ không bị ràng buộc vào một thư viện cụ thể. Số lượng tài liệu và hỗ trợ có sẵn trực tuyến cho thư viện của bên thứ ba không phong phú như các lược đồ mã hóa khác vì hầu hết đều gọi PGP từ dòng lệnh. Khóa PGP cũng sẽ vẫn ở một nơi phổ biến, tức là vòng khóa dành riêng cho người dùng thay vì được xuất trong nhiều tệp.

Lệnh GPG cho giải mã là

echo "password" | gpg --passphrase-fd 0 --output plaintext.txt --decrypt encrypted.gpg 

Bằng cách xác định cụm từ mật khẩu-fd là 0, bạn có thể cung cấp mật khẩu thông qua các dòng đầu vào tiêu chuẩn.

Sau đây là cách mã Java trông giống như -

public static void decryptFile(String privKeyPass) { 
    String[] cmd = new String[]; 
    int i = 7; 
    cmd[i++] = "gpg"; 
    cmd[i++] = "--passphrase-fd"; 
    cmd[i++] = "0"; 
    cmd[i++] = "--output"; 
    cmd[i++] = "plaintext.txt"; 
    cmd[i++] = "--decrypt"; 
    cmd[i++] = "encrypted.gpg"; 
    Process process = Runtime.getRuntime().exec(cmd); 

    BufferedWriterout = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); 
    out.write(privKeyPass); 
    try { 
     out.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    // Read process.getInputStream() 
    // Read process.getErrorStream() 
} 
Các vấn đề liên quan