代码之家  ›  专栏  ›  技术社区  ›  CsgoTalks Com

OpenSSL将二进制字节转换为Sa256 C++

  •  1
  • CsgoTalks Com  · 技术社区  · 6 年前

    我基本上是想得到我的助记词的校验和。 我有二进制字节,希望将它们转换为sha256以获取前4位并对其进行验证。

    我花了大约2天的时间才意识到哈希与文本字符串到sha256的区别,而不是字节到sha256的区别。 下面的函数可以工作,但它作为字符串而不是字节散列。

    string sha256(const string str)
    {
        unsigned char hash[SHA256_DIGEST_LENGTH];
        SHA256_CTX sha256;
        SHA256_Init(&sha256);
        SHA256_Update(&sha256, str.c_str(), str.size());
        SHA256_Final(hash, &sha256);
        stringstream ss;
        for(int i = 0; i < SHA256_DIGEST_LENGTH; i++)
        {
            ss << hex << setw(2) << setfill('0') << (int)hash[i];
        }
        return ss.str();
    }
    

    我不熟悉OpenSSL,无法在网上找到任何解决方案。 如果有人能使我的函数正确地散列二进制字节输入,我会非常感激的。 谢谢。

    下面是一个例子: 1011111001100101010111011100111101010001111101101011000111010111111101111011101010011000111101000110000101000111101000111011011100000

    这个用作文本的值给出了这个哈希值: 2D7ffa3c8f9c3fc043045f2564101eabf80bcdb983d1d560b6b93f52ea824942

    作为字节使用给我这个正确的哈希: 5E5C92432E692F803539715BB624CD2E35B491C6BC67AE87AE82600DEDF12

    我用这个网站来散列: https://cryptii.com/hash-function

    1 回复  |  直到 6 年前
        1
  •  0
  •   rustyx    6 年前

    因此,您似乎需要将输入解释为 比特流 . 将它们分组为字节,然后关闭:

    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    uint8_t str[] = { 0b10111110, 0b01100101, 0b01011101, 0b11001111, 0b01010001, 0b11110110, 0b10110001, 0b11010111, 0b10111101, 0b11000101, 0b10100110, 0b00111101, 0b00010100, 0b01110100, 0b00110110, 0b11100000 };
    SHA256_Update(&sha256, str, sizeof(str));
    SHA256_Final(hash, &sha256);
    

    哈希输出:

    5e5c92432e692f803539715bb624cd2e35b5b491c6bc67aee87ae82600dedf12
    

    Live demo