7월, 2019의 게시물 표시

SHA-256 구현

이미지
안녕하세요. 오늘은 SHA-256 알고리즘에 대해 간단하게 설명하려고 합니다~ 이 포스팅에서는 SHA-256 의 수학적인 원리나 구현 최적화 기법에 대해서는 다루지 않습니다. 설명을 위해 최소한으로 작성한 C++ 코드를 통해 SHA-256 의 내부 로직이 어떻게 구성되어 있는지 가볍게 알아보도록 하겠습니다. SHA-256 이란? 해시 함수중에 하나로서, 해시의 결과가 256bit 입니다. SHA 해시 함수 모음에 속하고 대중적으로 널리쓰이는 해시 함수중에 하나입니다. 특히 최근에는 비트코인을 비롯한 많은 블록체인 시스템에서 SHA-256 을 주로 활용합니다. SHA-256 알고리즘은 해시 대상 메시지를 전처리하는 단계과 전처리된 메시지를 바탕으로 해시를 계산하는 단계로 나뉩니다. 각 단계에 대해서 알아보도록 하겠습니다. 메시지 전처리 SHA-256 를 적용해야할 데이터를 메시지 라고 합니다. 이때 메시지 bit 의 길이가 512의 배수가 되도록 padding 을 추가하는 것이 전처리 단계에서 수행하는 작업입니다. 구체적인 규칙은 아래와 같습니다. 원본 메시지의 바로 뒤에 비트 ‘1’ 을 하나 추가한다. 메시지의 길이가 512의 배수가 되도록 메시지에 0을 추가한다. 메시지의 마지막 64bit에는 원본 메시지의 bit 길이를 적는다. (출처 : https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf ) 이러한 메시지 전처리 단계를 C++ 로 구현하면 아래와 같습니다. // 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'