링크: http://slides.com/dongsunlim/deck-2#/
가. 비트코인의 보안체계:
모든 프로그램은 여러 구성체계로 이루어져 있음. 마치 사람에게는 팔 다리 머리 그리고 오장육부가 있고 사람의 머리에는 머리카락, 뇌가 있으며 뇌 속에는 시냅스들이 가닥을 이루고 있는 것과 같은 이치임. 필자는 비개발자로 컴퓨터 공학을 전공하지 않았지만 비트코인이라는 거대한 시스템을 이해하기 위해서는 각각의 구성요소들을 세부적으로 이해하는 것이 필요하다고 생각해서 이 강의를 만들게 되었음. 앞으로 비트코인의 체계구성 요소에 대한 이론적 강의를 만들고 개념을 적용한 소스코드를 이용해서 실제로 비트코인과 블락체인 체계를 구현하는 것이 이 강의의 목표임
나. 비트코인의 보안체계 구성:
비트코인의 보안체계는 세 가지 구성요소를 가지고 있음
1. 암호학적 해시함수
2. 공개 키 암호화 방식
3. 작업증명
이 모든 개념은 문명이 시작한 이래로 계속 연구해왔지만 1970년대 이후에 급격하게 체계가 재정립된 암호학이라는 학문을 기반으로 하고 있음
다. 암호학이란?
A(Alice)가 B(Bob)에게 M이라는 메시지를 전하는 상황을 가정함. 이 때 이 메세지를 듣거나 가로채서 소통을 방해하려는 E(Eve)가 있을 수 있음. 암호학의 요지는 이 상황에서 어떻게 메세지를 안전하게 전달할 수 있는지를 다루는 학문임. 이번 강의에서는 메세지(M)자체의 보안을 강화하는 해시함수에 대한 내용을 다룰 것임
- 해시함수?
- 임의의 길이의 데이터를 고정된 길이의 해시값으로 변환하는 함수
- 결정적- 특정한 데이터에 해시함수를 적용하면 언제나 같은 해시 값이 도출됨(랜덤x)
계산 용이- 일정한 수준 이상의 컴퓨터로 계산이 가능해야 함 - 자료저장의 효율성- 데이터의 크기가 얼마인지와는 상관 없이 해시값이 일정함. 예를 들어 100MB의 영상 자료도 32바이트의 해시 값으로 저장할 수 있음
자료 검색의 용이성- 모든 자료 중에서 하나의 자료를 검색하는 대신 해시 값으로 바로 자료를 찾을 수 있음
라. 암호학적 해시 함수의 특성:
해시함수의 값을 통해 원래 데이터를 유추할 수 없어야 함
- 일방통행: 한번 x를 h(x)로 변환하면 다시 h(x)로부터 x를 도출할 수 없음
- 높은 충돌 저항: 서로 다른 x와 y 값에 대해 h(x) = h(y)를 찾을 확률이 무시 가능함
- 숨김: 두 데이터가 조금만 달라도 완전히 다른 해시 값을 가짐
마. 해시함수의 구성:
MD-5, SHA-1, SHA-2(SHA256포함)은 Merkle-Damgard Construction을 사용함
- 시작벡터(initialization vector): 함수 구성 시작을 위한 최초의 고정된 길이값(256bit)
패딩(padding)- 데이터를 단위블록(sha 256의 경우 512)의 배수로 만들기 위한 값을 체움 - 압축(Compression)- 시작벡터와 패딩된 블록을 압축하여 시작벡터와 같은 값의 데이터(256bit)를 생성함
- 반복: 모든 블록이 소진될 때까지 다음 블록과 압축으로 생성된 블록을 다시 압축함
바. 암호학적 해시 함수의 보안성:
공격벡터(attack vector): 암호학의 보안성을 깨기 위한 접근 방법
- 역산가능성: 해시의 길이에 따라 역산을 위한 계산이 기하급수적으로 늘어남
(예) SHA-256 = 265bit(32byte), 2²⁵⁶의 계산이 필요함) - 충돌 가능성: 무한한 양의 데이터를 유한한 길이의 해시함수로 변환하기 때문에 충돌은 있을 수 밖에 없음
(비둘기집 문제) - 충돌 가능성 계산: 생일파티 문제
(사람이 23명이 모이면 서로 생일이 겹치는 사람이 한 쌍이라도 있을 확률은 50%임) - 해시함수의 보안성이 깨진 예: MD-5/SHA-1
사. 비트코인에서의 해시함수 사용:
해시함수는 비트코인 모든 데이터를 저장, 전송하여 체인을 형성하는데 사용 되는 기본 단위임
- 거래 ID(txid): 모든 거래 데이터는 고유의 해시 값을 가지며 이후 거래의 잔고(인풋)을 확인할 때 이전 거래의 해시를 통해 금액을 확인할 수 있음(거래 강의 참조)
- 블락헤더 해시(Block header hash): 블락체인 저장 단위인 모든 블락은 이전 블락헤드의 해시 값을 블락해드에 포함함 (블락들이 체인을 형성될 수 있는 이유임) 블락헤드 해드는 이전블락 해시, 버젼, 비트, 논스, 메르켈루트로 구성됨 (철완이의 블락해드 파이썬 코딩 참조)
해시체인의 불가변성: 해시함수의 특성에 블락 데이터를 약간이라도 바꾸면 완전히 완전히 다른 블락헤더 해시가 생성됨. 각 블락헤드는 이전 블락헤드 해시값을 포함하므로 데이터가 바뀐 블락 이후의 모든 블락의 해시 값이 달라짐
- 머클 루트: 블락에 포함된 모든 거래의 데이터를 담은 하나의 해시 값 (Sidenote: 머클트리 참조)
- 공개 키, 비공개 키, 디지털 서명 (Public Key, Private Key, DSA): 비트코인 지갑 주소는 공개키와 비공개키의 해시 값으로 구성되어 있음. 그리고 거래를 하기 위한 디지털 서명은 개인의 비공개키에 디지털 서명을 추가하는 방식임(비공개키 암호학 강의 참조)
- 작업 증명(Proof of Work): 채굴자가 블락 생성을 위해 블락헤더 해시를 연산하는 방법 (원하는 값이 나올 때까지 블락해시를 구함)