Criptografia ! Esta Certo?[Resolvido]

Oi, estou tentando fazer um aplicativo que criptografa um numero inteiro de 4 digitos, estou pegando o numero pelo dialogo de entrada e substituindo cada digito por (a soma desse digito + 7) modulo 10. Depois trocar o primeiro digito pelo terceiro digito, e o 2 digito pelo 4 digito. Ele mostra um numero depois de criptografar, mas nao sei se e o certo. Pq qdo coloco o numero criptografado, ele mostra o original.

Se puderem verificar se esta certo, ou dar alguma ajuda, agradeço.

[code]import javax.swing.*;

public class criptografa {
public static void main(String args[]){
int i,digito1=0, digito2, digito3, digito4,temp;
String num = new String();

    num  = JOptionPane.showInputDialog("Entre com o numero a ser criptografado.");
    
    while(num.length() != 4){
        JOptionPane.showMessageDialog(null,"O numero so pode ser de 4 digitos.","Aviso!!",JOptionPane.ERROR_MESSAGE);
         num  = JOptionPane.showInputDialog(null,"Entre com o numero a ser criptografado.","Criptografia",JOptionPane.QUESTION_MESSAGE);
    }
    
    digito1 = num.charAt(0);
    digito1 +=7;
    digito1 %=10;
    digito2 = num.charAt(1);
    digito2 = (digito2 +7)%10;
    digito3 = num.charAt(2);
    digito3 = (digito3 +7)%10;
    digito4 = num.charAt(3);
    digito4 = (digito4 +7)%10;
    temp = digito1;
    digito1=digito3;
    digito3 = temp;
    temp = digito2;
    digito2 = digito4;
    digito4 = temp;

    JOptionPane.showMessageDialog(null,"O numero criptografado e "+digito1+digito2+digito3+digito4);
    System.exit(0);
}

}[/code]

Dica: se você somar os dígitos desse jeito que você fez, não os está concatenando (que é o que você queria). Eu separo os dígitos fazendo contas, que é o certo. Veja abaixo como é que dá para embaralhar (“criptografar” é uma palavra mal usada nesse caso) e desembaralhar os dígitos.

class TesteDigitos {
    static int embaralhar (int valor) {
        int[] digitos = new int[5];
        digitos[1] = valor / 1000;
        digitos[2] = (valor / 100) % 10;
        digitos[3] = (valor / 10) % 10;
        digitos[4] = valor % 10;
        // digito = (digito + 7) modulo 10
        for (int i = 1; i <= 4; ++i) {
            digitos[i] = (digitos[i] + 7) % 10;
        }
        // trocar o 1o. digito com o 3o. digito
        int tmp = digitos[1]; digitos[1] = digitos[3]; digitos[3] = tmp;
        // trocar o 2o. digito com o 4o. digito
        tmp = digitos[2]; digitos[2] = digitos[4]; digitos[4] = tmp;
        // retornar o numero criptografado
        int retorno = digitos[1] * 1000 + digitos[2] * 100 + digitos[3] * 10 + digitos[4];
        return retorno;
    }
    static int desembaralhar (int valor) {
        int[] digitos = new int[5];
        digitos[1] = valor / 1000;
        digitos[2] = (valor / 100) % 10;
        digitos[3] = (valor / 10) % 10;
        digitos[4] = valor % 10;
        // digito = (digito + 3) modulo 10
        for (int i = 1; i <= 4; ++i) {
            digitos[i] = (digitos[i] + 3) % 10;
        }
        // trocar o 1o. digito com o 3o. digito
        int tmp = digitos[1]; digitos[1] = digitos[3]; digitos[3] = tmp;
        // trocar o 2o. digito com o 4o. digito
        tmp = digitos[2]; digitos[2] = digitos[4]; digitos[4] = tmp;
        // retornar o numero criptografado
        int retorno = digitos[1] * 1000 + digitos[2] * 100 + digitos[3] * 10 + digitos[4];
        return retorno;
    }
    public static void main(String[] args) {
        for (int i = 0; i <= 9999; ++i) {
            System.out.printf ("%04d -> %04d %s %n", i, embaralhar (i), i == desembaralhar (embaralhar (i)));
        }
    }
}

Mas esse q vc fez foi baseado na minha questao, a ideia q eu tinha q resolver era akela substituindo cada digito por (a soma desse digito + 7) modulo 10. Depois trocar o primeiro digito pelo terceiro digito, e o 2 digito pelo 4 digito.

Mas essa tbm ficou massa vlw…!!!

Alguem Mais tem alguma resposta??

Você quer simplesmente criptografar ou tem que criptografar dessa maneira que descreveu? Se for isso aqui não serve.

[code]import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.;
import javax.crypto.spec.
;
import java.security.;
import java.security.spec.
;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.KeySpec;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;

public final class Cripto2 extends JFrame{
private static SecretKey skey;
private static KeySpec ks;
private static PBEParameterSpec ps;
private static final String algorithm = “PBEWithMD5AndDES”;
private static BASE64Encoder enc = new BASE64Encoder();
private static BASE64Decoder dec = new BASE64Decoder();
JLabel nome1,nome2;
JButton descri,cripto,botaovoltar;

static {   
    try {   
        SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm);   
        ps = new PBEParameterSpec (new byte[]{3,1,4,1,5,9,2,6}, 20);   

        ks = new PBEKeySpec ("EAlGeEen3/m8/YkO".toCharArray()); 

        skey = skf.generateSecret (ks);   
    } catch (java.security.NoSuchAlgorithmException ex) {   
        ex.printStackTrace();   
    } catch (java.security.spec.InvalidKeySpecException ex) {   
        ex.printStackTrace();   
    }   
}   



