1.1. Base64
Base64 es un método de codificación aplicado a datos binarios para representar la información obtenida en una cadena de caracteres en código ASCII. Esto es, la información binaria se lee en grupos de bits y cada grupo se traduce en su representacion ASCII-Base64.
Se usa principalmente para enviar información sobre medios que estan hechos para lidiar con texto y no con información binaria.
Este procesamiento de datos es usado por Solución Factible® para asegurar su inalterabildiad cuando ésta sea recibida por nuestros servidores, por lo tanto, la información que el desarrollador o el sistema genere como output será exactamente la misma que se recibirá como input en nuestro sistema para su posterior manipulación.
Este tipo de codificación se usa en el elemento sello de los CFD's (comprobantes fiscales digitales como factura electronica, comprobantes de pago...) el cual será descrito con más detalle a continuación.
1.1.1. Encoding
Si tomamos la cadena de caracteres (String):
Al codificarlo en base64 el resultado es:
Las letras "Hol" de la frase codificada anteriormente equivalen a la codificación en base 64: "SG9s", el proceso para la conversión se detalla en la tabla a continuación.
Texto | H | o | l | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ASCII | 72 | 6F | 6C | |||||||||||||||||||||
Patron de bites | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 |
Index | 18 | 6 | 61 | 44 | ||||||||||||||||||||
Codificación-Base64 | S | G | 9 | s |
Tabla index base64
Value | Char | Value | Char | Value | Char | Value | Char | |||
---|---|---|---|---|---|---|---|---|---|---|
0 | A |
16 | Q |
32 | g |
48 | w |
|||
1 | B |
17 | R |
33 | h |
49 | x |
|||
2 | C |
18 | S |
34 | i |
50 | y |
|||
3 | D |
19 | T |
35 | j |
51 | z |
|||
4 | E |
20 | U |
36 | k |
52 | 0 |
|||
5 | F |
21 | V |
37 | l |
53 | 1 |
|||
6 | G |
22 | W |
38 | m |
54 | 2 |
|||
7 | H |
23 | X |
39 | n |
55 | 3 |
|||
8 | I |
24 | Y |
40 | o |
56 | 4 |
|||
9 | J |
25 | Z |
41 | p |
57 | 5 |
|||
10 | K |
26 | a |
42 | q |
58 | 6 |
|||
11 | L |
27 | b |
43 | r |
59 | 7 |
|||
12 | M |
28 | c |
44 | s |
60 | 8 |
|||
13 | N |
29 | d |
45 | t |
61 | 9 |
|||
14 | O |
30 | e |
46 | u |
62 | + |
|||
15 | P |
31 | f |
47 | v |
63 | / |
1.1.2. Decoding
Para decodificar la información se debe usar un proceso especial. Primero, se agrupa cada 4 caracteres codificados en base64 y se realinean como 3 bytes. Sin embargo, hay 2 casos que tienen que ser considerados al final del conjunto de bytes. Si los últimos caracteres de la cadena codificada en base64 se encuentran 1 o 2 caracteres '=' ó '=='. Si se encuentra un '=' entonces se debe desechar el último byte que se viene arrastrando. Si se encuentran '==' al final de la cadena, entonces, se deben desechar los 2 últimos bytes de la secuencia.
Otro proceso importante que se tiene que hacer es ignorar todo caracter de la cadena que no sea un caracter base64 válido.
1.1.3. Ejemplos de Código
JAVA
import org.bouncycastle.util.encoders.Base64; public class Main{ public static void main(String[] args) { if (args.length > 0) { for (int i = 0; i < args.length; i++) { if (args[i].equals("-e") || args[i].equals("--encode")) { String toEncode = args[i + 1] != null && args[i + 1].length() > 0 ? args[i + 1] : ""; toEncode = new String(toEncode.getBytes()); byte[] data = Base64.encode(toEncode.getBytes()); String encoded = new String(data); System.out.println("Resultado de la codificación: " + encoded); } else if (args[i].equals("-d") || args[i].equals("--decode")) { String toDecode = args[i + 1] != null && args[i + 1].length() > 0 ? args[i + 1] : ""; byte[] data = Base64.decode(toDecode.getBytes()); String decoded = new String(data); System.out.println("Resultado de la decodificación: " + decoded); } } }else{ System.out.println("Nada que hacer... finalizando programa..."); } } }
1.1.4. Herramientas
Codificar
Descripción: Codifica un mensaje en base64.
Decodificar
Descripción:Decodifica un mensaje base64.