Preciso criptografar e descriptografar um texto qualquer.
Porém o professor mandou a gente se virar, ele não ensinou nada. Por isso ele não pediu nada muito anormal.
Pelo visto ele quer que a gente crie nossa criptografia.
Tem algum material que eu possa estar usando como base ?
http://www.guj.com.br/posts/list/35256.java#187467
Dica: nunca, nunca faça sua própria criptografia. Esse é um erro muito comum cometido por gerações e gerações de programadores. A menos que você estude cuidadosamente a teoria (que envolve bastante matemática pesada), então use alguma coisa confiável.
Tudo bem então, obrigado pela ajuda.
Realmente acho que usando os já existentes ficará bem mais fácil.
Valeu.
Oi.
Eu tenho esse programa para criptografia.
Precisaria da ajuda de voces para duas coisas: Fazer a descriptografia e, se possível, mande tutorias que falem sobre MD5.
O programa é esse:
// Vamos utilizar BigInteger para armazenar o hash
import java.math.BigInteger;
// Classe que possui os métodos para criptografarmos
import java.security.MessageDigest;
// Classe responsável pela exception
import java.security.NoSuchAlgorithmException;
public class Main{
//Função que vai criar e retornar o hash
public static String criptografar(String senha){
// Cria uma variável de referencia a um objeto MessageDigest
MessageDigest md = null;
try {
//Instancia usando o algoritmo md5
md = MessageDigest.getInstance(“MD5”);
}
catch (NoSuchAlgorithmException e) {
System.out.println(e);
}
//Cria o hash
BigInteger hash = new BigInteger(1, md.digest(senha.getBytes()));
return hash.toString(16); }
//Método de teste
public static void main(String[] args) {
//Imprime a palavra Madeiraaaaaaaa criptografada
System.out.println("Cripto: " + criptografar(“Hello World”)); }}
Não se pode “descriptografar” o MD5. Ele é semelhante a uma impressão digital: de posse de uma impressão digital não se consegue recriar (ou seja, “decifrar”) uma pessoa; você só conseguiria recriar a tal pessoa com o DNA (e é por isso que se chama “código genético”).
Entretanto, você pode procurar a impressão digital no banco de dados da polícia para ver se corresponde a um determinado criminoso. Se o criminoso nunca tiver sido fichado, você terá de interrogar mais suspeitos e recolher suas impressões digitais até encontrar alguém cujo MD5 (aham, cujas impressões digitais) batem.
É mais ou menos assim que funciona o MD5: ele serve para correlacionar uma determinada informação (uma senha, por exemplo) a um código.
Portanto, não posso ajudá-lo a “descriptografar” o MD5.
Veja se esta classe ajuda:
package teste;
import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public final class encripty {
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();
public encripty() {
try {
SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm);
ps = new PBEParameterSpec(new byte[] {1,9,0,8,1,9,8,9 }, 20);
ks = new PBEKeySpec("jandreisistemas".toCharArray()); // esta é a chave que você quer manter secreta.
// Obviamente quando você for implantar na sua empresa, use alguma outra coisa - por exemplo,
// "05Bc5hswRWpwp1sew+MSoHcj28rQ0MK8". Nao use caracteres especiais (como ç) para nao dar problemas.
skey = skf.generateSecret(ks);
} catch (java.security.NoSuchAlgorithmException ex) {
ex.printStackTrace();
} catch (java.security.spec.InvalidKeySpecException ex) {
ex.printStackTrace();
}
}
public final String encrypt(final String text) throws Exception {
final Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, skey, ps);
return enc.encode(cipher.doFinal(text.getBytes()));
}
public final String decrypt(final String text) throws Exception {
final Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.DECRYPT_MODE, skey, ps);
String ret = null;
ret = new String(cipher.doFinal(dec.decodeBuffer(text)));
return ret;
}
public static void main(String[] args) throws Exception {
String password = "teste"; // esta é a tal senha do banco de dados que você quer criptografar
encripty encripty=new encripty();
String encoded = encripty.encrypt(password);
String decript = encripty.decrypt(encoded);
System.out.println("Normal: "+password);
System.out.println("Criptografado: "+encoded);
System.out.println(password.equals(decript)); // imprime "true"
}
}
[quote=janjan]Veja se esta classe ajuda:
[code]
package teste;
import java.security.spec.KeySpec;
…
[/code][/quote]
É, meu código está dando volta ao mundo
Beleza, entendi que não há como descriptografar o MD5.
Porém o professor QUER que nós criptografemos e descriptografemos uma frase qualquer.
Tenho esse programa ai:
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
public class DES {
public static void main(String[] args) {
try {
byte[] t = encrypt(" “, “Ola Mundo”);
System.out.println(new String(t));
System.out.println(decrypt(” ", t));
} catch (Exception x) {
x.printStackTrace();
}
}
private static byte[] crypto(boolean dir, byte[] password, byte[] text) throws Exception {
DESKeySpec keySpec = new DESKeySpec(password);
SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
Cipher cipher = Cipher.getInstance("DES");
cipher.init(dir ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE,
factory.generateSecret(keySpec));
return cipher.doFinal(text);
}
private static byte[] encrypt(String password, String text) throws Exception {
return crypto(true, password.getBytes(), text.getBytes());
}
private static String decrypt(String password, byte[] text) throws Exception {
return new String(crypto(false, password.getBytes(), text));
}
}
Tem como voce ajudar a explicar o que ta sendo usado ai.
Valeu.
Vou explicar o meu programa, que esse eu conheço bem.
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
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 sun.misc.BASE64Encoder; // para simplificar o exemplo. Use alguma outra classe para converter
import sun.misc.BASE64Decoder; // para Base-64.
public final class PWSec2 {
/** A chave secreta */
private SecretKey skey;
/** A especificação da chave */
private KeySpec ks;
/** Parâmetros passados para converter uma senha em uma chave */
private PBEParameterSpec ps;
// Nome do algoritmo usado - veja em PKCS#5, ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-5v2/pkcs5v2-0.pdf
private final String algorithm = "PBEWithMD5AndDES";
private BASE64Encoder enc = new BASE64Encoder();
private BASE64Decoder dec = new BASE64Decoder();
private void convertPasswordToKey (final String password) {
try {
// Obtendo uma instância da fábrica de chaves secretas.
// O algoritmo dessa fábrica, chamado PBEWithMD5AndDES,
// transforma uma senha (conjunto de caracteres digitáveis)
// em uma chave (bits aleatórios que devem ser mantidos em sigilo).
// Essa chave é gerada segundo um algoritmo especificado em:
// PKCS#5 - disponível em: ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-5v2/pkcs5v2-0.pdf
SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm);
// Um dos parâmetros necessários para gerar a senha a partir da chave é um
// "salt" (que neste caso especifiquei como uma série de bytes que
// são a representação decimal dos primeiros dígitos de pi) e
// um "iteration count".
ps = new PBEParameterSpec (new byte[]{3,1,4,1,5,9,2,6}, 20);
// Aqui temos a senha...
ks = new PBEKeySpec (password.toCharArray());
// E aqui temos o resultado final, que é a chave secreta.
skey = skf.generateSecret (ks);
} catch (java.security.NoSuchAlgorithmException ex) {
ex.printStackTrace();
} catch (java.security.spec.InvalidKeySpecException ex) {
ex.printStackTrace();
}
}
/**
* Cifra um texto com a senha passada.
*/
public final String encrypt(final String password, final String text)
throws
BadPaddingException,
NoSuchPaddingException,
IllegalBlockSizeException,
InvalidKeyException,
NoSuchAlgorithmException,
InvalidAlgorithmParameterException {
// Converte a senha em uma chave
convertPasswordToKey (password);
// Obtém o algoritmo de criptografia (no caso DES)
final Cipher cipher = Cipher.getInstance(algorithm);
// Inicializa o algoritmo com a chave
cipher.init(Cipher.ENCRYPT_MODE, skey, ps);
// Efetua a criptografia, usando "doFinal", e converte para Base-64
return enc.encode (cipher.doFinal(text.getBytes()));
}
/**
* Decifra um texto com a senha passada
*/
public final String decrypt(final String password, final String text)
throws
BadPaddingException,
NoSuchPaddingException,
IllegalBlockSizeException,
InvalidKeyException,
NoSuchAlgorithmException,
InvalidAlgorithmParameterException {
// Converte a senha em uma chave
convertPasswordToKey (password);
// Obtém o algoritmo de criptografia (no caso DES)
final Cipher cipher = Cipher.getInstance(algorithm);
// Inicializa o algoritmo com a chave
cipher.init(Cipher.DECRYPT_MODE, skey, ps);
String ret = null;
try {
// Converte de Base-64 para bytes, e então efetua a decifração ("descriptografia").
ret = new String(cipher.doFinal(dec.decodeBuffer (text)));
} catch (Exception ex) {
}
return ret;
}
public static void main(String[] args) throws Exception {
String password = "Gisele Bundchen";
String cleartext = "Este é o texto que você quer criptografar";
System.out.println ("Texto original em claro");
System.out.println (cleartext);
String encrypted = new PWSec2().encrypt (password, cleartext);
System.out.println ("Texto criptografado");
System.out.println (encrypted);
String decrypted = new PWSec2().decrypt (password, encrypted);
System.out.println ("Texto decifrado");
System.out.println (decrypted);
System.out.println ("O texto original e o decifrado " + (cleartext.equals(decrypted) ? " batem" : " não batem"));
}
}
Beleza cara. Acho que ficou bem mais facil agora de entender.
Obrigado.
ae thingol!
eles ajudam e são repassados
nada mais justo.
flw!!
Seguinte, mostrei o programa hoje pro professor, mas ele disse que não quer nada assim.
A gente tem que fazer um programa simples, com a NOSSA criptografia.
Dai ele quer que criemos um método pra criptografar e um pra descriptografar. ‘-’
Dois grupos ja apresentaram, ele disse que não é nada muito complexo.
Valeu.
O método mais bobo para fazer "criptografia" (entre aspas) é trocar as letras:
Por exemplo, A -> E, B -> X, C -> Y etc.
Obviamente isso não é muito "criptográfico", e na verdade dá um pouquinho de trabalho para fazer.
O que os preguiçosos (que abundam neste mundo) costumam fazer é o seguinte: você já ouviu falar de XOR (Ou Exclusivo) ? É uma operação interessante que é semelhante à soma, mas ela é a inversa de si mesma. Exemplo (vou dar os exemplos em binário, porque é mais fácil entender em binário):
‘A’ = 0x41 (Código char->int, em hexadecimal, ou seja, 65 em decimal) = 0100.0001
‘X’ = 0x58 (88 em decimal) = 0101.1000
‘A’ ^ ‘X’ = 0001.1001 = 0x19 = 25 em decimal -> este caracter não pode ser impresso, portanto você tem de representá-lo em hexadecimal (dois caracteres, ‘19’).
Se você pegar 0x19 e efetuar o XOR com 0x58 (ou seja, a letra 'X), vai obter de volta o valor 0x41 (ou seja,
A`).
O que basicamente se faz é pegar o texto original (‘JOSE DIRCEU SACOU 123’) e efetuar o XOR com uma senha qualquer (digamos ‘LULA’) que você repete para ficar com o mesmo comprimento do texto original (ficaria:)
JOSE DIRCEU SACOU 123
LULALULALULALULALULAL
e ir efetuando o XOR de cada conjunto de texto original X senha. Aí você vai ter uma sequência de bytes e você a representa em hexadecimal. (Não se esqueça de pôr um zero à esquerda se o resultado der apenas uma letra ou dígito, para evitar problemas na hora de decifrar).
Para desfazer o processo, você desconverte de hexadecimal para bytes, e então faz o processo de efetuar o XOR com a senha.
Beleza, a gente vai ver o que faz.
Qualquer duvida eu posto aqui.
Abraço.
Ae, acho que consegui fazer um. Tipo, é meio besta como o professor pediu, mas saiu.
Foi meio parecido com a cifra de Cesar. Agora a gente só precisa usar o Swap pra poder embaralhar e dificultar um pouquinho mais. :3
Abraço.
Desculpe tanta pertubação, mas tenho mais duvida
Esse é o programa que eu usei :
NÃO EXECUTAVEL:
[b]
public class Cifra {
private char[] alfabeto = new char[]{
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' ', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
'!', '"', '#', '$', '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', ']', '^', '_',
'`', '{', '}', '|', '~', 'Ç', 'ç', 'ü', 'é', 'â', 'ä', 'à', 'å', 'ê', 'ë', 'è', 'ï', 'î', 'ì', 'Ä', 'Å', 'É', 'æ',
'Æ','ô','ö','ò','û','ù','ÿ','Ö','Ü','ø','£','Ø','×','?','á','ù','ó','ú','ñ','Ñ','ª','º','¿','®','¬','½',
'¼','¡','«','»','░','▒','▓','│','┤','Á','Â','À','©','╣','║','╗','╝','¢','¥','┐','└','┴','┬','├',
'─','┼','ã','Ã','╚','╔','╩','╦','╠','═','╬','¤', 'ð','Ð','Ê','Ë','È','ı','Í','Î','Ï','┘','┌','█','▄',
'¦','Ì','▀','Ó','ß','Ô','Ò','õ','Õ','µ','þ','Þ','Ú','Û','Ù','ý','Ý','¯','´',
'±','‗','¾','¶','§','÷','¸','°','¨','?','¹','³','²','■'};
public String cifra(String texto, int chave) {
String textoCodificado = "";
for (int i = 0; i < texto.length(); i++) {
textoCodificado = textoCodificado + codificaLetra(texto.charAt(i), chave);
}
return textoCodificado;
}
public String decifra(String texto, int chave) {
return cifra(texto, -chave);
}
private char codificaLetra(char letra, int chave) {
int i = 0;
while (letra != alfabeto[i]) {
i++;
}
int indice = (i + chave) % alfabeto.length;
if (indice < 0) {
indice = indice + alfabeto.length;
}
return alfabeto[indice];
}
}[/b]
EXECUTAVEL
[b]import javax.swing.JOptionPane;
public class TestaCifra {
public static void main(String args[])
{
Cifra codificado = new Cifra();
String texto = JOptionPane.showInputDialog ("Forneça o texto: ");
int chave = Integer.parseInt (JOptionPane.showInputDialog("Forneça a chave: "));
String resp = codificado.cifra(texto, chave);
String des = codificado.decifra(resp, chave);
JOptionPane.showMessageDialog(null,"Texto criptografado: "+resp+
"\n\nTexto descriptografado: "+des, "Criptografia", JOptionPane.PLAIN_MESSAGE);
}
}[b]
A duvida é o seguinte, eu to tentando multiplicar a chave, até ai tudo bem, mas não consigo fazer a volta.
Se tiver como ajudar eu agradeço.