PBE - Criptografia

Boa tarde a todos.

Estou tentando montar um programa que trabalhe com PBE, eu quero que os dados criptografados sejam gravados por exemplo dessa forma: c:\dados_cript.dat, isso ai eu já consegui mas o meu problema esta que quando eu abro ele e a msm aparece criptografada num jtextArea em seguida na hora de decriptografar: que aparece o seguinte erro:

at Menu.decryptPBE(Menu.java:419)
at Menu$2.actionPerformed(Menu.java:184)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)

Esse é meu codigo:

[code]import java.awt.BorderLayout;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.Rectangle;
import javax.swing.JTextArea;
import javax.swing.JLabel;
import java.awt.Color;
import java.io.File;
import java.io.FileOutputStream;
import java.io.RandomAccessFile;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.KeySpec;

import javax.swing.JComboBox;

public class Menu extends JFrame {

private static final long serialVersionUID = 1L;

private JPanel jContentPane = null;

private JButton jButtonCriptografar = null;

private JButton jButtonDecritografar = null;

private JTextArea jTextArea = null;

private JButton jButtonSalvarArquivoDeDados = null;

private JButton jButtonCrregarChave = null;

private JLabel jLabel = null;

private JLabel jLabelTexto = null;
private java.util.Vector dados = new java.util.Vector();  //  @jve:decl-index=0:

private JLabel jLabelDados = null;

private JComboBox jComboBox = null;

private JLabel jLabel1ComoVc = null; 
int iterationCount = 19;

Cipher ecipher;
Cipher dcipher;

// 8-byte Salt
byte[] salt =
	{
		(byte) 0xA9, (byte) 0x9B,
		(byte) 0xC8, (byte) 0x32,
		(byte) 0x56, (byte) 0x35,
		(byte) 0xE3, (byte) 0x03 };	

private String dadosTexto;
private String chave;
private String dadosCod;  //  @jve:decl-index=0:


/**
 * This is the default constructor
 */
public Menu() {
	super();
	initialize();
}

/**
 * This method initializes this
 * 
 * @return void
 */
private void initialize() {
	this.setSize(640, 480);
	this.setContentPane(getJContentPane());
	this.setTitle("Trabalho - POS");
	this.setVisible(true);

}

/**
 * This method initializes jContentPane
 * 
 * @return javax.swing.JPanel
 */
private JPanel getJContentPane() {
	if (jContentPane == null) {
		jLabel1ComoVc = new JLabel();
		jLabel1ComoVc.setBounds(new Rectangle(17, 216, 207, 22));
		jLabel1ComoVc.setText("Como você deseja fazer ?");
		jLabelDados = new JLabel();
		jLabelDados.setBounds(new Rectangle(15, 276, 246, 22));
		jLabelDados.setText("Não há nenhuma Texto carregado !");
		jLabelDados.setBackground(Color.red);
		jLabelTexto = new JLabel();
		jLabelTexto.setBounds(new Rectangle(15, 21, 273, 16));
		jLabelTexto.setText("Texto não criptografado :");
		jLabel = new JLabel();
		jLabel.setBounds(new Rectangle(15, 303, 246, 23));
		jLabel.setBackground(Color.red);
		jLabel.setText("Não há nenhuma chave carregada !");
		jContentPane = new JPanel();
		jContentPane.setLayout(null);
		jContentPane.add(getJButtonCriptografar(), null);
		jContentPane.add(getJButtonDecritografar(), null);
		jContentPane.add(getJTextArea(), null);
		jContentPane.add(getJButtonSalvarArquivoDeDados(), null);
		jContentPane.add(getJButtonCrregarChave(), null);
		jContentPane.add(jLabel, null);
		jContentPane.add(jLabelTexto, null);
		jContentPane.add(jLabelDados, null);
		jContentPane.add(getJComboBox(), null);
		jContentPane.add(jLabel1ComoVc, null);
	}
	return jContentPane;
}

/**
 * This method initializes jButtonCriptografar	
 * 	
 * @return javax.swing.JButton	
 */
private JButton getJButtonCriptografar() {
	if (jButtonCriptografar == null) {
		jButtonCriptografar = new JButton();
		jButtonCriptografar.setText("Criptografar");
		jButtonCriptografar.setBounds(new Rectangle(473, 31, 147, 28));
		jButtonCriptografar.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				
				
				String tipoCript= getJComboBox().getSelectedItem().toString();
				String PBE = "PBE";
				
				if(tipoCript.equals(PBE)){
					
								
				PBE("Senha boa");
			    // Encrypt
				dadosTexto = getJTextArea().getText();
				encryptPBE(dadosTexto);
				
				
				
				
				
				
				
				
				
				
				}
				
				
				
				
				
			}
		});
	}
	return jButtonCriptografar;
}

