Codificação* personalizada de inteiros longos

3 respostas
marcelojunior

Personalizar os IDs usados em suas páginas pelos caracteres do nome da sua empresa.
Ex:
EMPRESA: XYZ

Antes...
--------------------
CRUD VEICULOS
--------------------
ID | CARRO
1   | Fusca
2   | Chevet
3   | Brásilia
4   | Monza
5   | D20
6   | D10
7   | C20
8   | C10
9   | Uno
10 | Celta
--------------------
Depois...
--------------------
CRUD VEICULOS
--------------------
ID    | CARRO
y      | Fusca
z      | Chevet
yx    | Brásilia
yy    | Monza
yz    | D20
zx    | D10
zy    | C20
zz    | C10
yxx  | Uno
yxy  | Celta
--------------------
Classe necessária
/**
 * Codificação personalizada de inteiros longos
 *  
 * @version 1.01 @date 14/12/2012
 * @author Marcelo Junior
 */
package meupacote;

import java.util.Arrays;

public class Codificacao {
	private String[] personalizados;
	private String[] padraoJava;

	public Codificacao(String... caracteresPersonalizados) {
		personalizados = caracteresPersonalizadosReduzidos(caracteresPersonalizados);
		int tamanho = personalizados.length;
		padraoJava = new String[tamanho];
		int bytes = tamanho;
		for (int i = 0; i < tamanho; i++) {
			padraoJava[i] = Long.toString(i, bytes);
		}
	}

	public String codifica(Long numero) {
		int bytes = padraoJava.length;
		String codigo = Long.toString(numero, bytes);
		int tamanho = bytes;
		for (int i = 0; i < tamanho; i++) {
			codigo = codigo.replaceAll(padraoJava[i], personalizados[i]);
		}
		return codigo;
	}

	public Long descodifica(String codigo) {
		codigo = codigo.toLowerCase();
		validaCodigo(codigo);
		int tamanho = personalizados.length;
		int bytes = tamanho;
		for (int i = 0; i < tamanho; i++) {
			codigo = codigo.replaceAll(personalizados[i], padraoJava[i]);
		}
		return Long.valueOf(codigo, bytes);
	}

	private String[] caracteresPersonalizadosReduzidos(
			String[] caracteresPersonalizados) {
		StringBuffer codigo = new StringBuffer();
		for (String caractere : caracteresPersonalizados) {
			codigo.append(caractere.toLowerCase());
		}
		return codidoReduzido(codigo.toString());
	}

	private String[] codidoReduzido(String codigo) {
		String[] reduzido = new String[codigo.length()];
		int quantidade = 0;
		while (!codigo.isEmpty()) {
			String caractere = codigo.charAt(0) + "";
			codigo = codigo.replaceAll(caractere, "");
			reduzido[quantidade++] = caractere;
		}
		return Arrays.copyOfRange(reduzido, 0, quantidade);
	}

	private void validaCodigo(String codigo) {
		String[] reduzido = codidoReduzido(codigo);
		int quantidade = reduzido.length;
		int tamanho = personalizados.length;
		for (int i = 0; i < quantidade; i++) {
			int invalido = i;
			for (int j = 0; j < tamanho; j++) {
				if (reduzido[i].equals(personalizados[j])) {
					invalido = -1;
					break;
				}
			}
			if (invalido != -1) {
				throw new NumberFormatException(
						String.format(
								"caracter inválido: [%s]. Os caracteres válidos são: %s",
								reduzido[invalido], toString()));
			}
		}
	}

	@Override
	public String toString() {
		return Arrays.toString(personalizados);
	}

	public static void main(String[] args) {
		Codificacao codificacao = new Codificacao("E", "m", "p", "r", "e",
				"s", "a");
		Long numero = 1234567890L;
		System.out.println(numero);
		String codigo = codificacao.codifica(numero);
		System.out.println(codigo);
		numero = codificacao.descodifica(codigo);
		System.out.println(numero);
		codigo = codigo + "x";
		System.out.println(codigo);
		numero = codificacao.descodifica(codigo);
	}
}

3 Respostas

Rodrigo_Sasaki

Ué, não entendi qual a finalidade dessa criptografia. Você fez por lazer?

Alexandre_Saudate

Vamos começar do começo: nem criptografia isso é.

http://unknownantisec.wordpress.com/2011/10/03/a-diferenca-entre-codificacao-e-criptografia/

[]'s

marcelojunior

basicamente sim. Tirando o besteirou sobre IDs, este algoritmo poderia ser usado para codificar numeros de documentos antes de armazena-los no banco de dados. Usando caracteres q so vc conheceria :thumbup:

Vamos começar do começo: nem criptografia isso é.

http://unknownantisec.wordpress.com/2011/10/03/a-d...re-codificacao-e-criptografia/


Codificação: O objetivo não é manter em segredo as informações, mas sim garantir que o sistema interprete de outra forma os dados contidos na menssagem.
Criptografia: O objetivo é manter uma ?menssagem? em segredo e garantir que os dados não podem ser usados por qualquer pessoa que não seja o destinatário com a chave para a reverter a criptografia.
Dessa diferença eu não sabia, vlw fera!

Criado 14 de dezembro de 2012
Ultima resposta 14 de dez. de 2012
Respostas 3
Participantes 3