Criptografia Arquivo de Retorno Bradesco

Boa tarde pessoal,

  estou desenvolvendo uma aplicação para conciliação bancária para clientes do banco do Bradesco e me deparei com o seguinte problema, os arquivos de retorno do sistema do Bradesco vem todos criptografados. Alguém já trabalhou com a remoção de criptografia dos arquivos de retorno do bradesco? Agradeço a ajuda.

Estou com problema no seguinte código:

import br.com.bradesco.webta.security.crypto.WEBTACryptoUtil;  
import br.com.bradesco.webta.security.crypto.WEBTAInputStream;  
import br.com.bradesco.webta.security.exception.CryptoException;  
import br.com.bradesco.webta.security.exception.ParameterException;  
import java.io.File;  
import java.io.FileWriter;  
import java.io.IOException;  
import java.util.logging.Level;  
import java.util.logging.Logger;  
  
public class Descriptografia {  
    private WEBTAInputStream leitor;  
    private byte[] bufDecripto= null;;  
    private FileWriter arquivo;  
      
    public void descriptografar() {     
        File arquivo_chave=new File("criptografia201312101113.bin");  
        try{  
            //chave que será utilizada como parâmetro nos métodos de Criptografia e Descriptografia  
            byte[] chave= WEBTACryptoUtil.decodeKeyFile(arquivo_chave, "XXXXXX");  
              
            //Cria objeto para ler o arquivo criptografado recebe(nome do arquivo, pasta do arquivo e chave de criptografia)  
            leitor = new WEBTAInputStream("500_CB041200.RET", "NetBeansProjects/CriptografiaBradesco", chave);  
            if(leitor == null){  
                System.out.println("Erro");  
            }  
              
            while(leitor.read(bufDecripto)>0){  
                arquivo = new FileWriter(new File("Arquivo.txt"));    
                arquivo.write(bufDecripto.toString());    
                arquivo.close();  
            }  
              
        } catch (ParameterException ex) {  
            Logger.getLogger(Descriptografia.class.getName()).log(Level.SEVERE, null, ex);  
        } catch (IOException ex) {  
            Logger.getLogger(Descriptografia.class.getName()).log(Level.SEVERE, null, ex);  
        } catch (CryptoException ex) {  
            Logger.getLogger(Descriptografia.class.getName()).log(Level.SEVERE, null, ex);  
        }      
    }  
}

O erro que aparece é esse:

