无法解码 base64+deflate 数据

Cannot decode base64+deflate data

我迷失了解码以下 base64 字符串

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

它应该是代表原始 XML 的压缩数据的有效 base64 数据。当我在这里尝试在线解码器时: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 '[=12=]'
        string output(ItBinaryT(str.begin()), ItBinaryT(str.end()));
        output.erase(output.end() - pad_chars, output.end());
        return output;
    } catch (...) {
        return string("");
    }
}

代码基本上来自这里,它对纯文本 base64 解码(没有二进制压缩数据)工作正常。

那我要解码deflate:

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();
}

但是::copy操作抛出异常:zlib错误:iostream错误

感谢任何提示!

维基百科指定:

SAML requests or responses transmitted via HTTP Redirect have a SAMLRequest or SAMLResponse query string parameter, respectively. Before it's sent, the message is deflated (without header and checksum), base64-encoded, and URL-encoded, in that order. Upon receipt, the process is reversed to recover the original message.

这里的问题是缺少 header 和校验和。我认为boost没有你需要的库函数。

这是 Base-64 编码的 raw 压缩数据。这意味着以 deflate 格式压缩数据,但没有围绕该 deflate 数据的 zlib 或 gzip 包装器。看起来 zlib_decompressor 有一个 noheader 选项,您应该将其设置为 true