public static final String encrypt(final String text)   
    throws   
    BadPaddingException,   
    NoSuchPaddingException,   
    IllegalBlockSizeException,   
    InvalidKeyException,   
    NoSuchAlgorithmException,   
    InvalidAlgorithmParameterException {   
           
    final Cipher cipher = Cipher.getInstance(algorithm);   
    cipher.init(Cipher.ENCRYPT_MODE, skey, ps);   
    return enc.encode (cipher.doFinal(text.getBytes()));   
}   


public static final String decrypt(final String text)   
    throws   
    BadPaddingException,   
    NoSuchPaddingException,   
    IllegalBlockSizeException,   
    InvalidKeyException,   
    NoSuchAlgorithmException,   
    InvalidAlgorithmParameterException {   
           
    final Cipher cipher = Cipher.getInstance(algorithm);   
    cipher.init(Cipher.DECRYPT_MODE, skey, ps);   
    String ret = null;   
    try {   
        ret = new String(cipher.doFinal(dec.decodeBuffer (text)));   
    } catch (Exception ex) {   
    }   
    return ret;   
}   
// a classe construtor
public Cripto2(){
     super("Algoritmo-2");

      Container tela = getContentPane();
     tela.setLayout(null);
     
     // nome
     nome1 = new JLabel("ALGORITMO 2!!! ");
     nome1.setBounds(125,20,200,20);
     
     //butão
     descri = new JButton ("Descriptografar");
     descri.setBounds(165,100,150,20);
     
     cripto = new JButton ("Criptografar/Descriptografar");
     cripto.setBounds(40,100,250,20);
     
     botaovoltar = new JButton("Voltar");
     botaovoltar.setBounds(100,150,120,20);
     
     // exibe no frame
     tela.add(nome1);
     //tela.add(descri);
     tela.add(cripto);
     tela.add(botaovoltar);
 
    botaovoltar.addMouseListener(new java.awt.event.MouseAdapter() {  
      public void mousePressed(java.awt.event.MouseEvent e) {  
  
       int opc = JOptionPane.showConfirmDialog(null, "Você desejar voltar realmente?",  
                                            "Atenção",2,  
                                            JOptionPane.YES_NO_OPTION);  
       if (opc == JOptionPane.YES_OPTION) {  
          dispose();  
          this.mouseExited(e);  
 
       }  
 
     }  
 
   });  

cripto.addActionListener (
    new ActionListener(){
    public void actionPerformed(ActionEvent e){
            try {
                aviso();
            } catch (Exception ex) {
                Logger.getLogger(Cripto2.class.getName()).log(Level.SEVERE, null, ex);
            }
        
        }
        }
    );




}
 

public static void main(String[] args) {   
    
    Cripto2 p = new Cripto2();
    p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    p.setSize(340,280);
    p.setVisible(true);
}
 public static void aviso()throws Exception {   
    String password =JOptionPane.showInputDialog(null,"Digite o texto para criptografar"); 
    String encoded = Cripto2.encrypt (password);
    JOptionPane.showMessageDialog(null,(encoded),"O Texto Criptografado",
            JOptionPane.INFORMATION_MESSAGE);
    
    
    Cripto2.decrypt(password);
    JOptionPane.showMessageDialog(null, (password),"O texto Descriptografado",
            JOptionPane.INFORMATION_MESSAGE);    
     
}

}[/code]
tenho esse aqui ver se vc aproveita

Não, o jeito que tem q criptografar e esse mesmo que eu descrevi, no exercicio q eu tava fazendo tava pedindo desse jeito: criptografar um numero inteiro de 4 digitos, pegar o numero pelo dialogo de entrada e substituindo cada digito por (a soma dele + 7) modulo 10. Depois trocar o primeiro digito pelo terceiro digito, e o 2 digito pelo 4 digito.

Nao e que esteja errado, e so o que o exercicio tava pedindo no livro.

Mas vlw, ate agora, se alguema mais verificar meu codigo e achar algum erro. Veja meu codigo la encima e ve se esta alguma coisa errada. Por exemplo eu digito 1234 ele mostra 8629, dai eu digito 8629 e mostra 1234. Eu so queria saber se esse metodo q eu fiz pra essa questao q ele ta pedindo esta certa.

Obrigado.

Tem alguma coisa errada. Se você digitar 1234, tem de dar 0189. Quando você digitar 0189, o resultado vai dar 5678. Quando você digitar 5678, o resultado é 4253. Quando digitar 4253, o resultado é 2019. Ao digitar 2019, o resultado é 8697. Para 8697, o resultado é 6453. E assim por diante.

Esse método não é o inverso dele próprio.

E verdade, entao ta dando errado mesmo como eu pensei. Eu fiz as contas manualmente mesmo pra 1234 e deu 0189, dai eu pensei q minhas contas estivessem erradas.

Mas blz entao.

Obrigado.