Exception in thread “main” java.lang.NullPointerException
at br.com.bradesco.webta.security.crypto.WEBTAInputStream.read(WEBTAInputStream.java:427)
at teste.Descriptografia.main(Descriptografia.java:38
Java Result: 1

Na linha: " while(leitor.read(bufDecripto)>0){"

E estou seguindo o manual que está em anexo.

Se alguém puder me ajudar, agradeço muito.

seu byteArray bufDecripto esta nulo… inicializa ele e tenta denovo.

Já tentei isso, mas quando inicializo com bufDecripto= new byte[2058]; , recebo o seguinte erro:
Fev 27, 2014 9:04:27 AM teste.Descriptografia main
Grave: null
java.io.IOException: Encrypted file has invalid format. LL field is invalid.
at br.com.bradesco.webta.security.crypto.WEBTAInputStream.readNextBlockOfFile(WEBTAInputStream.java:309 )
at br.com.bradesco.webta.security.crypto.WEBTAInputStream.read(WEBTAInputStream.java:388 )
at br.com.bradesco.webta.security.crypto.WEBTAInputStream.read(WEBTAInputStream.java:427 )
at teste.Descriptografia.main(Descriptografia.java:40 )

No manual ele não inicializa a variável.

Se você trabalhasse na minha equipe eu estampava meu pé na sua bunda, como você coloca código de cliente em um fórum?, tira isso daí!

Não tem nenhum código cliente, esse é código que o próprio Bradesco disponibiliza para o desenvolvedor que deseja realizar integração com o sistema deles. Essas funções estão no manual que eles disponibilizam, porém não consigo fazer funcionar. A única informação do cliente que teria nesse código é a senha que eu mudei por XXXXXX.

bom… nesse caso eu tentaria abrir o criptografia201312101113.bin e procuraria o que é esse LL Field que esta dizendo no erro…

Veja o código que fiz amigo, o único problema que estou tendo é quanto a gravação dos bytes em arquivo pois aparece algum lixo no meio do arquivo e ainda nao achei a solução.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package criptografiabradesco;

import br.com.bradesco.webta.security.crypto.WEBTACryptoUtil;
import br.com.bradesco.webta.security.crypto.WEBTAInputStream;
import br.com.bradesco.webta.security.exception.CryptoException;
import br.com.bradesco.webta.security.exception.ParameterException;
import java.awt.FileDialog;
import java.awt.Frame;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileWriter;
/**
 *
 * @author glauber
 */
public class CriptografiaBradesco {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        
        FileDialog abrearquivo,fechaArquivo;
        //Informa o arquivo onde será gravado o resultado
        fechaArquivo = new FileDialog(new Frame(),"Salvar Arquivo",FileDialog.SAVE);
        abrearquivo = new FileDialog(new Frame(),"Abrir Arquivo para Descriptografia",FileDialog.LOAD);
        abrearquivo.setVisible(true);

        //Para Gravar o arquivo
         fechaArquivo.setVisible(true);
         WEBTAInputStream wis = null;
         
         byte[] bufDecripto = new byte[8192];
         int bytesLidos = 0;
    try{
    //Obtem chave de criptografia
    byte[] chaveCripto = WEBTACryptoUtil.decodeKeyFile(new
    File("chave.bin"), "12345647789");
        
    //Cria objeto para ler o arquivo criptografado
    wis = new WEBTAInputStream(abrearquivo.getFile(), "D:/", chaveCripto);
    
     //é lido, descriptografado, descomprimido e armazenado em bufDecripto.
    //Este loop e´executado enquanto houver dados para leitura
    
          try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fechaArquivo.getFile()))) 
          {  
    
                   while((wis.read(bufDecripto))>0) 
                 {
                  //Gravação dos dados do buffer no arquivo
                  bos.write(bufDecripto); //Gravamos os bytes lá 
                  bos.flush();
                 }
              bos.close();
                
            }
   
} catch (ParameterException | IOException | CryptoException e){
    //Efetua tratamento da excecao
    System.out.println (e.getMessage());
} finally {
    if (wis != null) {
    try {
        wis.close();
    } catch (IOException e){
    //Efetua tratamento da excecao
    System.out.println (e.getMessage());
    }
    }
}
    }
}

tenta tirar o bos.flush(); de dentro do bloco while e coloca antes do bos.close() e veja o que acontece.

Ja fiz isso e nao surtiu efeito, nao tinha o bos.flush () e ja tinha esse problema

Substitua a parte:

[quote]while(wis.read(bufDecripto) > 0) {
//…
//A aplicação processa os dados
//do arquivo de retorno
//…
}[/quote]
por:

[quote]ByteArrayOutputStream baos = new ByteArrayOutputStream();
int readBytes = 0;
byte[] aux = new byte[512];
while((readBytes = wis.read(aux, 0, aux.length)) > 0) {
baos.write(aux, 0, readBytes);
}

		System.out.println(baos.toString());[/quote]

[quote=mrglauber]Veja o código que fiz amigo, o único problema que estou tendo é quanto a gravação dos bytes em arquivo pois aparece algum lixo no meio do arquivo e ainda nao achei a solução.
[/quote]

Já verificou se o lixo que aparece é algo que deveria ter sido decriptografado ou não. Outras partes do arquivo estão ok?

PS: só agora que vi, este tópico já deve ter sido resolvido…

Bom dia, eu estou precisando criptografar e descriptografar arquivos de remessa e de retorno para usar o WEBTa do bradesco.

So que nao programo nada em JAVA.

Preciso que funcione em LINUX, eu passo o caminho do arquivo a ser criptografado a senha do arquivo .bin e me criptografa o arquivo.

