 <blockquote> <pre><code>CryptoPP::Base64Decoder decoder; decoder.Put((byte*)nonce.data(), nonce.size()); std::vector&lt;uint8_t&gt; bytes(decoder.MaxRetrievable(),0); decoder.Get(&amp;bytes[0],bytes.size()); </code></pre> </blockquote> <p>Call <code>MessageEnd</code>:</p> <pre class="lang-cxx prettyprint-override"><code>Base64Decoder decoder; decoder.Put((byte*)nonce.data(), nonce.size()); decoder.MessageEnd(); vector&lt;uint8_t&gt; bytes(decoder.MaxRetrievable(),0); decoder.Get(&amp;bytes[0],bytes.size()); </code></pre> <p>Ditto:</p> <pre class="lang-cxx prettyprint-override"><code>Base64Encoder encoder; encoder.Put(digest, 20); encoder.MessageEnd(); string hash64(encoder.MaxRetrievable(), 0); encoder.Get((byte*)hash64.data(), hash64.size()); </code></pre> <p>Also see <a href="http://www.cryptopp.com/wiki/Base64Encoder#Missing_Data" rel="nofollow">Base64Encoder | Missing Data</a> and <a href="http://www.cryptopp.com/wiki/Base64Decoder#Missing_Data" rel="nofollow">Base64Decoder | Missing Data</a> on the Crypto++ wiki.</p> <hr> <blockquote> <p>Nor indeed can I duplicate the result using any other approaches, like a full C# test bed using all of the .NET crypto resources.</p> </blockquote> <p>I don't know C# as well as Crypto++, so I can't help with a C# example that works as expected with ONVIF authentication.</p> <hr> <p>Here's the result I get:</p> <pre class="lang-none prettyprint-override"><code>$ g++ test.cxx -I. ./libcryptopp.a -o test.exe $ ./test.exe tuOSpGlFlIXsozq4HFNeeGeFLEI= </code></pre> <p>And the <code>cat test.cxx</code>:</p> <pre class="lang-cxx prettyprint-override"><code>#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; #include "base64.h" #include "sha.h" std::string nonce = "LKqI6G/AikKCQrN0zqZFlg=="; std::string dt = "2010-09-16T07:50:45Z"; std::string pwd = "userpassword"; int main(int argc, char* argv[]) { CryptoPP::Base64Decoder decoder; decoder.Put((byte*)nonce.data(), nonce.size()); decoder.MessageEnd(); std::vector&lt;uint8_t&gt; bytes(decoder.MaxRetrievable(),0); decoder.Get(&amp;bytes[0],bytes.size()); CryptoPP::SHA1 hash; byte digest[CryptoPP::SHA1::DIGESTSIZE]; hash.Update(bytes.data(), bytes.size()); hash.Update((const byte*)dt.c_str(), dt.size()); hash.Update((const byte*)pwd.c_str(), pwd.size()); hash.Final(digest); CryptoPP::Base64Encoder encoder; encoder.Put(digest, 20); encoder.MessageEnd(); std::string hash64(encoder.MaxRetrievable(), 0); encoder.Get((byte*)hash64.data(), hash64.size()); std::cout &lt;&lt; hash64 &lt;&lt; std::endl; return 0; } </code></pre>