>

문제

따라서 OpenSSL 라이브러리와 함께 C ++을 사용하여 자체 블록 체인을 처음부터 구현하려고 시도했으며 문제가 발생했을 때까지 모든 것이 잘 진행되었습니다.

256 비트 해시 다이제스트는 어떻게 저장합니까?

처음에 uint8_t에서 256 비트 타입을 구현하려고 시도했습니다

그러나 나는 OpenSSL의 bignums를 포기하고 사용하기로 결정했습니다.

하지만 OpenSSL bignums는 공개 키 암호화 기능에 사용됩니다. sha256과 같은 해시 기능을 수행하고 다이제스트를 BigNum에 저장하는 방법은 무엇입니까?

또는 256 비트 이상의 값을 저장하는 데 효율적인 대안 옵션이 있습니까?

여기서 내가 사용했던 코드는 다음과 같습니다.

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의 다이제스트를 큰 숫자로 저장하려면
  • 다른 데이터 구조를 사용하여 해당 정보를 저장합니다.

그리고 적어도 256 비트 나누기 및 그 이상의 같음 비교를 수행 할 수 있어야합니다.

제발 도와주세요 !!


  • 답변 # 1

    결국 나는 uint8_t를 BigNum으로 변환하기 위해 BN_bin2bn ()을 사용했습니다.

    #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);
    }
    
    

  • 이전 lua - 멋진 wm의 CPU 온도 위젯
  • 다음 SQL Server에서 총 백분율로 그룹화