/**
 * This method initializes jButtonDecritografar	
 * 	
 * @return javax.swing.JButton	
 */
private JButton getJButtonDecritografar() {
	if (jButtonDecritografar == null) {
		jButtonDecritografar = new JButton();
		jButtonDecritografar.setText("Decriptografar");
		jButtonDecritografar.setBounds(new Rectangle(474, 62, 145, 28));
		jButtonDecritografar.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				decryptPBE(dadosCod);
				
				
				jLabelTexto.setText("Texto não criptografado :");
				
				
			}
		});
	}
	return jButtonDecritografar;
}

/**
 * This method initializes jTextArea	
 * 	
 * @return javax.swing.JTextArea	
 */
private JTextArea getJTextArea() {
	if (jTextArea == null) {
		jTextArea = new JTextArea();
		jTextArea.setBounds(new Rectangle(15, 53, 398, 158));
	}
	return jTextArea;
}

/**
 * This method initializes jButtonSalvarArquivoDeDados	
 * 	
 * @return javax.swing.JButton	
 */
private JButton getJButtonSalvarArquivoDeDados() {
	if (jButtonSalvarArquivoDeDados == null) {
		jButtonSalvarArquivoDeDados = new JButton();
		jButtonSalvarArquivoDeDados.setText("Carregar dados.dat");
		jButtonSalvarArquivoDeDados.setBounds(new Rectangle(473, 94, 148, 28));
		jButtonSalvarArquivoDeDados
				.addActionListener(new java.awt.event.ActionListener() {
					public void actionPerformed(java.awt.event.ActionEvent e) {
						 String line_str;

					        try{
					            javax.swing.JFileChooser arquivo = new javax.swing.JFileChooser();
					            arquivo.setFileFilter(new DatFilter());
					            if(arquivo.showOpenDialog(arquivo) == javax.swing.JFileChooser.APPROVE_OPTION){
					                File file = arquivo.getSelectedFile();

					                String textoEntrada = "";
					                
					                java.io.FileInputStream isTwo = new java.io.FileInputStream(  "" +file.getPath() );
					                java.io.DataInputStream dsTwo = new java.io.DataInputStream(isTwo);

					                dados.removeAllElements();
					                
					                jLabelTexto.setText("Texto criptografado :");
					                jLabelDados.setText("Dados .... OK");
					                
					                while((line_str = dsTwo.readLine()) != null){
					                    dados.add( line_str );
					                    textoEntrada +=  line_str + "\n";
					                    dadosCod=textoEntrada;
					                }
					                
					                getJTextArea().setText(textoEntrada);

					                dsTwo.close( );
					            }
					        }catch (java.io.IOException e2) {
					            javax.swing.JOptionPane.showMessageDialog( null, "File error: " + e.toString() );
					        }
					  
					}
				});
	}
	return jButtonSalvarArquivoDeDados;
}

/**
 * This method initializes jButtonCrregarChave	
 * 	
 * @return javax.swing.JButton	
 */





