无法解码base64+deflate数据



我无法解码以下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 ''
string output(ItBinaryT(str.begin()), ItBinaryT(str.end()));
output.erase(output.end() - pad_chars, output.end());
return output;
} catch (...) {
return string("");
}
}

代码基本上就是从这里开始的,使用Boost解码Base64字符串,它在纯文本的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错误

谢谢你的提示!

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

维基百科指定:

通过HTTP重定向传输的SAML请求或响应分别具有SAMLRequest或SAMLResponse查询字符串参数。在发送之前,消息将按顺序进行放气(不包含标头和校验和(、base64编码和URL编码。收到消息后,将反转该过程以恢复原始消息。

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

最新更新