gpt4 book ai didi

C++:有效地将 Sha256 摘要获取到 OpenSSL Bignum 中?

转载 作者:太空宇宙 更新时间:2023-11-04 12:44:50 25 4
gpt4 key购买 nike

问题

所以我使用 C++ 和 OpenSSL 库来尝试从头开始实现我自己的区 block 链,一切都很顺利,直到我遇到了一个问题:

如何存储我的 256 位哈希摘要?

起初我尝试用 uint8_t 实现我自己的 256 位类型

但后来我放弃了,决定使用 OpenSSL 的 bignums。

但问题是,据我所知,OpenSSL bignums 旨在用于公钥加密函数,我如何执行 sha256 等哈希函数并将摘要存储在 BigNum 中?

或者是否有替代选项可以有效存储 256 位或更多值?

这是我在 bignums 之前使用的代码:

UINT<SHA256_DIGEST_LENGTH> Crypto::Sha256 (const std::string &p_Data)
{
UINT<SHA256_DIGEST_LENGTH> result;
SHA256_CTX context;

SHA256_Init (&context);
SHA256_Update (&context, p_Data.c_str (), p_Data.length ());
SHA256_Final (result.m_Bytes, &context);

return result;
}

这是我自己的 BigNum 类实现:(不是很有效)

template<size_t BLOCK_SIZE>
struct UINT
{
size_t blockSize = BLOCK_SIZE;
uint8_t m_Bytes[BLOCK_SIZE];

static UINT<BLOCK_SIZE> Zero ()
{
UINT<BLOCK_SIZE> r;

for ( uint8_t &byte : r.m_Bytes )
byte = 0b0000'0000;

return r;
}

static UINT<BLOCK_SIZE> One ()
{
UINT<BLOCK_SIZE> r;

for ( uint8_t &byte : r.m_Bytes )
byte = 0b1111'1111;

return r;
}

friend std::ostream& operator<<(std::ostream& p_OS, const UINT<BLOCK_SIZE>& p_Value)
{
for ( const uint8_t &byte : p_Value.m_Bytes )
p_OS << (int) byte;

return p_OS;
}

std::string Str ()
{
std::stringstream ss;

for ( const uint8_t &byte : m_Bytes )
ss << (int) byte;

return ss.str();
}

bool operator==(const UINT<BLOCK_SIZE> &p_Other) const
{
bool r = true;

for ( int i = 0; i < 256; ++i )
{
const bool X = (m_Bytes[i / 8] >> (i % 8)) & 1;
const bool Y = (p_Other.m_Bytes[i / 8] >> (i % 8)) & 1;

r &= ~(X ^ Y);
}

return r;
}

bool operator!=(const UINT<BLOCK_SIZE> &p_Other) const
{
bool r = true;

for ( int i = 0; i < 256; ++i )
{
const bool X = (m_Bytes[i / 8] >> (i % 8)) & 1;
const bool Y = (p_Other.m_Bytes[i / 8] >> (i % 8)) & 1;

r &= X ^ Y;
}

return r;
}

bool operator>(const UINT<BLOCK_SIZE> &p_Other) const
{
bool r = true;

for ( int i = 0; i < 256; ++i )
{
const bool X = (m_Bytes[i / 8] >> (i % 8)) & 1;
const bool Y = (p_Other.m_Bytes[i / 8] >> (i % 8)) & 1;

r &= X & ~Y;
}

return r;
}

bool operator<(const UINT<BLOCK_SIZE> &p_Other) const
{
bool r = true;

for ( int i = 0; i < 256; ++i )
{
const bool X = (m_Bytes[i / 8] >> (i % 8)) & 1;
const bool Y = (p_Other.m_Bytes[i / 8] >> (i % 8)) & 1;

r &= ~X & Y;
}

return r;
}

bool operator>=(const UINT<BLOCK_SIZE> &p_Other) const
{
bool r = true;

for ( int i = 0; i < 256; ++i )
{
const bool X = (m_Bytes[i / 8] >> (i % 8)) & 1;
const bool Y = (p_Other.m_Bytes[i / 8] >> (i % 8)) & 1;

r &= (X & ~Y) | ~(X ^ Y);
}

return r;
}

bool operator<=(const UINT<BLOCK_SIZE> &p_Other) const
{
bool r = true;

for ( int i = 0; i < 256; ++i )
{
const bool X = (m_Bytes[i / 8] >> (i % 8)) & 1;
const bool Y = (p_Other.m_Bytes[i / 8] >> (i % 8)) & 1;

r &= (~X & Y) | ~(X ^ Y);
}

return r;
}
};

同样重要的是要注意:最初我确实实现了自己的 Sha256 函数,但使用它并不是一个好主意。首先,我不是密码学专家,其次,就可扩展性而言,它非常糟糕,因为我也必须从头开始实现所有其他密码函数,所以我最终选择使用 OpenSSL 的即用型哈希函数。

我想到的解决方案我考虑过使用新创建的 BigNum 设置每一位但是,BN_set_bit() 这样做效率不高,因为我们已经将摘要放入 uint8_t 数组中。我们会复制结果两次,这是一种愚蠢的解决方案。

现在我需要两个东西之一:

  • 将来自 Sha256_final 或 EVP_DigestFinal_ex 的摘要存储在一个 bignum 中
  • 使用不同的数据结构来存储该信息。

而且我需要能够执行算术运算,至少是 256 位除法和大等于比较。

请帮帮我!!

最佳答案

最后,我最终使用 BN_bin2bn() 将 uint8_t 转换为 BigNum。

#include <openssl/bn.h>

void Crypto::Sha256 (const std::string &p_Data, BIGNUM* hash)
{
uint8_t digestBuffer[256];
SHA256_CTX context;

SHA256_Init (&context);
SHA256_Update (&context, p_Data.c_str (), p_Data.length ());
SHA256_Final (digestBuffer, &context);

BN_bin2bn (digestBuffer, 256, hash);
}

关于C++:有效地将 Sha256 摘要获取到 OpenSSL Bignum 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52240053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com