글 작성자: beaniejoy

해시함수는 블록체인 네트워크의 근간을 이루는 중요한 매커니즘 중에 하나다. 정보의 무결성 검증, 채굴, 전자서명 등 블록체인 네트워크가 뛰어난 보안과 함께 작동하도록 만들어준다고 할 수 있다. 해시함수에 대해 알아보자.

 

 

📌 1. 해시함수와 해시값의 개념

임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다. (위키백과)
그리고 입력값에 대해 원래의 입력값과 전혀 다른 값을 출력하는 함수이기도 하다. 출력되는 결과물을 '해시값'이라고 한다.

 

 

🔖 1-1. 해시함수 특성

  • 입력값이 같으면 해시값도 반드시 같다. 
  • 해시값으로부터 원래의 값을 추정(복호화)하는 것은 사실상 불가능하다. (불가역성, 일방향 함수라고도 한다.)
  • 입력값이 한 개라도 바뀌면 전혀 다른 해시값이 출력된다. (눈사태 효과)
  • 출력값은 input의 길이와 관계없이 항상 고정된 길이를 출력한다.

 

 

🔖 1-2. SHA-256 / RIPEMD-160

SHA-256: 미국 국립표준기술연구소가 개발해 연방정보처리표준(FIPS 180-4)로 표준화한 SHA-2 규격의 일부로 SHA-256이 정의되었다. SHA-256은 Secure Hash Algorithm 256-bit의 약자로 256비트(32bytes) 길이의 해시값(결과값)을 생성한다.

RIPEMD-160: 1996년 벨기에의 한 대학교에서 한스도버틴이 개발한 해시함수다. RIPEMD의 최초 버전에서 확장(128비트 → 160비트)했다. SHA-256보다는 짧은 해시값을 생성한다.

Ubuntu에서 기본적으로 해시값을 계산해주는 명렁어를 제공해준다.
(Virtual Box를 이용해 Ubuntu16.04에서 앞으로 리눅스 실험을 할 계획이다.)

  • sha256sum: SHA-256 해시값 계산.
  • rmd160: RIPEMD-160 해시값을 생성해준다. (openssl 명령어 이용/ openssl은 인증서를 확인 및 암호화를 수행하는 프로그램이다.)

이들을 이용해 해시함수의 특성을 한번 살펴보자.

 

 

🔖 1-3. 동일한 출력값 길이: input의 길이와 관계없이 항상 고정된 길이를 출력

 

 

🔖 1-4. 눈사태효과: 입력값이 하나라도 바뀌면 완전히 다른 해시값이 출력됨을 알 수 있다.

 

 

🔖 1-5. 입력값이 같으면 해시값도 반드시 같다.

 해시함수의 이러한 특성은 오류나 위조를 방지할 수 있고 블록체인의 합의 알고리즘이나 공개키, 개인키를 이용한 거래 등 블록체인 네트워크가 데이터의 무결성을 가질 수 있게끔 만들어 준다. 거기에 입력값이 어떻든 output의 길이가 항상 고정돼 있기 때문에 인증작업에 걸리는 시간과 비용을 효과적으로 줄일 수 있다는 장점이 있다.

 

 

📌 2. 공개키와 비밀키(개인키)

 

 

🔖 2-1. 공개키 암호

공개키 암호는 암호화 방식의 한 종류이다. 공개키(public key)와 비밀키(private key)의 한 쌍의 키에 기반을 둔다.
공개키, 개인키는 다음과 같은 특성을 가지고 있다.

  • 공개키로 암호화한 것은 비밀키로만 복원 가능(A의 공개키로 암호화 ← A의 개인키로만 복원가능)
  • 공개키로 비밀키를 만든다던가 기존의 비밀키를 푸는 것은 실질적으로 불가능하다.
    (실질적으로 불가능하다고 되어있는데 사실상 아예 불가능하다고 볼 수 있다.)

 비트코인과 이더리움 네트워크에서는 공개키 암호로 타원곡선 암호를 사용하고 있다. 사실 타원곡선 암호에 대한 공부도 해보고 싶으나 이론이 너무나 복잡하고 정말 어려워서 입문자로서 일단 패스하겠다. 비트코인에서 NIST가 정의한 secp256k1이라는 특별한 곡선을 이용한다는 것만 알아도 지금으로써는 괜찮다고 생각한다.

타원곡선의 핵심은 공개키를 공개해도 그로부터 비밀키를 복원할 수 없다는 것이다.

 

 

🔖 2-2. 공개키, 비밀키 생성 방법

 

 

2-2-1. 비밀키 생성

 비밀키 생성을 위해 ECC(Elliptic curve cryptography/ 타원곡선암호)를 이용한다. 명령어는 openssl의 ecpararm을 이용한다.
openssl ecparam 프로그램을 찾아보니 다음과 같이 간단하게 설명한다.

openssl ecparam: EC parameter manipulation and generation (ecparam에 대한 openssl 링크)

앞에서 잠깐 나왔던 타원곡선(Elliptic Curve)의 변수들을 조작해서 -genkey 옵션을 통해 비밀키를 생성한다. 

 위 그림에서 빨간박스 부분이 생성된 비밀키다. beanie.pem 파일에 저장한 상태다.

 

 

2-2-2. 비밀키를 가지고 공개키 생성

 openssl ec 프로그램을 이용해서 공개키를 생성해볼 것이다. input파일로 비밀키가 들어있는 파일을 입력하고 -pubout 옵션을 통해서 공개키를 생성한다. (ec에 대한 openssl 링크)

 위 그림에서 빨간박스 부분이 생성된 공개키다. beanie-public.pem 파일에 이를 저장한 상태다.

 비트코인 네트워크에서 가장 중요한 근간을 이루는 해시함수와 이를 이용해서 공개키 암호의 공개키, 비밀키를 생성하는 과정까지 정리해보았다. 다음 번에는 생성된 공개키와 비밀키를 가지고 전자서명(디지털 서명)과 데이터 검증이 어떻게 이루어지는지 정리해보겠다.

 블록체인에 관심을 가지고 공부하기 시작했다. 이제 시작인 만큼 반은 성공했다고 생각한다. 앞으로 비트코인 네트워크에 대한 개념 이해와 더불어 이더리움 네트워크의 Smart Contract, 그리고 나중에는 하이퍼렛져까지 블록체인과 관련된 모든 부분에 대해 공부해보며 되도록 개발실습까지 할 계획이다. 앞으로도 꾸준하게 열심히!

'Blockchain' 카테고리의 다른 글

2. 디지털 서명 및 검증 과정에 대한 정리  (2) 2020.01.02