Criptografia ! Esta Certo?[Resolvido]

7 respostas
psyhclo

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.

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);
    }
}

7 Respostas

E

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)));
        }
    }
}
psyhclo

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

mvargens

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

J
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);    
         
    }

    
}
tenho esse aqui ver se vc aproveita
psyhclo

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.

E

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.

psyhclo

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.

Criado 17 de setembro de 2009
Ultima resposta 18 de set. de 2009
Respostas 7
Participantes 4