Я ИСКЛЮЧАЛ ЭТО.
Я столкнулся с той же проблемой, что и вы, и провел около 4 часов, идентифицируя проблему и переопределяя ее.
Проблема в том, что основание Бакулы64 БРОКЕН, И НЕПРАВИЛЬНО!
Есть две проблемы, связанные с ним:
Первый является то, что входящие байты рассматриваются как знаковые, не без знака. Эффект от этого заключается в том, что если бит имеет наибольший бит (> 127), то он рассматривается как отрицательное число; когда он объединен с «оставшимися» битами из предыдущих байтов, все установлены в (двоичный 1).
Во-вторых, после того, как b64 обработал все полные 6-битные выходные блоки, может остаться 0, 2 или 4 бит (в зависимости от модуля входного блока 3). Стандартный способ Base64 для этого состоит в том, чтобы умножить оставшиеся биты, поэтому они являются ВЫСОКИМИ битами в последнем 6-битном блоке и обрабатывают их - Bacula оставляет их как LOWEST биты.
Обратите внимание, что некоторые версии Bacula могут принимать как «Bacula broken base64 encoding», так и стандартные для входной аутентификации; они, похоже, используют сломанный для их аутентификации.
def bacula_broken_base64(binarystring):
b64_chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"
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 лет с тех пор, как вы спросили, но, возможно, кто-то найдет это полезным.
Как ваше название, так и ваше сообщение, кажется, срезаны посередине. –