Jump to content
Apaxe

Encriptar o conteúdo de um ficheiro

Recommended Posts

Apaxe

Olá a todos!

Este é o meu primeiro Post e a minha experiencia em Java ainda não é muita.

Pedia que me ajudassem a encriptar o conteúdo de um ficheiro, ou seja, eu tenho um método que grava uma String no ficheiro e tenho outro método que lê o mesmo conteúdo.

O problema é que se alguém aceder ao ficheiro consegue visualizar o conteúdo do mesmo.

Desde de já um obrigado.

Share this post


Link to post
Share on other sites
Ernest

Bom dia,

Existem vários algoritmos para criptografia em Java :

- Criptografar e descriptografar usando o algoritmo DES

- Criptografia de chave simétrica com o algoritmo Blowfish

- Criptografia de chave assimétrica com o RSA

- Assinatura digital usando DSA

- Impressão digital de um ficheiro( Br. arquivo) (SHA ou MD5)

- Criptografar um ficheiro( Br. arquivo) usando uma senha : PBE (Password Based Encryption)

O Bouncy Castle Crypto APIs é muito completo para ser usado numa aplicação Java : http://www.bouncycastle.org/java.html

Algoritmo de criptografia Blowfish é o mais amplamente utilizado em programas Java.

Este é, provavelmente, devido principalmente ao faCto de que ele é rápido, confiável e acima de tudo, é livre para usar (sem patente).

Então vamos implementá-lo.


package testCryptageFichier;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.Key;
import java.util.Scanner;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;


/**
*
* @author Ernest Duarte
*
*/
public class SecurityFile
{

   private String algo = "Blowfish";

   public void encriptar(String password, String ficheiroEntrada, String ficheiroSaida)
   {
       try {
           byte[] passwordInBytes = password.getBytes("ISO-8859-1");
           Key chave = new SecretKeySpec(passwordInBytes, algo);
           Cipher cipher = Cipher.getInstance(algo);
           cipher.init(Cipher.ENCRYPT_MODE, chave);

           byte[] textoClaro = abrirFichiero(ficheiroEntrada);
           byte[] textoCryptado = cipher.doFinal(textoClaro);
           salvarFichiero(ficheiroSaida, textoCryptado);
       }
       catch (Exception e) {
           System.out.println("Erro quando tentava encriptar os dados do fichiero de entrada");
       }
   }

   public void desencriptar(String password, String ficheiroEntrada, String ficheiroSaida)
   {
       try {
           byte[] passwordInBytes = password.getBytes("ISO-8859-1");
           Key clef = new SecretKeySpec(passwordInBytes, algo);
           Cipher cipher = Cipher.getInstance(algo);
           cipher.init(Cipher.DECRYPT_MODE, clef);

           byte[] textoCryptado = abrirFichiero(ficheiroEntrada);
           byte[] textoClaro = cipher.doFinal(textoCryptado);
           salvarFichiero(ficheiroSaida, textoClaro);
       }
       catch (Exception e) {
           System.out.println("Erro quando tentava desencriptar os dados do ficheiro de entrada");
       }
   }

   private byte[] abrirFichiero(String filename)
   {
       try {
           File ficheiro = new File(filename);
           byte[] resultado = new byte[(int) ficheiro.length()];
           FileInputStream in = new FileInputStream(filename);
           in.read(resultado);
           in.close();
           return resultado;
       }
       catch (Exception e) {
           System.out.println("Problema quando estava para ler o ficheiro : " + e.getMessage());
           return null;
       }
   }

   private void salvarFichiero(String filename, byte[] data)
   {
       try {
           FileOutputStream out = new FileOutputStream(filename);
           out.write(data);
           out.close();
       }
       catch (Exception e) {
           System.out.println("Problema quando de estava para salvar o fichiero : " + e.getMessage());
       }
   }


   public void menuCryptagem(Scanner sc)
   {
       System.out.println("password : ");
       String password = sc.next();

       System.out.println("Nome do ficheiro de entrada para ser criptado : ");
       String entrada = sc.next();

       System.out.println("Nome do ficheiro de saida : ");
       String saida = sc.next();

       encriptar(password, entrada, saida);

   }

   public void menuDeCryptagem(Scanner sc)
   {
       System.out.println("password : ");
       String password = sc.next();

       System.out.println("Nome do ficheiro de entrada para ser desencriptado: ");
       String entrada = sc.next();

       System.out.println("Nome do ficheiro de saida : ");
       String saida = sc.next();

       desencriptar(password, entrada, saida);
   }


   public void aficharMenu()
   {
       System.out.println("1- Cryptar");
       System.out.println("2- Decryptar");
       System.out.println("3- Exit");
   }

   public void escolhaMenu()
   {
       Scanner sc = new Scanner(System.in);

       while (true) {

           aficharMenu();

           int escolha = sc.nextInt();

           switch(escolha)
           {
               case 1: { menuCryptagem(sc); } break;

               case 2: { menuDeCryptagem(sc); } break;

               case 3: { sc.close(); System.exit(0); } break;

               default: { System.out.println("A sua escolha não é valida "); }
           }

       }
   }


   public static void main(String[] args)
   {
       new SecurityFile().escolhaMenu();
   }

}

Primeiro deve criar um ficheiro ficheiro_claro1.txt com um texto em claro !!

Exemplo de utilização na CONSOLE ECLIPSE

1- Cryptar

2- Decryptar

3- Exit

1

password :

password

Nome do ficheiro de entrada para ser criptado :

ficheiro_claro1.txt

Nome do ficheiro de saida :

ficheiro_encryptado.txt

1- Cryptar

2- Decryptar

3- Exit

2

password :

password

Nome do ficheiro de entrada para ser desencriptado:

ficheiro_encryptado.txt

Nome do ficheiro de saida :

ficheiro_claro22.txt

1- Cryptar

2- Decryptar

3- Exit

Edited by Rui Carlos

Share this post


Link to post
Share on other sites
Apaxe

Viva Ernest Duarte,

Por incrível que pareça, fiquei este tempo todo à espera de receber as potenciais notificações de respostas a este post que nunca chegaram. Vou ter de verificar o sistema de notificações do meu perfil.

Por isto, só agora vi a tua resposta, à qual aproveito para agradecer.

Obrigado.

Edited by ApaxePTt

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.