/**
   * Encripta una cadena de texto y la devuelve en otra
   *
   * @param cadena
   * @return String
   */
  public String encripta(String cadena) {
    String encriptado = null;
    try {
      byte[] raw = StringToHex(aesKey.getEncoded());
      SecretKeySpec skeySpec = new SecretKeySpec(raw, ALGORITMO);
      Cipher cipher = Cipher.getInstance(ALGORITMO);
      cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
      byte[] encrypted = cipher.doFinal(cadena.getBytes(CODIFICACION));
      encriptado = HexToString(encrypted);

    } catch (IllegalBlockSizeException ex) {
      error(ex);
    } catch (BadPaddingException ex) {
      error(ex);
    } catch (UnsupportedEncodingException ex) {
      error(ex);
    } catch (InvalidKeyException ex) {
      error(ex);
    } catch (NoSuchAlgorithmException ex) {
      error(ex);
    } catch (NoSuchPaddingException ex) {
      error(ex);
    }
    return encriptado;
  }
  /**
   * Este metodo genera una llave para el cifrado simetrico
   *
   * @return {@link AESKey} , llave generada.
   */
  public AESKey generaKey() {
    KeyGenerator kgen = null;
    try {
      kgen = KeyGenerator.getInstance(ALGORITMO);
    } catch (NoSuchAlgorithmException ex) {
      error(ex);
    }

    kgen.init(LONGITUD);
    SecretKey skey = kgen.generateKey();
    aesKey = new AESKey();
    aesKey.setEncoded(HexToString(skey.getEncoded()));
    return aesKey;
  }
  /**
   * @param encriptado
   * @return String Este descifra una cadena de texto, siempre que no se haya renovado el objeto, ya
   *     que de lo contrario la llave cambiaría y no seria posible descifrar.
   */
  public String desencriptar(String encriptado) {
    String originalString = null;
    try {
      byte[] raw = StringToHex(aesKey.getEncoded());
      SecretKeySpec skeySpec = new SecretKeySpec(raw, ALGORITMO);
      Cipher cipher = Cipher.getInstance(ALGORITMO);
      cipher.init(Cipher.DECRYPT_MODE, skeySpec);
      byte[] original = cipher.doFinal(StringToHex(encriptado));
      originalString = new String(original);

    } catch (IllegalBlockSizeException ex) {
      error(ex);
    } catch (BadPaddingException ex) {
      error(ex);
    } catch (InvalidKeyException ex) {
      error(ex);
    } catch (NoSuchAlgorithmException ex) {
      error(ex);
    } catch (NoSuchPaddingException ex) {
      error(ex);
    }
    return originalString;
  }