Como se mencionó anteriormente, Base64, no es un cifrado sino una codificación. Como puede ver en el RFC que especificó el estándar, la base64 funciona de la siguiente manera.
- Tienes un flujo de caracteres s, de longitud n.
- Leyó 3 valores de 8 bits del flujo (ahora tiene un total de 24 bits = 3 bytes)
- Rompe estos 24 bits en 4 grupos de 6 bits cada uno
- Usando la tabla del alfabeto Base 64, codificas cada uno de los grupos de 6 bits al equivalente de Base64
Ahora, existe la posibilidad de que llegue al final del flujo y no tenga un grupo de 24 bits (s mod 6! = 0). Si esto sucede, agrega ceros al final de la entrada, hasta que tenga un número integral de grupos de 6 bits.
Dado que su flujo de entrada está codificado en ASCII, por lo que está compuesto de caracteres de 8 bits, solo hay dos casos en los que termina en el escenario anterior.
1) Tienes 8 bits en el último grupo
2) Tienes 16 bits en el último grupo
En el primer caso, se agregan 4 ceros (que le dan 12 bits) y la salida serían dos caracteres (2 * 6 bits = 12 bits) codificados según el alfabeto, y dos "=" caracteres de relleno
En el segundo caso, se agregarían 2 ceros (lo que da un total de 18 bits) y la salida sería de tres caracteres (3 * 6 bits = 18 bits) y un "=" carácter de relleno.
Así es como a veces terminas con uno, dos o no "=" al final del texto codificado. Para obtener más información, realmente debería leer el RFC que definió ese estándar y la entrada de wikipedia relacionada.