· 5 years ago · May 06, 2020, 02:24 AM
1import java.security.*; //API que proporcionan facilidades criptográficas en Java
2import javax.crypto.*; // API para encriptación y desencriptación
3
4public class PrivateExample
5{
6 public static void main (String[] args) throws Exception
7 {
8 // Se valida el argumento del texto a cifrar
9 if (args.length !=1)
10 {
11 System.exit(1);
12 }
13 System.out.println( "El argumento original de la linea de comandos es:" + args[0] );
14 // Creamos el string con el parámetro UTF8 porque algunos caracteres del resumen
15 // no se muestran de manera correcta al salir por pantalla.
16 // El string se pasa a un arreglo de bytes de nuestro texto original
17 byte[] textoPlano = args[0].getBytes("UTF8");
18 System.out.println( "El argumento de la linea de comandos pasado a bytes y a bits es:" );
19 // El método bytestoBits() imprimirá cada carecter en su valor ascii y en bits.
20 // Al final hace una concatenacón de los bits de cada caracter y los muestra en pantalla.
21 bytesToBits( textoPlano );
22 System.out.println( "La longitud es:" + textoPlano.length);
23 System.out.println( "----------------------------------------------------" );
24 System.out.println( "Generando la llave..." );
25 // Se crea un generador de claves con el algoritmo DES
26 KeyGenerator keyGen = KeyGenerator.getInstance("DES");
27 // Inicializamos el cifrador
28 keyGen.init(56);
29 // A partir del generador obtenemos una clave
30 Key clave = keyGen.generateKey();
31 System.out.println(clave);
32
33 // Creación de una segunda clave
34 KeyGenerator keyGen2 = KeyGenerator.getInstance("DES");
35 keyGen2.init(56);
36 Key clave2 = keyGen2.generateKey();
37 System.out.println(clave2);
38
39 // Una vez que tenemos la clave, la encriptación se hace creando
40 // un cifrador especificando el algoritmo, modo y padding.
41 Cipher cifrar = Cipher.getInstance("DES/ECB/PKCS5Padding");
42
43 // Inicializamos el cifrador con la clave1
44 cifrar.init(Cipher.ENCRYPT_MODE, clave);
45 // Finalmente se realiza la encriptación de los datos.
46 byte[] cipherText = cifrar.doFinal(textoPlano);
47 System.out.println( "El argumento ENCRIPTADO es:" );
48 // Se imprime el texto cifrado
49 System.out.println( new String(cipherText, "UTF8") );
50 System.out.println( "El argumento ENCRIPTADO pasado a bytes y a bits es:" );
51 bytesToBits( cipherText );
52 System.out.println( "La longitud es:" + cipherText.length);
53 System.out.println( "----------------------------------------------------" );
54 // Aqui se desencripta el mensaje
55 cifrar.init(Cipher.DECRYPT_MODE, clave);
56 byte[] newPlainText = cifrar.doFinal(cipherText);
57 System.out.println( "El argumento DESENCRIPTADO es:" );
58 System.out.println( new String(newPlainText, "UTF8") );
59 System.out.println( "El argumento DESENCRIPTADO pasado a bytes y a bits es:" );
60 bytesToBits( newPlainText );
61 }
62
63 public static void bytesToBits( byte[] texto )
64 {
65 StringBuilder stringToBits = new StringBuilder();
66 for( int i=0; i < texto.length; i++ )
67 {
68 StringBuilder binary = new StringBuilder();
69 byte b = texto[i];
70 int val = b;
71 for( int j = 0; j < 8; j++ )
72 {
73 binary.append( (val & 128) == 0 ? 0 : 1 );
74 val <<= 1;
75 }
76 System.out.println( (char)b + " \t " + b + " \t " + binary );
77 stringToBits.append( binary );
78 }
79 System.out.println( "El mensaje completo en bits es:" + stringToBits );
80 }
81}