private JButton getJButtonCrregarChave() {
	if (jButtonCrregarChave == null) {
		jButtonCrregarChave = new JButton();
		jButtonCrregarChave.setText("Carregar Chave");
		jButtonCrregarChave.setBounds(new Rectangle(473, 126, 148, 28));
		jButtonCrregarChave.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {

// TODO add your handling code here:
String line_str;

		        try{
		            javax.swing.JFileChooser arquivo = new javax.swing.JFileChooser();
		            arquivo.setFileFilter(new KeyFilter());
		            if(arquivo.showOpenDialog(arquivo) == javax.swing.JFileChooser.APPROVE_OPTION){
		                File file = arquivo.getSelectedFile();

		                String textoEntrada = "";
		                
		                java.io.FileInputStream isTwo = new java.io.FileInputStream(  "" +file.getPath() );
		                java.io.DataInputStream dsTwo = new java.io.DataInputStream(isTwo);

		                dados.removeAllElements();
		                
		                while((line_str = dsTwo.readLine()) != null){
		                    dados.add( line_str );
		                    textoEntrada +=  line_str + "\n";
		                }
		                
		                chave = textoEntrada ;
		                jLabel.setText("Chave .... OK");
		                
		                

		                dsTwo.close( );
		            }
		        }catch (java.io.IOException e2) {
		            javax.swing.JOptionPane.showMessageDialog( null, "File error: " + e.toString() );
		        }
		    }//GEN-LAST:event_bAbrirActionPerformed
		    
		    
		});
	}
	return jButtonCrregarChave;
}

/**
 * This method initializes jComboBox	
 * 	
 * @return javax.swing.JComboBox	
 */
private JComboBox getJComboBox() {
	if (jComboBox == null) {
		jComboBox = new JComboBox();
		jComboBox.setBounds(new Rectangle(15, 240, 175, 25));
		jComboBox.addItem("PBE");
		jComboBox.addItem("AES");
		jComboBox.addItem("DES");
		jComboBox.addItem("TRIPLEDES");
		jComboBox.addItem("BLOW FISH");
		
	}
	return jComboBox;
}



public void PBE(String senha) {
	try {
		// Especificacao das Chave PBE - senha + salt + iteraçoes - 
		KeySpec keySpec = new PBEKeySpec(senha.toCharArray(), 
		                                  salt, 
		                                  iterationCount);
		// fabrica de chaves PBE                                  
		SecretKeyFactory fabricaChaves = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
		// gerar a chave secreta, a partir da esepcificacao                                
		SecretKey chaveSecreta = fabricaChaves.generateSecret(keySpec);
		byte minhaChave[] = chaveSecreta.toString().getBytes(); 
		
		chave = minhaChave.toString();
		String dir = "c:/sua_chave.key";
		FileOutputStream out = new FileOutputStream(dir);

			out.write(minhaChave);

			out.close();
			JOptionPane.showMessageDialog(null, "Sua cheve esta salva no c:, como sua_chave.key.");
		
		
		
		// criando cifradores
		ecipher = Cipher.getInstance(chaveSecreta.getAlgorithm());
		dcipher = Cipher.getInstance(chaveSecreta.getAlgorithm());

		// criando especificacao para cifradores
		AlgorithmParameterSpec especCifradores = new PBEParameterSpec(salt, 
		                                                              iterationCount);

		//inicializando os cifradores
		ecipher.init(Cipher.ENCRYPT_MODE, chaveSecreta, especCifradores);
		dcipher.init(Cipher.DECRYPT_MODE, chaveSecreta, especCifradores);
		
	} catch (Exception exc) {
		exc.printStackTrace();
	}
}
public String encryptPBE(String mensagem) {
	try {
		
		// Encode the string into bytes using utf-8
		byte[] utf8 = mensagem.getBytes("UTF8");

		// Encriptou...
		byte[] enc = ecipher.doFinal(utf8);

		// Codifica o array de bytes em uma string Base64
		
		
		
		byte b[] = enc;

		String dados ="c:/dados.dat";

		FileOutputStream out = new FileOutputStream(dados);

		out.write(b);
		

		out.close();
		
		JOptionPane.showMessageDialog(null, "Seu arquivo de dados esta salvo no c:, como dados.dat .");
		
		return new sun.misc.BASE64Encoder().encode(enc);
	} catch (Exception exc) {
		exc.printStackTrace();
	} 
	return null;
}
public String decryptPBE(String Cod) {
	try {
		
		
		
		// Decode base64 to get bytes
		byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(Cod);
		
		
		
		// Decrypt
		byte[] utf8 = dcipher.doFinal(dec);
		System.out.println(utf8);
		
		

		// Decode using utf-8
		return new String(utf8, "UTF8");
      
	} catch (Exception exc) {
		exc.printStackTrace();
	} 
	return null;
}

}[/code]

