본문 바로가기
Investment/Blockchain, Bitcoin

알기쉬운 블록체인 6강 : 블록체인과 암호기술I

by YOU_IN 2021. 7. 12.

안녕하세요! :-)

 

이번 강의에서는 블록체인 핵심 키워드인

'해시함수'에 대한 내용을 정리해 보았습니다. 

 

그럼 오늘도 블록체인 공부에

도움이 되셨으면 좋겠습니다!

 

 

 

 


 

제 6강 블록체인과 암호기술I

 

출처 : https://quantilus.com/how-blockchain-can-make-transactions-more-transparent-and-safe/

 


 

6-1. 데이터의 신뢰성

 

◈ 디지털 데이터의 신뢰성이란?

 

• 디지털 데이터의 특징
- 복제, 삭제, 변경이 용이
- 대부분 양이 방대하며 부호화 되어 있기 때문에 비가독성

 

• 디지털 데이터의 신뢰성
- 변조되지 않았음을 보이는 것. 즉, 원본과 같은 것.
- 원본과 복제된 데이터 사본의 값이 같으면 사본 또한 원본이라고 주장할 수 있다.
=> 즉, 디지털 세계에서 값이 같으면 같다고 볼 수 있다.
=> 따라서, 원본을 확인한다는 것은 원본이라는 값이 계속 일정하게 유지되고 있음을 말한다.

 

• 매우 큰 두 디지털 데이터를 빠르게 비교하려면?
- 실생활에서는 값을 비교하면서 검증할 수 있지만 더 빠른 방법은 디지털 데이터와 검증값을 공개하는 것이다.
- 데이터에 대한 검증값을 비교하여 확인 가능
- 검증값을 일반적으로 작은 값으로 생성하여 원본값이 크더라도 검증값은 작게 유지한다. 검증값을 효율적으로 만드는 것을 고민한다.

 

•  통신 상의 오류 검출
- CRC(Cyclic Redundancy Check) 검증값 : 통신 상의 채널에서 발생 가능한 오류를 비교적 빠른 시간내 검출하기 위해 사용하는 값. 패킷 정보 뒤에 CRC를 붙여서 사용.
- 패킷을 받은 사람은 패킷으로부터 유도된 CRC값과 패킷 뒤에 붙은 CRC값을 비교해서 검증할 수 있다.
- CRC를 통해 무결성을 주장하기에는 부족하다. 악의적인 목적으로 패킷을 변조시킨 값이 원본 값과 동일한 CRC를 만들어낼 수 있기 때문이다. CRC값은 바뀌지 않고 패킷만 바뀌는 상황이 발생할 수 있다.

 

◈ 데이터와 검증값

 

• 디지털 데이터를 받아서 검증값을 만들어 내는 함수
- 데이터를 축약하고 가공하는 역할. 데이터가 굉장히 크더라도 작은 증거값을 출력하는 역할을 해야 한다. (데이터 -> 함수 -> 증거값)
- 동일한 입력이면 동일한 출력을 가짐
- 증거값의 길이는 유한하나 입력값은 무한한 상황.
- ex) 입력 : 자연수 전체 집합 / 함수 : 13으로 나눈 나머지 => 검증값 : 1~12
입력값이 100, 200, 300과 같이 몇 배가 되어도 검증값은 한정되어 있다.
함수 : 나누는 값*k+9 = 9

 

• 데이터와 검증값
1) 검증값은 충분히 작은 길이로 축약되어야 함
2) 비교적 빠르게 계산되어야 함
3) 검증값으로부터 데이터를 유추하기 어려워야 함
4) 같은 검증값을 가지는 데이터를 만들기 어려워야 함

 

 

 

 


 

6-2. 해시함수란?

 

◈ 해시함수의 개념

 

• 검증값
- 간단한 오류 검출에는 문제가 없다. 하지만, 주어진 검증값에 대한 입력값을 쉽게 유도할 수 있기 때문에 무결성을 검증하기에는 부적합한 것으로 판단된다.
- 따라서, 위변조 여부 검증을 위해 해시 함수가 사용된다.
- 재판의 증거로 활용될 정도로 해시 함수의 출력값인 검증값이 신뢰될 수 있어야 한다.

• 해시 함수란?
- 임의의 길이의 입력값을 고정된 길이의 출력값으로 바꾸는 함수
- 임의의 입력 -> Hash -> 해시값
- 계산의 용이성이 반드시 존재해야 한다. 큰 값이 들어올 수 있다는 것을 전제로 함수가 동작을 해야 한다.
- 해시 출력값은 비교적 작은 값으로 정의되어야 한다. 하지만, 너무 작으면 문제가 된다. 해시 함수가 1비트의 결과를 낸다면 출력값은 0 또는 1이다. 3번의 입력값을 해시함수에 대입하는 것만으로 동일한 검증값을 찾을 수 있다. 검증값이 작아지면 동일한 검증값을 내놓는 입력값을 유추할 수 있다. 따라서 입력값을 유추하기에는 충분히 길어야 하지만 일반적으로 다루기에는 작은 값이어야 한다.

