Compactar String

10 respostas
Z

Fala pessoal!

não tem nada a ver com java, mas pequisei e não encontrei nada sobre como encurtar um determinado termo. Não se trata de uma compactção de um arquivo, mas de um pequeno dado, transformálo num código. Preciso transformar por exemplo: “10/11/2010 - 18:06:45 - Local 3A - Profissional 2r” num código que seja ilegível, para o que eu poderia apenas utilizar algum tipo de criptografia, mas preciso deixar curto, o mais curto possível, com o menor numero de caracteres…

Se alguem puder pelo menos dar uma luz de como pesquisar isso, já agradeço
valeu ae!

10 Respostas

E

Você precisa que isso seja reversível (ou seja, é possível conseguir o valor “10/11/2010 - 18:06:45 - Local 3A - Profissional 2r” a partir de algo como “hjxc887784897xcX!”?)
Ou você aceita que não seja reversível, e possa usar apenas como um hash?

Z

Sim sim… precisa ser reversível. Pra deixar mais claro, trata-se de um agendamento de procedimentos. O código gerado ficará como protocolo com a pessoa que agendou o procedimento. No caso de naquele dia, em q o procedimento estiver agendado, houver um problema na rede ou no programa ou sei lá, aquele protocolo garantirá de qua aquela pessoa já agendou e pagou o serviço… por isso precisa ser ilegível, pra evitar fraudes, mas precisa ser “desconvertido” sim

E

Só me confirma uma coisa. Esses “pequenos dados” não passam de 64 caracteres mais ou menos?

L

Dá sim

Ficando assim mais ou menos:

1234123412j4ko

está bom?

E

Vou dar um exemplo, daqui a pouco.

Z

Sempre menores do q 64.
Quanto menor melhor… mas tá baum sim.

L

Eu tenho o “source” que faz isso, mas não está comigo agora. Depois eu posto ele aqui.

Z

no aguardo leo,

Pensei em fazer algo meio misto… tipo, passar a data para segundos q se passaram em relação a uma data de referencia converter o total para uma base maior, tipo hexadecimal, o restante eu utilizaria algum código, tipo o id do profissional e o nome do cliente… mas quero pesquisar alguma forma mais elaborada e já utilizada.

E
package guj;

import java.security.SecureRandom;
import java.util.Random;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class ExemploCriptografiaSimples {
    private byte[] salt;
    private PBEKeySpec ks;
    private SecretKey skey;
    private SecretKeyFactory skf;
    private BASE64Decoder dec;
    private BASE64Encoder enc;

    public ExemploCriptografiaSimples() {
        dec = new BASE64Decoder();
        enc = new BASE64Encoder();
    }

    public void senha(char[] chars) throws Exception {
        skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        salt = new byte[4]; // deixamos 4 bytes zerados :(
        ks = new PBEKeySpec(chars, salt, 100, 128);
        skey = new SecretKeySpec(skf.generateSecret(ks).getEncoded(), "AES");
    }

    public String cifrar(String original) throws Exception {
        Cipher cf = Cipher.getInstance("AES/OFB/NoPadding");
        cf.init(Cipher.ENCRYPT_MODE, skey, new IvParameterSpec(new byte[16]));
        return enc.encode(cf.doFinal(original.getBytes()));
    }

    public String decifrar(String cifrado) throws Exception {
        Cipher cf = Cipher.getInstance("AES/OFB/NoPadding");
        cf.init(Cipher.DECRYPT_MODE, skey, new IvParameterSpec(new byte[16]));
        return new String(cf.doFinal(dec.decodeBuffer(cifrado)));
    }

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        ExemploCriptografiaSimples ecs = new ExemploCriptografiaSimples();
        ecs.senha("YjMIzg+3dhgc7a3EPoH/OA==".toCharArray());
        String s = ecs.cifrar("10/11/2010 - 18:06:45 - Local 3A - Profissional 2r");
        // Esperado: "6A63+uTkapyT8h9GNvYaklLyfIVUCxrCZ+7zIE9XRbJyt6f4i7jBs/13JvsLPNSHpm8="
        System.out.println(s);
        String t = ecs.decifrar(s);
        System.out.println(t);
    }

}
Z

Fiz uma pog aque… hehehehehe… utilizei a classe do entanglement pra criptografar um biginteger q vem d um código que criei… deixo a data corrida nos 6 primeiros numeros e depois o final do numero do rg do cara… tudo isso são 2 bytes, se nao me engano. Dae criptografa e fica um código pequeno… valeu ae galera.

Criado 26 de novembro de 2010
Ultima resposta 29 de nov. de 2010
Respostas 10
Participantes 3