繁体   English   中英

相同输入的 boost sha1 和 openssl 库的不同输出

[英]Different output for boost sha1 and openssl library for same input

我试图了解有关 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();
    }

升压输出
哈希: sha 哈希 83008267
沙六角4f29b0b
沙哈希d107070c
sha hex d107070c
沙哈希753cedeb
sha hex 753cedeb
沙哈希2adb54bf
sha hex 2adb54bf
沙哈希6c0fdc93
沙六角6c0fdc93

sha1 4f29b0bd107070c753cedeb2adb54bf6c0fdc93

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

这里 boost sha1 中缺少前导
我不明白为什么0丢失了。

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

默认情况下,使用<<打印数字将丢弃前导零。 如果您不想这样做,则需要指定:

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

等效于std::cout


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

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

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM