2012-03-07 70 views
27

Quiero descifrar un archivo utilizando las claves PGP.Encriptación y descifrado PGP con Java

He descargado el instalador de llaves PGP e instalado. Usando eso, creé un archivo de texto y cifré el archivo de texto usando las claves PGP.

Luego recibí un archivo de extensión .pgp que está encriptado. Ahora quiero descifrar el mismo archivo usando código Java usando PGP.

En Java, ¿cómo puedo descifrar un archivo de texto que ya está encriptado usando las claves PGP?

Respuesta

1

Intente echarle un vistazo a JCA CryptoSpec. No estoy seguro acerca de PGP, pero creo que puede encontrar un Proveedor para su propósito.

Por lo que yo recuerdo código debe ser algo como:

// 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

prueba no ver este tema. Acabo de echarle un vistazo breve, pero creo que es lo que necesitas. http://sloanseaman.com/wordpress/2012/05/13/revisited-pgp-encryptiondecryption-in-java/

+2

Como la mayoría de las otras respuestas aquí, ligado a la entrada de blog utiliza los paquetes [Castillo hinchable Java] (https://www.bouncycastle.org /java.html). La base de código de Bouncy Castle en sí incluye una gran cantidad de [ejemplos de PGP] (https://github.com/bcgit/bc-java/tree/master/pg/src/main/java/org/bouncycastle/openpgp/examples). Si desea ver estos ejemplos separados en un proyecto independiente con las dependencias de Bouncy Caste activadas por Maven, consulte [openpgp-bc-examples] (https://github.com/george-hawkins/openpgp-bc-examples) . –

3

BouncyCastle tiene cierto apoyo para OpenPGP ("seguro", ya que sólo se mencionan RFC 2440 y RFC 4880 no que es más reciente). También puede echar un vistazo al paquete OpenPGPBlackbox de nuestra SecureBlackbox (edición Java), que proporciona soporte completo para OpenPGP, incluido el acceso LDAP a las teclas y otras funciones avanzadas.

+2

BouncyCastle ahora es compatible con RFC4880 también ... – Saumyaraj

5

He escrito un código completo en Java con BounceCastle API y OpenPGP. En este código fuente, encontrará cómo generar el par de claves, cifrar y descifrar archivos. Eche un vistazo a: https://github.com/damico/OpenPgp-BounceCastle-Example

+0

ese proyecto funcionó para mí después de exportar el archivo de clave sin máscara ascii e "instalar" la lib de JCE. – 4F2E4A2E

4

Puede escribir un envoltorio simple alrededor de GNU PGP que básicamente ejecuta el comando GPG de Java.

La ventaja de utilizar GNU PGP es que no se lo vinculará a una biblioteca específica. La cantidad de documentación y soporte disponible en línea para bibliotecas de terceros no es tan abundante como otros esquemas de cifrado, ya que la mayoría de ellos invocan a PGP desde la línea de comandos. Las claves PGP también se mantendrán en un lugar común, es decir, el llavero específico del usuario en lugar de exportarse en múltiples archivos.

El comando GPG para el descifrado es

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

Al especificar la frase de contraseña-fd como 0 puede proporcionar la contraseña a través del flujo de entrada estándar.

Aquí es cómo se ve el código Java como -

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() 
} 
Cuestiones relacionadas