Boa tarde galera, sou novo aqui, acabei de me cadastrar e, como estou no desespero, ñ sei se tem algum tópico igual…
Estou precisando fazer uma função de criptografia de strings e uma função para descriptografar, sendo que, a string de retorno da criptografia deve ter tamanho invariável, ou seja, o cara pode digitar “oi” ou então “asiuofgbaopevbpeabv0wberpbchpfuebhiuehbiigsdilagcfliusdagfiuladbscvowebaovs” e quando essa string for criptografada deve sempre voltar algo de tamanho único.
Já vi que MD5, SHA, etc… fazem isso, porém não há descriptografia por serem Hashes…
Será que alguém pode me ajudar?!?!

fcruz,
No seu caso o melhor seria usar criptografia assimétrica, por meio de chave pública e chave privada, sendo que a mais utilizada é a RSA.
Segue um exemplo dessa criptografia (http://www.java2s.com/Tutorial/Java/0490__Security/BasicRSAexample.htm). Veja que neste exemplo foi gerada a chave pública (para encriptar) e a chave privada (para decriptar) em tempo de execução. Porém pode-se também gerar as chaves em um passo anterior com openssl e keytool e apenas carrega-lás dentro da sua aplicação.
[]'s
Cara, eu testei com uma frase aqui para ver se funcionava mas neu foi, deu o erro
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block
at org.bouncycastle.jce.provider.JCERSACipher.engineDoFinal(Unknown Source)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at control.Main.main(Main.java:32)
Oq tá me matando é essa necessidade da string de retorno ser uma criptografia de tamanho invariável… se ñ fosse isso, o BASE64Encoder e BASE64Decoder serviriam de boa…
Cara,
Desculpe, eu havia pego o exemplo da internet sem tentar executar. Implementei um rápido aqui pra tu ver.
[code]
public class DummyMain {
public static void main(String[] args) throws Exception {
String input = "rafael";
Cipher cipher = Cipher.getInstance("RSA");
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
KeyPair keyPair = keyPairGenerator.genKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] cipherText = cipher.doFinal(input.getBytes());
System.out.println("cipher: " + new String(cipherText));
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] plainText = cipher.doFinal(cipherText);
System.out.println("plain : " + new String(plainText));
}
}[/code]
Fala cara, desde já agradeço a ajuda!!!
Seguinte, o crypt e o decrypt funcionou normalmente, porém, estou esbarrando no lance do tamanho da string de retorno… ela tá variando de acordo com as strings de input q eu coloco…
Entendi… então é só setar o tamanho da chave a ser gerada no initialize do KeyPairGenerator. O tamanho da chave é quem vai dizer o tamanho do codigo cifrado. Tente este código:
[code]
public class DummyMain {
public static void main(String[] args) throws Exception {
String input = "rafael";
Cipher cipher = Cipher.getInstance("RSA");
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512);
KeyPair keyPair = keyPairGenerator.genKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] cipherText = cipher.doFinal(input.getBytes());
System.out.println("cipher: " + new BigInteger(cipherText));
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] plainText = cipher.doFinal(cipherText);
System.out.println("plain : " + new String(plainText));
}
}[/code]
repare que apenas adicionei a configuração do tamanho da chave:
keyPairGenerator.initialize(512);
[]'s
Faaaaaaaaaaaaaaaaaaaala grande Rafa, po, tá ficando mto bom, mas prevejo algo q pode fazer com o q o usuário (aaaaaaaahhhhhhh usuário… :evil: :evil: :evil: ) reclame…
Tentei colocar uma string de entrada mto grande e ele esbarrou por causa do limite de 53 bits e corre o risco d termos uma string d retorno grande (nomecompleto+timestamp+codigocontrole+nomedecurso)… Será q tem como aumentar esse limite?!
Eu vou procurar daqui, mas se vc souber de algo, peço q me diga, por favor… vc tá me ajudando mto cara, brigadão mermo!!!

[EDIT]
Apenas alterei a linha
keyPairGenerator.initialize(512);
Para
keyPairGenerator.initialize(1024);
E passou, só q a string de retorno ficou uma tripa gigantesca, vou ver na segunda feira se eles concordam…
Peço que ainda não fechem o tópico que durante a semana eu posto a resposta, se ainda preciso de ajuda ou ñ, mas po, o pessoal daqui é bom demais mesmo…
Fala galera!!! Em reunião aqui no trampo ficou decidido outro caminho e não precisarei mais usar criptografia, mas mesmo assim agradeço ao Rafael pela moral que ele me deu, o aprendizado sempre é bom!!!
Abração!!!