OpenSSL摘要:命令行和c++; 当我用OpenSSL命令行计算文件的Sa256摘要时,它完全不同于C++中使用OpenSSL库生成的摘要。

OpenSSL摘要:命令行和c++; 当我用OpenSSL命令行计算文件的Sa256摘要时,它完全不同于C++中使用OpenSSL库生成的摘要。,c++,command-line,openssl,digest,C++,Command Line,Openssl,Digest,命令行: openssl dgst -binary -sha256 MyFile.txt c++: 为什么通过C++的摘要与在命令行上计算的摘要完全不同?(MyFile.txt中没有换行符或空格) 亲切问候,, 马蒂亚斯你把读数搞错了。使用此codechange,哈希值是正确的: int readlen; while ( (readlen = BIO_read(bio, buf, bufLength)) > 0)

命令行:

openssl dgst -binary -sha256 MyFile.txt
c++:

为什么通过C++的摘要与在命令行上计算的摘要完全不同?(MyFile.txt中没有换行符或空格)

亲切问候,,
马蒂亚斯

你把读数搞错了。使用此codechange,哈希值是正确的:

            int readlen;

            while ( (readlen = BIO_read(bio, buf, bufLength)) > 0)
            {
                EVP_DigestUpdate(ctx, buf, readlen);
            }
通常,您应该有更多的错误处理,以使代码更健壮

干杯


/Erik Alapä

谢谢你的回答,但这不起作用=>readlen是“始终”1(除非文件读到最后)我也尝试过用QT(QFile.readAll)读取文件,在那里散列也不同于在命令行上计算的散列。是的,它起作用了。你把while从句一字不差地抄了吗?括号很重要。当我读取测试文件时,它读取4096字节2次,最后一次读取1655字节。十六进制散列与命令行ssl散列完全匹配。谢谢,当将二进制散列转换为十六进制时,它们是相同的
            int readlen;

            while ( (readlen = BIO_read(bio, buf, bufLength)) > 0)
            {
                EVP_DigestUpdate(ctx, buf, readlen);
            }