Невозможно декодировать base64 + дефлировать данные - PullRequest
0 голосов
/ 30 октября 2018

Я потерял декодирование следующей строки base64

nVJPb4IwFL/7KUjvAgUM8CIuZiabicsSNR68deXhWKBteGVx336FbJnz4MG+U997/f1L5yTaxsBGn3Rvt0hGK0LPO7eNIhhnBes7BVpQTaBEiwRWwm75soHID8F02mqpGzZZrwpGScZjkUgpMolpFCfRLH/DPKlmaZXGMkqrMq/CMi6Zd8COaq0K5lCYtybqca3ICmVdK+TZlIfTONxzDtEMeHZk3grJ1krY8dW7tQaCgEepH7rikLoTEHaf2AWNPtXqodUlFonDVr++9rpgH1jq82BsusT8eWPa1yd9RLHdf7HFZD4MYBTTXWRwOwJBjnZQxRaDKnKy6tL4RFrWnWzQl7qdBxfIPzwGdlbYnu4I+wrh0Tm9A8U7iKbH28s0EsCulxKJBuLgmvm693f//6sW3w==

Это должны быть действительные данные base64, представляющие данные дефляции исходного XML. Когда я пробую онлайн-декодер здесь: https://www.samltool.com/decode.php, он дает мне правильный XML.

Я делаю эти два шага:

string text = MyClass::decode_base64(input);
text = MyClass::stringDeflateDecode(text);

Сначала я декодирую строку base64:

string MyClass::decode_base64(string str)
{
    using namespace boost::archive::iterators;
    typedef transform_width<binary_from_base64<remove_whitespace<string::const_iterator> >, 8, 6> ItBinaryT;
    try {
        boost::erase_all(str, "\r");
        boost::erase_all(str, "\n");
        // If the input isn't a multiple of 4, pad with =
        size_t num_pad_chars((4 - str.size() % 4) % 4);
        str.append(num_pad_chars, '=');
        size_t pad_chars(std::count(str.begin(), str.end(), '='));
        std::replace(str.begin(), str.end(), '=', 'A'); // replace '=' by base64 encoding of '\0'
        string output(ItBinaryT(str.begin()), ItBinaryT(str.end()));
        output.erase(output.end() - pad_chars, output.end());
        return output;
    } catch (...) {
        return string("");
    }
}

Код в основном отсюда. Декодирование строки Base64 с использованием Boost , и он работал нормально для декодирования только текста text64 base64 (без двоичных данных с дефляцией).

Тогда я бы хотел расшифровать дефлат:

string MyClass::stringDeflateDecode(const std::string& data)
{
    stringstream compressed(data);
    stringstream decompressed;

    boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
    in.push(boost::iostreams::zlib_decompressor());
    in.push(compressed);
    boost::iostreams::copy(in, decompressed);

    return decompressed.str();
}

но :: операция копирования выдает исключение: ошибка zlib: ошибка iostream

Спасибо за любые подсказки!

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

То есть в кодировке Base-64 raw deflate. Это означает сжатые данные в формате deflate, но нет обертки zlib или gzip для этих данных deflate. Похоже, у zlib_decompressor есть опция noheader, которую вы должны установить на true.

0 голосов
/ 30 октября 2018

Википедия указывает:

Запросы или ответы SAML, передаваемые через HTTP Redirect, имеют параметр строки запроса SAMLRequest или SAMLResponse, соответственно. Перед отправкой сообщение дефлируется (без заголовка и контрольной суммы), кодируется base64 и URL-адресом в указанном порядке. После получения процесс восстанавливается, чтобы восстановить исходное сообщение.

Проблема здесь заключается в отсутствии заголовка и контрольной суммы. Я не думаю, что у Boost есть нужные вам библиотечные функции.

...