-
블록체인을 이루는 기반 해시함수IT-Information/Blockchain 2022. 5. 12. 22:12
해시함수
입력의 길이와 상관없이 항상 고정된 길이의 출력을 생성하는 함수를 의미한다. 코로나 바이러스의 유행으로 인해 정부에서 시행했던 마스크 5부제도 일종의 해시함수다. 이때 입력은 출생 연도였고 출력은 요일을 의미하는 월,화,수,목,금을 숫자로 표현한 1,2,3,4,5의 한 자리 숫자인 해시함수인 셈이다. 다양한 용도로 사용되며 데이터를 효율적으로 탐색하는 방법으로 사용되기도 하지만 블록체인에서는 데이터 검색의 효율성보다는 문서 변경을 손쉽게 탐지할 수 있는 방법으로 더 널리 활용되고 있다.
암호화해시
A.J 메네즈와 그 동료들은 다음 네 가지 조건을 모두 만족하는 해시함수 H를 암호화 해시라고 불렀다.
1) 계산의 용이성 easy : 유한한 길이의 메시지 m이 주어졌을 때, 그 메시지에 관한 해시 계산은 매우 간편해야 한다. h=H(m), h는 고정된 길이
2) 원상 회피 pre-image resistance : 어떤 경우라도 해시 값으로부터 원래의 메시지를 복원하는 것은 불가능해야 한다. ‘불가능’이라는 것의 의미를 계산 복잡도 이론을 사용해 설명하면 ‘다항 시간에 해결할 수 있는 해법이 존재하지 않는 것’으로 정의할 수 있다. 이런 성질로 인해 해시함수는 일방향 함수라고 부른다. 주어진 해시 값 h에 대해, 다음을 만족하는 메시지 m을 찾는 것은 불가능하다. h=H(m)
3) 두 번째 원상 회피 Second pre-image resistance : 주어진 메시지 m에 대해 이와 동일한 출력을 생성하는 또 다른 메시지 m‘를 찾는 것은 불가능해야 한다. 즉, 충돌은 불가능하다. 이는 주어진 메시지 m에 대해 다음을 만족하는 또 다른 메시지 m’를 찾는 것은 불가능하다. m≠m’이면서 H(m)=H(m’)
4) 충돌 회피 Collsion resistance : 동일한 출력 결과를 생성하는 서로 다른 두 메시지를 찾는 것은 불가능하다. 즉, 충돌은 불가능하다. m≠m’이면서 H(m)=H(m’)
결국 항상 고정된 길이를 출력하는 해시함수가 어떤 경우든 그 원 메시지가 무엇인지 찾을 수 없고, 입력이 다르면 항상 그 출력도 다른 성질을 만족할 때, 암호화 해시라고 부른다.
SHA-256과 해시 퍼즐
비트코인 블록체인에서 사용하는 해시함수의 이름은 SHA-256이다. 입력에 상관없이 항상 256비트(32바이트)의 출력을 생성한다. 비트코인은 거의 예외 없이 항상 SHA-256을 두 번 연속 적용한 해시 값을 사용하는데, 블록의 고유한 해시 값을 계산할 때도 블록 데이터를 연속해 두 번 해시한 후 사용한다. 물론 SHA-256해시를 연속해 여러번 적용하더라도 결과는 항상 고정된 32바이트가 출력된다. SHA는 ‘Secure Hash Algorithm’의 약자로, 미국국가안전보장국에서 개발한 암호화 해시 기법이다. NSA가 최초 해시 알고리즘은 1993년 발표한 SHA-0이였지만 충돌이 보고돼(암호화 해시 3번 성질 위배) 폐기됐고 보강한 –1,-2 패밀리가 등장했다. SHA-0과 SHA-1은 해시 값으로 160비트를 생성하도록 설계돼 있었지만 SHA-2가 등장하며 224, 256, 384, 512비트 등의 다양한 길이의 버전이 만들어졌고, SHA-1의 경우 SHA-0과 달리 실제 해시 충돌 보고는 없었지만 서로 다른 문서가 같은 해시를 생성하는 해시 충돌의 가능성이 있다는 것이 입증돼(암호화 해시 4번 성질 위배) 지금은 모두 SHA-2 패밀리만 사용하고 있다.
16진수는 0부터 15까지 수에서 10이 넘는 수인 10, 11, 12, 13, 14, 15를 각각 a, b, c, e, d, f로 표기한다. 보통 문자 a, b, c 등과 16진수 표기인 a, b, c와 구분하기 위해 맨 앞에 0x 기호를 붙이기도 한다. 즉, a는 문자 a이고 0xa는 16진수 10인 셈이다.
16진수의 한자리는 4비트(0부터 -1까지)를 나타내므로 SHA-256의 결과인 256비트는 16진수 64자릿수로 표현되므로 출력은 64글자다. 출력을 16진수가 아니라 통상 사용하는 10진수로 표현하면 77자리 정수로 해시함수의 출력은 정수인데 ‘아주 큰’정수다. 따라서 통상 16진수로 표기해 출력 길이를 줄인다.암호화 해시의 응용
해시함수를 사용하면 변경 유무를 손쉽게 알 수는 있으나, 어디에서 변경됐는지, 또 얼마나 변경됐는지에 대해서는 절대 알 수 없다는 사실이다. 일일이 대조할 경우 시간은 엄청나게 걸리지만 어디가 변경됐는지는 알 수 있다. 그러나 해시함수는 전체 내용의 대푯값 하나만 간직하고 있고 이 대푯값끼리의 비교이므로 어디가 변경됐는지는 알 수가 없는 것이다.
어렇듯 암호화 해시를 사용하면, 내용이 변경됐는지 확인하기 위해 원래 데이터 전체를 보관해야 하는 낭비를 없앨 수 있고, 또 모든 데이터를 일일이 대조해야 하는 번거로움도 없앨 수 있다.
블록체인에서의 암호화 해시함수 활용
일단 원시 데이터에 관한 해시 값을 보관해 두고 나면 이후에 이 트랜잭션 T가 조작됐는지 여부를 확인할 때 검사하려는 트랜잭션의 해시 값만 다시 보면 된다. 비트코인에서는 블록 하나당 대략 2천~천 개의 트랜잭션이 담기는데, 이 트랜잭션 전체를 대표하는 해시 값 하나를 생성해서 보관한다. 이 대푯값은 블록에 저장된다.
머클트리
1979년 랄프 머클에 의해 개발된 데이터 구조로서 해시 값으로 구성된 이진 트리 형태를 띠고 있다. 비트코인은 모든 트랜잭션에 관한 단일 해시 값을 지정하기 위해 머클트리를 이용한다. 이제 머클트리를 이용해 모든 트랜잭션에 관한 단일 해시 값을 생성하는 과정을 살펴본다.
트랜잭션 데이터 정보를 머클트리를 사용해 하나의 해시 값으로 압축하고 있는 모습을 보여준다. 비트코인에서는 기본적으로 SHA-256 해시를 연속 두 번 적용하는데, 여기서도 예외는 아니다. 이는 해시를 적용한 결과값에 다시 한번 해시를 적용하는 것을 의미한다.
블록 헤더에 단 32바이트의 머클트리 루트만 저장해 두면 2~천여 개의 트랜잭션 중 어느 하나만 변경돼도 바로 탐지할 수 있게 된다.
암호화 기법
비트코인을 암호화한 후 복호화를 통해 다시 원 메시지로 복원하는데 이를 복원 기술로 이는 크게 대칭형 암호화와 비대칭형 암호화로 나뉜다.
비대칭 암호화 기법
한 쌍의 키를 이용해 암호화와 복호화를 수행한다. 최초의 비대칭 암호화는 1976년 MIT 교수 세 사람이 개발한 RSA다. 론리베스트, 아디 샤미르, 레너드 아델만의 성에서 따왔다. 소인수분해를 통해 두 키를 생성하고, 산술식에 의해 암호화 또는 복호화할 수 있는 공식을 통해 구현돼 있다.
개인키로 암호화-전자서명
일반문서의 진위를 보장하고자 서명을 사용하듯 전자서명은 디지털화된 문서의 진위를 보장하기 위한 목적으로 사용된다. 이 과정에서 전자서명하려는 사람의 개인키와 공개키를 각각 표기하고 문서의 전자서명을 생성하는 데 서명하는 것은 문서의 해시를 만들고 그 해시 값을 개인키로 암호화 하는 과정이다.
공개키로 암호화-비밀 보장 및 신원 증명
공개키로 암호화하고 개인키로 복호화하는 방식은 비밀 보장을 위한 일반적 방식이다. 이 방식을 사용해 일단 암호화된 문서는 개인키를 가진 사람 이외에는 누구도 복호화 할 수 없으므로 비밀이 보장된다.
블록체인에서의 전자서명과 비대칭 암호화 기법
블록체인에서는 트랜잭션을 작성한 다음 조작이나 위변조로부터 보호하기 위해 전자서명을 사용한다.
해시 퍼즐
작업증명
1993년 신시아 도크와 모니 나오에 의해 제안된 개념으로 서비스 거부 공격이나 스팸 등으로 서비스가 남용되는 것을 방지하기 위해 만들어진 기법이다. 서비스를 신청하는 자에게 결코 작지 않으면서도 처리 가능한 수준의 과제를 요구하는 것이 핵심이다. 여기서 과제란 주로 컴퓨터 계산 자원을 소모해야 하는 일을 의미한다.
비트코인 장부
비트코인은 거래 내역을 기록하는 장부로 생각할 수 있다. 그러나 일반적인 장부와 다르게 무엇인가를 기록하는 것이 무척이나 힘든 장부에 비유할 수 있다.
디지털 잠금장치가 달린 장부
비트코인의 장비는 가상의 장부에 디지털 잠금장치가 돼 있다고 묘사할 수 있다.
비밀번호가 계속 바뀌는 장부
어렵게 비밀번호를 알아내고 장부를 연 다음 기록을 하고 나면 이 장부는 다시 잠겨버린다.
해시 퍼즐
비트코인을 디지털 잠금장치가 돼 있는 장부로 설명했듯 이제 실제 이 잠금장치가 어떻게 구현되있는지 본다.
바구니에서 공 꺼내기
비트코인의 해시 퍼즐
바구니에서 공을 꺼내는데 공의 개수는 2의 256승개이며 공에 적힌 숫자도 0부터 2의 256승 –1로 무척 커진다는 것이다.
블록 헤더와 블록 아이디
각 블록에는 고유한 아이디가 존재하는데, 그 아이디가 바로 해시 퍼즐을 통해 찾은 해시 값이다.