• 해시 함수의 개념
- 다른 입력에 대하여 같은 출력이 발생할 수밖에 없다. -> 충돌(clooision)이 발생함
- 충돌을 찾기 어렵도록 하는 것이 목적이다. (충돌을 발생하지 않게 하는 것이 목적이 아니다.)

 

◈ 해시함수의 성질

 

1) 충돌 저항성(Collision Resistance)
- hash(x)=hash(x’)을 만족하는 x와 x’을 찾는 것은 계산상 불가능

 


- 충돌 저항 = 출력값이 같아지는 다른 입력값을 찾기 어렵다
- 계산상 불가능? 계산이 효율적으로 할 수 있는 상황이면 가능하겠는데?
- 계산상 불가능하다는 것은 충분히 긴 길이의 해시값을 가지고 있다는 것을 내포한다.
- 계산 장비의 기술과 수가 늘어나고 있는 상황에서, 500년 후에도 힘들 정도로 설계했다고 주장하기에는 어렵다.
- 계산상 불가능하다는 것은 현재 또는 예측할 수 있는 범위내의 미래에 계산장비의 모임을 가지고 충돌을 찾는다고 하더라도 천문학적인 계산량이 들어간다는 것이다. 아예 할 수 없다는 것을 의미하는 것은 아니고 당장은 하기 힘들다는 것

 

2) 역상 저항성(Preimage Resistance)
- image : 입력을 정했고 함수에 집어 넣으면 결과물이 나온다. 이 결과물을 image라고 부른다.
- preimage는 이미지에 대응하는 입력값
- 주어진 해시값, 즉 출력값에 대응하는 입력값을 찾는게 어려운 것
- y=hash(?)에 대해 y를 해시값으로 가지는 임의 입력 x를 찾는 것은 계산상 불가능

 

 

3) 제2역상 저항성(Second Preimage Resistance)
- 주어진 x에 대하여 hash(x)=hash(x’)을 만족하는 x’을 찾는 것은 계산상 불가능

 

 

 

 


6-3. 블록체인과 해시함수

 

◈ 장부의 동기화

• 검증값을 이용한 장부 비교
- 블록체인은 분산 시스템에서 모든 노드가 동일한 장부를 유지, 관리
- 내가 가지고 있는 장부가 원본인가?


- 해시값이 변조되지 않았다는 전제하에서, 해시A와 해시B가 같다는 것은 두 개의 장부가 같다는 것을 의미한다.
- 내 거래가 포함되어 있는가?
장부에서 내 거래가 포함된 기록을 찾고, 장부와 비교하는 과정이 필요하다. 이 경우에는 해시값을 어떻게 해야 하나?
이전 경우는 원본과 사본을 비교함으로써 무결성을 찾는 것이었는데 전체 장부의 일부분을 비교하는 것에 해시함수를 효율적으로 사용할 수 있을까?
- 장부는 77만 가지고 있는 상황에서 내 거래 C가 포함됐는지를 어떻게 확인할 수 있을까?
루트인 77과 내 거래 C가 포함된 트리가 있는 내용만 보내주면 검증이 가능하다.

◈ 장부의 위변조

 

• 블록체인
- 블록을 체인으로 연결함. 블록에 포함되어 있는 것이 거래 내역. 블록 크기를 일정하게 유지하고 싶다고 하면 100건, 1000건 등 거래 건수를 정한다. 하나의 블록에 여러 개의 거래가 포함되어 있고 이 블록을 체인으로 연결한다.
- 블록은 순차적으로 생성 연결된다. (블록1 – 블록2 – 블록3)
거래의 순서가 바뀌게 되면 마이너스 계좌가 생길수도 있다.
- 블록1에는 거래 내용이 들어있고 블록1 해시값을 같이 가지고 있다.
- 블록2에는 블록1 해시값을 포함시키고 그 이후 거래들을 포함시키고 블록2를 만든 후 블록2 해시값을 붙인다.

- 블록 2에 포함된 거래 내용을 변조하면?

• 블록의 변조를 어렵게 만들려면?
- 해시 함수의 결과값을 아무나 만들 수 없도록 함.
- 블록 생성에 일정시간이 소요되도록 만듦

 

• 블록의 생성 : 채굴(Mining)
- 블록에 nonce 필드를 집어 넣는다. Nonce란 값을 계속 변경시켜서 넣을 수 있는 입력란.
- 블록에 대한 해시값을 얻을 때 nonce 값은 너가 바꿀 수 있는 대신 nonce필드가 들어간 블록의 값을 해시함수에 집어넣을 때 해시값은 특정 값보다 작아야해.
=> 작업증명(Proof of Work:Pow)

 


6강 강의 노트 끝-!

감사합니다 :)

*사진의 모든 출처 : http://www.kmooc.kr/

댓글