Я взломал это.
Я столкнулся с той же самой проблемой, с которой вы столкнулись, и только что потратил около 4 часов, чтобы выявить проблему и переопределить ее.
Проблема в том, что Bacula base64 сломана и ошибочна!
Есть две проблемы:
Во-первых, входящие байты обрабатываются как подписанные, а не как беззнаковые. Эффект этого состоит в том, что, если байт имеет самый высокий установленный бит (> 127), то он обрабатывается как отрицательное число; когда он объединен с «оставшимися» битами из предыдущих байтов, все они установлены в (двоичный 1).
Во-вторых, после того, как b64 обработал все полные 6-битные выходные блоки, может остаться 0, 2 или 4 бита (в зависимости от модуля входных блоков 3). Стандартный способ Base64 для этого - умножить оставшиеся биты, чтобы они были САМЫМИ ВЫСОКИМИ битами в последнем 6-битовом блоке, и обработать их - Bacula оставляет их как САМЫЕ НИЗКИЕ биты.
Обратите внимание, что в некоторых версиях Bacula для входящей аутентификации могут использоваться как "кодировка Bacula нарушенная base64", так и стандартные. кажется, они используют сломанный для своей аутентификации.
def bacula_broken_base64(binarystring):
b64_chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
remaining_bit_count=0
remaining_bits=0
output=""
for inputbyte in binarystring:
inputbyte=ord(inputbyte)
if inputbyte>127:
# REPRODUCING A BUG! set all the "remaining bits" to 1.
remaining_bits=(1 << remaining_bit_count) - 1
remaining_bits=(remaining_bits<<8)+inputbyte
remaining_bit_count+=8
while remaining_bit_count>=6:
# clean up:
remaining_bit_count-=6
new64=(remaining_bits>>remaining_bit_count) & 63 # 6 highest bits
output+=b64_chars[new64]
remaining_bits&=(1 << remaining_bit_count) - 1
if remaining_bit_count>0:
output+=b64_chars[remaining_bits]
return output
Я понимаю, что прошло 6 лет с тех пор, как вы спросили, но, возможно, кто-то найдет это полезным.