Mas tem uma coisa curiosa : tenho um exemplo funcionando bem simples que quando eu tentei rodalo da mesma forma funcionou certinho, mas a msm criptografada é diferente, mesmo senha e chave iguais.

o codigo simples é esse:

[code]import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.KeySpec;

import javax.crypto.;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import javax.security.
;

public class PBEexemplo {
Cipher ecipher;
Cipher dcipher;

// 8-byte Salt
byte[] salt =
	{
		(byte) 0xA9, (byte) 0x9B,
		(byte) 0xC8, (byte) 0x32,
		(byte) 0x56, (byte) 0x35,
		(byte) 0xE3, (byte) 0x03 };

// Iteration count
int iterationCount = 19;

public PBEexemplo(String senha) {
	try {
		// Especificacao das Chave PBE - senha + salt + iteraçoes - 
		KeySpec keySpec = new PBEKeySpec(senha.toCharArray(), 
		                                  salt, 
		                                  iterationCount);
		// fabrica de chaves PBE                                  
		SecretKeyFactory fabricaChaves = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); 
		// gerar a chave secreta, a partir da esepcificacao                                
		SecretKey chaveSecreta = fabricaChaves.generateSecret(keySpec);
		
		// criando cifradores
		ecipher = Cipher.getInstance(chaveSecreta.getAlgorithm());
		dcipher = Cipher.getInstance(chaveSecreta.getAlgorithm());

		// criando especificacao para cifradores
		AlgorithmParameterSpec especCifradores = new PBEParameterSpec(salt, 
		                                                              iterationCount);

		//inicializando os cifradores
		ecipher.init(Cipher.ENCRYPT_MODE, chaveSecreta, especCifradores);
		dcipher.init(Cipher.DECRYPT_MODE, chaveSecreta, especCifradores);
		
	} catch (Exception exc) {
		exc.printStackTrace();
	}
}

/**
 * metodo para criptografar 
 * @param msgString string com msg
 * 
 * @return string criptografada em formato Base64
 */
public String encrypt(String msgString) {
	try {
		// Encode the string into bytes using utf-8
		byte[] utf8 = msgString.getBytes("UTF8");

		// Encriptou...
		byte[] enc = ecipher.doFinal(utf8);

		// Codifica o array de bytes em uma string Base64
		return new sun.misc.BASE64Encoder().encode(enc);
	} catch (Exception exc) {
		exc.printStackTrace();
	} 
	return null;
}


/**
 * 
 * @param str
 * @return
 */
public String decrypt(String str) {
	try {
		// Decode base64 to get bytes
		byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);

		// Decrypt
		byte[] utf8 = dcipher.doFinal(dec);

		// Decode using utf-8
		return new String(utf8, "UTF8");
	} catch (Exception exc) {
		exc.printStackTrace();
	} 
	return null;
}



public static void main(String[] args) {		
	try {
		// Create encrypter/decrypter class
		PBEexemplo encrypter = new PBEexemplo("Senha boa");

		// Encrypt
		String encrypted = encrypter.encrypt("ABC");
         System.out.println("encriptado " + encrypted);

		// Decrypt
		String decrypted = encrypter.decrypt(encrypted);
		System.out.println("decriptado " + decrypted );
		
	} catch (Exception e) {
		e.printStackTrace();
	}
}

}[/code]

OB.: no 1° codigo o que grava ele o arquivo com msm criptografada a msm criptografada é essa: “Ë6R?ëiz” já no 2° codigo ( o que esta funcionando direitinho ) a msm cript. é essa: “H8s2UofraXo=”

Será que o ploblema tem haver com a falta de algum tratamento ao gravar e ler o arquivo na maquina e depois decriptografalo, e se form como eu faço isso?

Muito obrigado a todos