c++ 使用cpp的sha256摘要[已结束]

wyyhbhjk  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(146)

**已关闭。**此问题不符合Stack Overflow guidelines。当前不接受答案。

这个问题似乎与help center中定义的范围内的编程无关。
2天前关闭。
Improve this question
我有一个代码在Python中做二进制哈希字符串。然而,我需要在CPP相同的函数代码。我已经安装了OpenSSL,但无法找到简单的指南,可以帮助我获得相同的结果由Python产生。
我在Python中的字符串输入= 252bf9d75c4f481ebb6278d708257d1f12bb6dd30301d26c623f789b2ba6fc0
并且Python双精度函数sha256给予散列= 9f840d5922a8f6b6ca360351449616a7423d0358c3cd2ad4af2c5de065352fe5
我在pyhton的代码是:

import hashlib
import binascii

inputs = '252bf9d75c4f481ebb6278d708257d1f12beb6dd30301d26c623f789b2ba6fc0'

unhex_ascii = binascii.unhexlify(inputs)
firstsha256 = hashlib.sha256(unhex_ascii).digest()
secondsha256 = hashlib.sha256(firstsha256).digest()

final = binascii.hexlify(secondsha256[::-1])
print(str(final, 'utf-8'))

下面的代码是我在cpp中使用的,但是和python相比,它给予了不同的答案。
在cpp中,我得到散列= 0e2b6fe2284bfa33b2922ec48dc8a4e326de4dd86759ce50350469b6f0c2c864
我的cpp代码是:

#include "SHA256.h"
#include <iostream>
using namespace std;

int main() {

unsigned char buf1[32] = { 0 }, buf2[32] = { 0 };
unsigned char ForHash[129] = "\x25\x2b\xf9\xd7\x5c\x4f\x48\x1e\xbb\x62\x78\xd7\x08\x25\x7d\x1f\x12\xbe\xb6\xdd\x30\x30\x1d\x26\xc6\x23\xf7\x89\xb2\xba\x6f\xc0";

sha256_hash(buf1, ForHash, (32));
sha256_hash(buf2, buf1, 16);

for (int i = 0; i < 32; i++) {  
printf("%02x", buf2[31 - i])}; 

return 0;}

sha256.h是从https://github.com/dmitryelj/SHA256-Benchmark/blob/main/SHA256.CPP派生的

crcmnpdw

crcmnpdw1#

不知道是怎么回事,但如果我用Python运行,我会得到

>>> s = "252bf9d75c4f481ebb6278d708257d1f12beb6dd30301d26c623f789b2ba6fc0"
>>> from hashlib import sha256
>>> print(sha256(s.encode('utf-8')).hexdigest())
193ac4031125231a4840fbb23079c3097d4f5dbe4e78670c22756ba1981cfae5

在C++中我得到了Godbolt Link

#include <openssl/sha.h>
#include <iostream>
#include <sstream>

std::string sha256( const std::string& input ) {
    SHA256_CTX ctx;
    SHA256_Init(&ctx);
    SHA256_Update(&ctx, input.data(), input.size() );
    unsigned char digest[SHA256_DIGEST_LENGTH];
    SHA256_Final(digest, &ctx);
    return std::string((char*)digest,SHA256_DIGEST_LENGTH);
}

std::string hex( const std::string& input ) {
    std::ostringstream out;
    for ( unsigned char ch : input ) {
        char dig[8];
        ::sprintf( dig, "%02x\0", ch);
        out << std::string(dig,2);
    }
    return out.str();
}

int main() {
    std::cout << hex( sha256( "252bf9d75c4f481ebb6278d708257d1f12beb6dd30301d26c623f789b2ba6fc0") ) << std::endl;
}

输出:

Program stdout
193ac4031125231a4840fbb23079c3097d4f5dbe4e78670c22756ba1981cfae5
ars1skjm

ars1skjm2#

第二次哈希时,只使用了SHA256哈希值的一半,将第二次调用sha256_hash改为读取所有32个字节,得到了预期的结果.Demo

相关问题