首页 > 解决方案 > 相同输入的 boost sha1 和 openssl 库的不同输出

问题描述

我试图了解更多关于 boost 和 sha1 的信息。我写了下面的代码来测试输出。除了 boost,我还安装了 openssl 库。
我已经编写了下面的代码,并且我在 openssl 和 boost sha1 中获得了相同值的不同值。
输入字符串:“te99999”

std::string makeSHA1boostV1(const char text[])
    {
        boost::uuids::detail::sha1 sha1;
        unsigned int hash[5];
        sha1.process_bytes(text, sizeof(text)-1);
        sha1.get_digest(hash);
         std::ostringstream buf;
        std::cout << "Hash: ";
        for(std::size_t i=0; i<sizeof(hash)/sizeof(hash[0]); ++i) {
            std::cout <<"sha hash "<<hash[i]<<std::endl;
            std::cout << std::hex <<hash[i];
            buf << std::hex <<hash[i];
        }
        std::cout << std::endl;
        std::cout << "sha1  "<<buf.str()<<std::endl;
        return buf.str();
    }

Boost output :
Hash: sha hash 83008267
sha hex 4f29b0b
sha hash d107070c
sha hex d107070c
sha hash 753cedeb
sha hex 753cedeb
sha hash 2adb54bf
sha hex 2adb54bf
sha hash 6c0fdc93
sha hex 6c0fdc93

sha1 4f29b0bd107070c753cedeb2adb54bf6c0fdc93

我们还可以使用以下命令使用 openssl 库检查 sha1 的输出。
命令echo -n "te99999" | openssl sha1
openssl 输出:: (stdin)= 04f29b0bd107070c753cedeb2adb54bf6c0fdc93

boost sha1 中缺少前导零。
我无法理解为什么缺少0 。

标签: c++boostopenssl

解决方案


这不是 boost 的问题,而是您使用流的问题。

<<默认情况下,使用 will 打印数字会丢弃前导零。如果你不希望你需要指定:

buf << std::hex << std::setfill('0') << std::setw(sizeof(hash[i])*2) << hash[i];

等价于std::cout.


此外,您使用的指针错误。text是指向 的指针const char。因此sizeof(text)是指针类型的大小,而不是指向的数组的大小text。它碰巧在问题的示例中起作用,因为您的输入字符串(包括空终止符)的长度恰好是8,这是 64 位系统上指针的大小。

您可以使用 获取 C 样式以空字符结尾的字符串的长度std::strlen。(需要#include<cstring>

或者,更好的是,将 aconst std::string&而不是const char*作为text参数。它提供了获取字符串长度(没有空终止符).size().c_str()指向空终止 C 样式字符串的指针的方法。


另外:使用命名空间中指定的东西detail通常不是一个好主意。detail通常意味着它包含的内容是不打算由库用户使用的实现细节。


推荐阅读