Red de conocimiento del abogados - Ley de patentes - Principio e implementación del algoritmo Base64

Principio e implementación del algoritmo Base64

El algoritmo Base64 se utilizó originalmente para resolver problemas de transmisión de datos de correo electrónico. Al principio, por razones históricas, a los correos electrónicos solo se les permitía usar caracteres ASCII. Si aparecían caracteres que no eran ASCII en el correo electrónico, la puerta de enlace hacía ajustes a estos caracteres no ASCII cuando los datos se reenviaban a través de algunas puertas de enlace. Por ejemplo, establezca la posición más alta del código binario de 8 bits del código ASCII en 0. En este momento, el destinatario tendrá caracteres confusos al recibir el correo electrónico. Por esta razón se desarrolló el algoritmo Base64.

Para decirlo sin rodeos, la idea de la codificación Base64 es asignar cada byte de los datos transmitidos a ciertos caracteres en la tabla de códigos ASCII, de modo que no haya caracteres confusos durante el proceso de transmisión. El algoritmo Base64 define una tabla de mapeo como se muestra a continuación.

Como se puede ver en la tabla anterior, la razón por la que se llama codificación Base64 es en realidad para asignar los datos originales a 64 caracteres en la tabla de códigos ASCII. Sin embargo, el número máximo de bits que se pueden asignar a 64 caracteres es 6 bits. Pero cada dato es de 8 bits, entonces, ¿cómo convertirlo? La idea básica de la codificación Base64: dividir los datos originales en un grupo cada 3 bytes (24 bits) y luego volver a dividir los datos de 24 bits en 4 grupos de acuerdo con cada grupo de 6 bits. Una vez completada la agrupación, cada dato de 6 bits se divide. dividido en unidades. Haz el mapeo.

El proceso básico de codificación Base64 es el siguiente:

Por ejemplo, el proceso de codificación Base64 de la cadena "ABC" es el siguiente.

Por lo tanto, los datos codificados en Base64 de la cadena "ABC" son "QUJD".

Desde el principio de codificación Base64, podemos ver que Base64 en realidad convierte cada grupo de 3 bytes en los datos originales a codificación Base64 y luego los codifica en 4 caracteres Base64. Pero, ¿qué debemos hacer si la longitud de los datos originales no es un múltiplo entero de 3? El algoritmo Base64 estipula que si los datos a cifrar no son un múltiplo entero de 3, se agregará 0 después de los datos originales hasta que la longitud sea un múltiplo entero de 3, y luego se realizará la conversión de codificación Base64. Una vez completada la conversión de codificación, agregue el mismo número de "=" al final del resultado.

Por ejemplo, el proceso de codificación Base64 de la cadena "ABCD" es el siguiente.

Por lo tanto, la cadena "ABC" codificada en Base64 es "QUJDRA==".

De hecho, hay una regla aquí. Cuando la longitud de los datos originales se divide por 3 y el resto es 0, no hay "=" después de la codificación; cuando el resto es 1, hay dos "; =" después. Cuando el resto Cuando es 2, hay un "=" después, y el número de "=" es el número de bytes que se complementarán.

A través del principio de Base64, podemos ver que la codificación Base64 en realidad asigna 3 bytes de los datos originales a 4 bytes, por lo que en comparación con la longitud de los datos originales, la longitud codificada aumentará 1/3. Esto también reduce la eficiencia de la transmisión.

El método Get y el método Post son dos métodos comúnmente utilizados para solicitudes HTTP. En algunos casos, se requiere el método Get para transferir datos binarios. En este momento, primero puede convertir los datos binarios en datos de cadena mediante la codificación Base64. Dado que los símbolos "+" y "/" no pueden aparecer en la URL, se produjo el algoritmo Base64 seguro para URL. El llamado algoritmo Base64 seguro para URL en realidad incluye principalmente dos aspectos.

Actualmente, en Java, podemos utilizar el algoritmo Base64 de las siguientes maneras.

Antes de Java8, no había un algoritmo Base64 integrado en la biblioteca oficial JDK. De hecho, la implementación de Base64 es muy simple. Pero Java8 tiene un codificador y decodificador Base64 integrado.

En Java8, la clase de herramienta Base64 proporciona tres códecs BASE64:

1. Codificación básica Base64

Es decir, el mapeo está completamente de acuerdo con el estándar Base64 Codifica y decodifica según las reglas sin agregar ningún marcador de línea.

2. Codificación de URL Base64

La codificación de URL Base64 en la biblioteca de clases estándar JDK usa "-" y "_" en lugar de "+" y "/"

3.Codificación MIME Base64

La biblioteca de clases Java también proporciona una codificación Base64 con un formato más amigable. Esta codificación genera no más de 76 caracteres por línea y usa '\r' seguido de '\. n' como dividido.

4. Base64 sin relleno

En la biblioteca de clases estándar de Java, también hay una manera de eliminar el "=" al final de la codificación, que es llamarlo después de construir el objeto Encoder sin el método Padding(), por ejemplo:

Commons Codec es una biblioteca de clases de software de código abierto proporcionada por Apache para desarrolladores de Java. Esta biblioteca de clases contiene principalmente algunos paquetes de herramientas de codificación de uso común, como. DES, SHA1 y MD5, Base64, URL, etc. Antes de usar esta biblioteca de clases, primero debe agregar dependencias en Eclipse. Commons Codec proporciona los siguientes métodos de codificación Base64.

1. Codificación básica Base64

El método de codificación Base64 proporcionado por Commons Codec y la biblioteca de clases estándar de Java es el mismo.

2. Codificación de URL Base64

La codificación de URL Base64 es la misma que la de la biblioteca de clases Java. Reemplace "+" y "/" con "-" y "_", y ahí. Una diferencia es que Url Base64 en Commons Codec elimina el siguiente "=" de forma predeterminada, lo que equivale a llamar al método withoutPadding en la biblioteca de clases de Java, por ejemplo:

3. Salida en formato similar a MIME

Commons Codec también proporciona resultados formateados similares a MIME en la biblioteca de clases de Java. Hay un método en Commons Codec:

Aquí isChunked está configurado en verdadero, lo que significa que está en MIME. formato.

h