All Downloads are FREE. Search and download functionalities are using the official Maven repository.

es.gob.afirma.standalone.crypto.DesCipher Maven / Gradle / Ivy

There is a newer version: 1.8.2
Show newest version
package es.gob.afirma.standalone.crypto;

import java.security.GeneralSecurityException;
import java.security.InvalidKeyException;
import java.util.Arrays;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

/** Cifrador DES. */
public final class DesCipher {

	private DesCipher() {
		// No permitimos la instanciacion
	}

	/** Padding requerido para el cifrado. */
	private static final int PADDING_LENGTH = 8;

	/** Cifra datos con un algoritmo DES (ECB sin relleno). Antes de cifrar los datos se les añade
	 * un relleno independiente del cifrado, fácilmente eliminable cuando los datos de entrada
	 * con Base64.
	 * @param data Datos que se desean cifrar.
	 * @param sk Contraseña para generar la clave secreta.
	 * @return Resultado del proceso de cifrado.
	 * @throws InvalidKeyException Cuando La clave no es valida para el algoritmo DES.
	 * @throws GeneralSecurityException Cuando los datos introducidos no son validos o se produce un error en la operación. */
	public static byte[] cipher(final byte[] data, final byte[] sk) throws InvalidKeyException, GeneralSecurityException {
		final Cipher desCipher;
		try {
			desCipher = Cipher.getInstance("DES/ECB/NoPadding"); //$NON-NLS-1$
		}
		catch (final Exception e) {
			// Este caso no deberia ocurrir nunca
			throw new GeneralSecurityException("Algoritmo o formato no soportado por la maquina virtual: " + e); //$NON-NLS-1$
		}
		desCipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sk, "DES")); //$NON-NLS-1$
		return desCipher.doFinal(padding(data, 8));
	}

	/** Descifra datos con un algoritmo DES (ECB sin relleno).
	 * @param data Datos que se desean cifrar.
	 * @param sk Contraseña para generar la clave secreta.
	 * @return Resultado del proceso de descifrado.
	 * @throws InvalidKeyException Cuando La clave no es valida para el algoritmo DES.
	 * @throws GeneralSecurityException Cuando los datos introducidos no son validos o se produce un error en la operación. */
	public static byte[] decipher(final byte[] data, final byte[] sk) throws InvalidKeyException, GeneralSecurityException {
		final Cipher desCipher;
		try {
			desCipher = Cipher.getInstance("DES/ECB/NoPadding"); //$NON-NLS-1$
		}
		catch (final Exception e) {
			// Este caso no deberia ocurrir nunca
			throw new GeneralSecurityException("Algoritmo o formato no soportado por la maquina virtual: " + e); //$NON-NLS-1$
		}
		desCipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(sk, "DES")); //$NON-NLS-1$
		return desCipher.doFinal(data);
	}

	/** Rellena un array de bytes, si es necesario, para que sea múltiplo de la cantidad indicada.
	 * @param data Datos de entrada
	 * @param padding M´ltiplo
	 * @return Datos con el relleno añadido */
	private static byte[] padding(final byte[] data, final int padding) {
		if (data.length % padding == 0) {
			return data;
		}
		return Arrays.copyOf(data, (data.length / padding + 1) * padding);
	}

	/** Recupera la longitud del relleno requerido para el cifrado. Esto es, de que número deber se
	 * múltiplo la longitud de los datos.
	 * @return Longitud del relleno. */
	public static int getPaddingLength() {
		return DesCipher.PADDING_LENGTH;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy