본문 바로가기

개인공부

SHA-256

반응형

해싱알고리즘의 하나인 SHA-256은 비트코인에서도 사용하고 있는 유명한 알고리즘이다.

개발시에서도 암호를 해싱알고리즘을 사용해 서버에 저장하는 등 많이 사용한다.

 

단방향 해싱의 장점은 복호화하는 기술이 어렵기 때문에 사용자의 비밀번호를 서버에서 저장하다고 하여도 관리자는 그비밀번호를 알수가없다.

 

메세지 전처리 

 

SHA-256를 적용해야할 데이터를 메시지 라고 합니다. 이때 메시지 bit 의 길이가 512의 배수가 되도록 padding 을 추가하는 것이 전처리 단계에서 수행하는 작업입니다.

 

  1. 원본 메시지의 바로 뒤에 비트 ‘1’ 을 하나 추가한다.
  2. 메시지의 길이가 512의 배수가 되도록 메시지에 0을 추가한다.
  3. 메시지의 마지막 64bit에는 원본 메시지의 bit 길이를 적는다.

출처 : https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf

// Add padding to message.
void PreProcess(std::vector<uint8_t>& message)
{
    auto L = static_cast<uint64_t>(message.size());

    // Append single '1' bit and seven '0' bits.
    message.push_back(0b10000000);

    // Append (K * 8) '0' bits, where L + 1 + K + 8 is a multiple of 64.
    auto K = 64 - (((L % 64) + 9) % 64);
    if (K == 64) K = 0;

    for (int i = 0; i < K; ++i)
    {
        message.push_back(0);
    }

    // Append the bit length of original message.
    assert(L <= UINT64_MAX / 8);
    uint64_t bitLengthInBigEndian = ChangeEndian(L * 8);
    auto ptr = reinterpret_cast<uint8_t*>(&bitLengthInBigEndian);

    message.insert(std::end(message), ptr, ptr + 8);
    assert(message.size() % 64 == 0);
}

 

전처리된 메시지 해싱

메시지 전처리가 끝났다면 메시지의 bit 길이는 512의 배수 형태가 되어있을 것입니다.
이러한 전처리된 메시지를 512bit 단위로 쪼개서 여러 개의 chunk 를 만들게 됩니다.
그리고 이러한 chunk 들을 차례대로 순회하면서 특정 연산을 수행하여 최종적인 hash 값을 계산해내게 됩니다.


여기서 초기값 상수 (H0) 는 가장 작은 소수 8개 (2, 3, 5, 7, 11, 13, 17, 19) 에 대해 루트를 씌운 후 소수점 아래자리 32bit 를 추출하면 구할 수 있습니다.
초기값 상수 를 구하는 것을 코드로 작성하면 아래와 같습니다.

 

std::array<uint32_t, 8> Make_H0()
{
    const double kPrimeList[] = { 2, 3, 5, 7, 11, 13, 17, 19 };
    static_assert(sizeof(kPrimeList) / sizeof(*kPrimeList) == 8, "");

    std::array<uint32_t, 8> H;

    for (int i = 0; i < 8; ++i)
    {
        auto v = std::sqrt(kPrimeList[i]);

        v -= static_cast<uint32_t>(v);
        v *= std::pow(16, 8);

        H[i] = static_cast<uint32_t>(v);
    }

    return H;
}

자바에서 활용

needjarvis.tistory.com/251

 

[Java] SHA-256 해싱(Hashing) 알고리즘 사용법

비트코인에서 쓰고 있기도 한 해싱 알고리즘인 SHA-256은, 안전한 해시 알고리즘인 Secure Hash Algorithm에서 따온 명칭이다. 이 함수는 미국 국가안보국(NSA)에서 1993년 처음 설계했으며, 미국 국가 표

needjarvis.tistory.com

 

반응형