Eu pago pelo serviço…

Contato: magnusadilsom@gmail.com

Precisei desse código e deixo aqui a solução que fiz baseada nos códigos acima para desencriptar o arquivo.

import br.com.bradesco.webta.security.crypto.WEBTACryptoUtil;
import br.com.bradesco.webta.security.crypto.WEBTAInputStream;
import br.com.bradesco.webta.security.exception.CryptoException;
import br.com.bradesco.webta.security.exception.ParameterException;

import java.io.File;
import java.io.FileWriter;
import java.io.FileOutputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;

public class Decode {
    public static void processa(String retorno, String dir_entrada, String dir_saida, String cripto, String chave)
    {
        WEBTAInputStream wis = null;
        int value = 0;
        byte[] bufDecripto = new byte[8196];

        try {
            byte[] chaveCripto = WEBTACryptoUtil.decodeKeyFile(new File(cripto), chave);
            wis = new WEBTAInputStream(retorno, dir_entrada, chaveCripto);

            try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dir_saida + "/" + retorno))){  
                while((value = wis.read(bufDecripto)) > 0) 
                {
                    bos.write(bufDecripto, 0, value);
                    bos.flush();
                }
                bos.close();
            } catch (IOException e){
                System.out.println (e.getMessage());
            } finally {
                if (wis != null) {
                    try {
                        wis.close();
                    } catch (IOException e){
                        System.out.println (e.getMessage());
                    }
                }
            }
        } catch (ParameterException | IOException | CryptoException e){
            System.out.println (e.getMessage());
        } finally {
            if (wis != null) {
                try {
                    wis.close();
                } catch (IOException e){
                    System.out.println (e.getMessage());
                }
            }
        }
    }

    public static boolean isDir(String path) {
        File test = new File(path);
        if (!test.exists())
            return false;
        else
            return test.isDirectory();
    }

    public static boolean isFile(String path) {
        File test = new File(path);

        if (!test.exists())
            return false;
        else
            return test.isFile();
    }

    public static boolean existe(String path) {
        File test = new File(path);
        return test.exists();
    }

    public static void help(String msg)
    {
        System.out.println("Parametros incorretos.");
        System.out.println();

        if (msg != null) System.out.println("Erro: " + msg);

        System.out.println();
        System.out.println("Use: java -jar decode.jar PASTA_ENTRADA_RETORNO PASTA_SAIDA_RETORNO ARQUIVO_DE_CRIPTOGRAFIA SENHA.");
        System.out.println("Exemplo: java -jar decode.jar /webta/retornos/entradas /webta/retornos/saidas /webta/cripto.bin 12345678.");
        System.exit(1);
    }

    public static void main(String[] args) throws IOException
    {
        if(args.length < 4)    help(null);

        if (!isDir(args[0])) help("'" + args[0] + "' nao existe");
        if (!isDir(args[1])) help("'" + args[1] + "' nao existe");
        if (!existe(args[2])) help("'" + args[2] + "' nao existe");

        File folder = new File(args[0]);
        File[] listOfFiles = folder.listFiles();

        if (listOfFiles == null || listOfFiles.length <= 0) {
            System.out.println("Nenhum arquivo encontrado no caminho: " + args[0]);
            System.exit(2);
        }

        for (int i = 0; i < listOfFiles.length; i++) {
            if (listOfFiles[i].getName().toUpperCase().lastIndexOf(".RET") <= 0)
                continue;

            if (listOfFiles[i].isFile()) {
                System.out.println("Processando: " + listOfFiles[i].getName() + "...");
                processa(listOfFiles[i].getName(), args[0], args[1], args[2], args[3]);
            }
            else {
                System.out.println("Não processado: " + listOfFiles[i].getName());
            }
        }
        
        System.out.println("Finalizado.");
        System.exit(0);
    }
}

deixando os agradecimentos a todos!

Pessoal alguém pode me informar qual séria essa senha que passada como segundo parâmetro

byte[] chave= WEBTACryptoUtil.decodeKeyFile(arquivo_chave, “XXXXXX”);