· 2 years ago · Feb 24, 2023, 10:30 PM
1import javax.crypto.*;
2import java.io.FileNotFoundException;
3import java.io.FileOutputStream;
4import java.io.IOException;
5import java.io.ObjectOutputStream;
6import java.security.*;
7import java.util.ArrayList;
8import java.util.Scanner;
9
10public class Usuario {
11
12 private String nombreUsuario;
13 private SecretKey claveSecreta; // Para cifrado SIM
14 private PublicKey clavePublica; // Para cifrado ASIM
15 private PrivateKey clavePrivada;// Para cifrado ASIM
16
17 // ==================== G&S
18
19 public String getNombreUsuario() {
20 return nombreUsuario;
21 }
22
23 public void setNombreUsuario(String nombreUsuario) {
24 this.nombreUsuario = nombreUsuario;
25 }
26
27 public SecretKey getClaveSecreta() {
28 return claveSecreta;
29 }
30
31 public void setClaveSecreta(SecretKey claveSecreta) {
32 this.claveSecreta = claveSecreta;
33 }
34
35 public PublicKey getClavePublica() {
36 return clavePublica;
37 }
38
39 public void setClavePublica(PublicKey clavePublica) {
40 this.clavePublica = clavePublica;
41 }
42
43 public PrivateKey getClavePrivada() {
44 return clavePrivada;
45 }
46
47 public void setClavePrivada(PrivateKey clavePrivada) {
48 this.clavePrivada = clavePrivada;
49 }
50
51 // ==================== TOSTRING
52
53 @Override
54 public String toString() {
55 return "Usuario{" +
56 "nombreUsuario='" + nombreUsuario + '\'' +
57 ", claveSecreta=" + claveSecreta +
58 ", clavePublica=" + clavePublica +
59 ", clavePrivada=" + clavePrivada +
60 '}';
61 }
62
63 // ==================== LOCALIZAR USUARIO
64
65 public Usuario localizarUsuario(String nombreUsuario, ArrayList<Usuario> listadoUsuarios) {
66
67 for (Usuario usuario : listadoUsuarios) {
68 if (usuario.getNombreUsuario().equals(nombreUsuario)) {
69 return usuario;
70 }
71 }
72 return null;
73 }
74
75 // ==================== CREAR USUARIO
76
77 public void agregarUsuario(Usuario usuario, ArrayList<Usuario> listadoUsuarios) {
78
79 Scanner sc = new Scanner(System.in);
80 String respuesta = "";
81
82 System.out.println("");
83 System.out.println("Introduce el nombre del usuario: ");
84 nombreUsuario = sc.nextLine();
85 usuario.setNombreUsuario(nombreUsuario);
86 listadoUsuarios.add(usuario);
87
88// if (usuario.getNombreUsuario().equals("nombreUsuario")) {
89// System.out.println("El usuario ya existe. ");
90// } else {
91// listadoUsuarios.add(usuario);
92// System.out.println("Usuario añadido correctamente. ");
93// }
94 }
95
96 // ==================== ELIMINAR USUARIO
97
98 public void eliminarUsuario(Usuario usuario, ArrayList<Usuario> listadoUsuarios) {
99
100 Scanner sc = new Scanner(System.in);
101 String usuarioAEliminar;
102
103 System.out.println("");
104 System.out.println("¿Qué usuario quieres eliminar? ");
105 usuarioAEliminar = sc.nextLine();
106 if (localizarUsuario(usuarioAEliminar, listadoUsuarios) != null) {
107 listadoUsuarios.remove(localizarUsuario(usuarioAEliminar, listadoUsuarios));
108 System.out.println("Usuario eliminado correctamente. ");
109 } else {
110 System.out.println("El usuario no existe. ");
111 }
112 System.out.println("Listado de usuarios: " + listadoUsuarios);
113 System.out.println("Lista actualizada.");
114 }
115
116 // ==================== LISTAR USUARIO
117
118 public void listarUsuarios(ArrayList<Usuario> listadoUsuarios) {
119 System.out.println("");
120 System.out.println("Listado de usuarios: " + listadoUsuarios);
121 }
122
123 // ==================== CIFRAR MENSAJE
124
125 public void cifrarMensaje(ArrayList listadoUsuarios) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException, IllegalBlockSizeException, BadPaddingException {
126
127 Scanner sc = new Scanner(System.in);
128 String opcionUsuario = "";
129 String mensajeAcifrar = "";
130 String algoritmoSIM = "AES"; // /CBC/PKCS5Padding
131 int longitudClaveSIM = 128;
132 String algoritmoASIM = "RSA"; // /ECB/PKCS1Padding
133 int longitudClaveASIM = 1024;
134 FileOutputStream objetoFOS = new FileOutputStream("mensajeCifrado.txt");
135 ObjectOutputStream objetoOOS = new ObjectOutputStream(objetoFOS);
136
137 System.out.println("Vas a cifrar un mensaje con una clave secreta. ");
138 System.out.println("¿Quieres usar una clave simétrica o asimétrica? ");
139 System.out.println("1 para clave simétrica. ");
140 System.out.println("2 para clave asimétrica. ");
141 opcionUsuario = sc.nextLine();
142
143 if (opcionUsuario.equals("1")) {
144 System.out.println("Escribe el mensaje a cifrar. ");
145 mensajeAcifrar = sc.nextLine();
146 // Generar clave SIM
147 KeyGenerator generadorClaveSIM = KeyGenerator.getInstance(algoritmoSIM);
148 generadorClaveSIM.init(longitudClaveSIM);
149 claveSecreta = generadorClaveSIM.generateKey();
150 // Encriptar mensaje con la clave generada
151 Cipher cifrador = Cipher.getInstance(algoritmoSIM);
152 cifrador.init(Cipher.ENCRYPT_MODE, claveSecreta);
153 byte[] mensajeCifrado = cifrador.doFinal(mensajeAcifrar.getBytes());
154
155 System.out.println("El mensaje cifrado es: " + mensajeCifrado);
156 System.out.println("====================================");
157 System.out.println("La clave secreta es: " + claveSecreta);
158 System.out.println("====================================");
159
160 objetoOOS.writeObject(mensajeCifrado);
161 objetoOOS.writeObject(claveSecreta); // Valorar si lo necesito
162 objetoOOS.close();
163 objetoFOS.close();
164 } else if (opcionUsuario.equals("2")) {
165 System.out.println("Escribe el mensaje a cifrar. ");
166 mensajeAcifrar = sc.nextLine();
167 // Generar clave ASIM
168 KeyPairGenerator poseedor = KeyPairGenerator.getInstance(algoritmoASIM);
169 poseedor.initialize(longitudClaveASIM);
170 KeyPair parClaves = poseedor.generateKeyPair();
171 clavePublica = parClaves.getPublic();
172 clavePrivada = parClaves.getPrivate();
173 System.out.println("");
174 // Encriptar mensaje con la clave generada
175 Cipher cifrador = Cipher.getInstance(algoritmoASIM);
176 cifrador.init(Cipher.ENCRYPT_MODE, clavePublica);
177 byte[] mensajeCifrado = cifrador.doFinal(mensajeAcifrar.getBytes());
178
179 System.out.println("El mensaje cifrado es: " + mensajeCifrado);
180 System.out.println("====================================");
181 System.out.println("La clave pública es: " + clavePublica);
182 System.out.println("La clave privada es: " + clavePrivada);
183 System.out.println("====================================");
184 } else {
185 System.out.println("Opción incorrecta. ");
186 }
187 }
188}
189
190==================================================
191
192import javax.crypto.BadPaddingException;
193import javax.crypto.IllegalBlockSizeException;
194import javax.crypto.NoSuchPaddingException;
195import java.io.IOException;
196import java.security.InvalidKeyException;
197import java.security.NoSuchAlgorithmException;
198import java.util.ArrayList;
199import java.util.Scanner;
200
201public class MainLlavero {
202
203// Clave pública, privada
204// Algoritmo simétrico y asimétrico
205// AES longitud 128 bits - SIM
206// RSA longitud 1024 bits - ASIM
207
208 public static void main(String[] args) throws NoSuchPaddingException, IllegalBlockSizeException, NoSuchAlgorithmException, IOException, BadPaddingException, InvalidKeyException {
209
210 Scanner sc = new Scanner(System.in);
211 int opcionUsuario;
212 ArrayList<Usuario> listadoUsuarios = new ArrayList<Usuario>();
213
214 System.out.println("");
215 System.out.println("=============================");
216 System.out.println("=== BIENVENIDO AL LLAVERO ===");
217 System.out.println("=============================");
218
219 do {
220 System.out.println("");
221 System.out.println("Elige una opción: ");
222 System.out.println("1. Agregar usuario");
223 System.out.println("2. Eliminar usuario");
224 System.out.println("3. Listar usuarios");
225 System.out.println("4. Cifrar mensaje"); // Crear clave, cifrar y guardar en fichero
226 System.out.println("5. Descifrar mensaje");
227 System.out.println("6. Salir");
228 System.out.println("");
229 opcionUsuario = sc.nextInt();
230 // ================= PROGRAMA
231
232 switch (opcionUsuario) {
233 case 1:
234 Usuario nuevoUsuario = new Usuario();
235 nuevoUsuario.agregarUsuario(nuevoUsuario, listadoUsuarios); // Llamar al método agregarUsuario
236 System.out.println("Listado de usuarios: " + listadoUsuarios);
237 break;
238 case 2:
239 Usuario usuarioAEliminar = new Usuario();
240 usuarioAEliminar.eliminarUsuario(usuarioAEliminar, listadoUsuarios); // Llamar al método eliminarUsuario
241 break;
242 case 3:
243 Usuario usuarioAListar = new Usuario();
244 usuarioAListar.listarUsuarios(listadoUsuarios);
245 break;
246 case 4:
247 Usuario usuarioACifrar = new Usuario();
248 usuarioACifrar.cifrarMensaje();
249 break;
250 case 5:
251 break;
252 case 6:
253 System.out.println("¡Hasta luego!");
254 break;
255 default:
256 System.out.println("Opción no válida");
257 }
258 } while (opcionUsuario != 6);
259 }
260}
261