B0 es la clave elegida por el diseñador, podría haber elegido cualquier otra.
Para veas como fue:
Lo primero fue contar los elementos en gProtectString3 y ver que eran los mismos más uno que el tamaño de la cadena que hay en el comentario, muemu.pl. Sabiendo esto podía decir que el los bytes eran la cadena codificada y B0 tenía que ser la codificación a '\0', que es 0 (o 00 si se miran los dos nibbles).
Después me fijé si había repeticiones: m y u se repiten y tienen los mismos bytes codificados, por tanto la codificación es byte a byte y no tiene en cuenta los demás como hace base64.
Tenía que encontrar ahora como se transformaba 0 a B0. Así que busqué una tabla ASCII en Google, ahora sabiendo como era cada carácter en esa notación podría sacar la fórmula usada para la conversión.
Cotejando el byte codificado y el de la tabla me di cuenta que solo cambiaba el nibble de más peso, el otro permanecía igual, por lo que solo debía concentrarme en ese.
A lo fácil. Probé de sumar B al primer nibble, pero no daba el resultado esperado. Así que probé sumar 5 al nibble codificado para ver si me llevaba al nibble del carácter original, tampoco.
Visto que no llegaba a ningún sitio transcribí tanto los nibbles de los caracteres como los bytes codificados a binario y los puse lado a lado y esta es la tabla que conseguí (sólo nibble de más peso):
CAR ASCII CODIFICADO
m : 6 (0110) D (1101)
u : 7 (0111) C (1100)
e : 6 (0110) D (1101)
. : 2 (0010) 9 (1001)
p : 7 (0111) C (1100)
l : 6 (0110) D (1101)
'\0': 0 (0000) B (1011)
Un rápido vistazo se puede ver que el primer bit, el tercero y el cuarto se invierten mientras que el segundo sigue igual. La operación que hacer que un bit varíe, dentro de un grupo, es el XOR, y para que varíe el primer, el tercero y el cuarto debe el número a aplicar es el 1011 en binario o B en hexadecimal. Como el nibble de menos peso no varía se lleva XOR a 0 para ése, así que el byte entero a aplicar para la operación a todo el caracter codificado es B0.