· 6 years ago · Sep 30, 2019, 02:06 AM
1/*
2 * To change this license header, choose License Headers in Project Properties.
3 * To change this template file, choose Tools | Templates
4 * and open the template in the editor.
5 */
6package encriptadoaes;
7
8import java.io.UnsupportedEncodingException;
9import java.security.InvalidKeyException;
10import java.security.MessageDigest;
11import java.security.NoSuchAlgorithmException;
12import java.util.Arrays;
13import java.util.Base64;
14import javax.crypto.BadPaddingException;
15import javax.crypto.Cipher;
16import javax.crypto.IllegalBlockSizeException;
17import javax.crypto.NoSuchPaddingException;
18import javax.crypto.spec.SecretKeySpec;
19
20/**
21 *
22 * @author david
23 */
24public class EncriptadorAES {
25
26 /**
27 * Crea la clave de encriptacion usada internamente
28 * @param clave Clave que se usara para encriptar
29 * @return Clave de encriptacion
30 * @throws UnsupportedEncodingException
31 * @throws NoSuchAlgorithmException
32 */
33 private SecretKeySpec crearClave(String clave) throws UnsupportedEncodingException, NoSuchAlgorithmException {
34 byte[] claveEncriptacion = clave.getBytes("UTF-8");
35
36 MessageDigest sha = MessageDigest.getInstance("SHA-1");
37
38 claveEncriptacion = sha.digest(claveEncriptacion);
39 claveEncriptacion = Arrays.copyOf(claveEncriptacion, 16);
40
41 SecretKeySpec secretKey = new SecretKeySpec(claveEncriptacion, "AES");
42
43 return secretKey;
44 }
45
46 /**
47 * Aplica la encriptacion AES a la cadena de texto usando la clave indicada
48 * @param datos Cadena a encriptar
49 * @param claveSecreta Clave para encriptar
50 * @return Información encriptada
51 * @throws UnsupportedEncodingException
52 * @throws NoSuchAlgorithmException
53 * @throws InvalidKeyException
54 * @throws NoSuchPaddingException
55 * @throws IllegalBlockSizeException
56 * @throws BadPaddingException
57 */
58 public String encriptar(String datos, String claveSecreta) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
59 SecretKeySpec secretKey = this.crearClave(claveSecreta);
60
61 Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
62 cipher.init(Cipher.ENCRYPT_MODE, secretKey);
63
64 byte[] datosEncriptar = datos.getBytes("UTF-8");
65 byte[] bytesEncriptados = cipher.doFinal(datosEncriptar);
66 String encriptado = Base64.getEncoder().encodeToString(bytesEncriptados);
67
68 return encriptado;
69 }
70
71 /**
72 * Desencripta la cadena de texto indicada usando la clave de encriptacion
73 * @param datosEncriptados Datos encriptados
74 * @param claveSecreta Clave de encriptacion
75 * @return Informacion desencriptada
76 * @throws UnsupportedEncodingException
77 * @throws NoSuchAlgorithmException
78 * @throws InvalidKeyException
79 * @throws NoSuchPaddingException
80 * @throws IllegalBlockSizeException
81 * @throws BadPaddingException
82 */
83 public String desencriptar(String datosEncriptados, String claveSecreta) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
84 SecretKeySpec secretKey = this.crearClave(claveSecreta);
85
86 Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
87 cipher.init(Cipher.DECRYPT_MODE, secretKey);
88
89 byte[] bytesEncriptados = Base64.getDecoder().decode(datosEncriptados);
90 byte[] datosDesencriptados = cipher.doFinal(bytesEncriptados);
91 String datos = new String(datosDesencriptados);
92
93 return datos;
94 }
95}