12. 암호화 기법을 소개합니다
블록체인에서 비대칭 암호화 기법은 사용자를 식별하고 자산을 보호하는 근간을 이룬다.
목표
고유한 소유자와 자산을 식별하고, 법적으로 허가된 사람만 그 자산에 접근할 수 있도록 보장한다.
해결해야 할 과제
블록체인은 완전 개방된 P2P 시스템이고, 누구나 접속해서 계산 자원에 기여하고 새로운 트랜잭션을 시스템에 제출할 수 있다. 단, 소유권을 다른 계정으로 이전할 권리는 오직 그 계정의 소유자에게 국한된다. 분산 시스템의 개방형 아키텍처를 해치지 않으면서 계정에 할당된 자산을 보호하는 것이 중요한 과제이다.
아이디어
누구나 자산을 보낼 수 있지만 모인 자산에는 계정의 소유자만 접근할 수 있다. 이를 공개-개인-키 암호화
라고 하는데 소유권을 이전할 수 있는 계정을 식별할 때는 누구나 공개 키를 사용하고, 접근은 해당 개인 키를 가진 사람에게만 허용된다. 어디에나 있고 개방되어 있지만 열쇠가 있는 사람만이 열 수 있는 우편함의 성질과 같다.
암호화 기법의 주요 아이디어
허가받지 않은 사용자의 접근으로부터 데이터를 보호하고, 이를 위해 사용하는 것을
키(key)
라 한다.
암호화
: 문을 잠그는 것의 디지털 구현복호화
: 문을 여는 것의 디지털 구현데이터 보호화 데이터 보호 해제
: 암호화와 복호화암호문
: 암호화된 데이터과정
:암호화 키를 사용해 암호문 생성
->암호문의 보관 또는 전송
->암호화 키를 사용해 복호화
->원시 데이터 복원
대칭 암호화 기법
데이터를 암호화하고 복호화할 때
동일한 키
를 사용.
동일한 키를 사용했기 때문에 암호화한 키가 있으면 동시에 복호화할 수 있는 키도 가지는 셈이다. 따라서 바람직하지 못하고 그래서 비대칭 암호화 기법이 발명되었다.
비대칭 암호화 기법
두 개의 상호보완적 키
를 사용.
- 두 키중 하나를 사용해 생성된 암호문은 오직 다른 하나의 키로만 복호화되고, 그 반대도 마찬가지이다.
- 암호문을 생성할 때 사용한 키로는 절대 암호를 복호화할 수 없다.
- 암호화 복호화를 할 때 항상 두 개의 키를 모두 가지고 있어야 한다. 둘 중 하나만 있으면 하는 일이 제한적이다.
- 암호문의 생성은 하나의 키만 있어도 언제든 가능하지만 상호보완적 쌍을 이루는 다른 키가 없다면 생성된 암호문을 복호화할 방법은 없다.
- 두 개의 키가 암호문을 생성할 수 있는 사람, 복호화할 수 있는 사람의 두 그룹으로 분리할 수 있게 해준다.
- 암호화 복호화의 역할은 서로 바뀔 수 있지만 개인 키와 공개 키의 역할은 절대 바뀔 수 없다. 공개 키는 비가역적 함수를 통해 개인 키로부터 생성된 것이다.
실생활에서 비대칭 암호화 기법을 사용하는 방법
1. 키의 생성과 배분
보통 두 개의 키 각각의 역할을 나타내는 특별한 이름을 붙인다. 그래서 비대칭 암호화 기법을 공개-개인-키(공개-비밀-키)
라고 부른다. 공개 키는 신뢰 여부와 상관없이 누구에게나 주어지기 때문에 누구나 공개 키의 복사본을 가질 수 있고, 개인 키는 안전하게 사적으로 보관해야 한다. 아래는 비대칭 암호화 기법 응용프로그램의 수행 단계이다.
- 암호화 소프트웨어를 사용해서 개인 키를 생성한다.
- 상호보완적인 공개 키를 생성한다.
- 개인 키는 간직한다.
- 공개 키는 모두에게 배부한다.
2. 키의 사용
1. 공개 -> 개인
공개 키
: 정보를암호화
개인 키
: 정보를복호화
누구나 암호문을 생성할 수 있지만 개인 키를 가진 소유자만이 암호문을 복호화하고 메시지를 읽을 수 있다.
2. 개인 -> 공개
공개 키
: 정보를복호화
개인 키
: 정보를암호화
공개 키의 복사본을 가진 사람은 누구나 메시지를 읽을 수 있지만 모두에게 공개할 메시지는 오직 개인 키를 가진 소유자만이 생성가능하다. 저작권 증명에 주로 사용하면 좋다.
블록체인에서 비대칭 암호화 기법은 언제 쓸까?
- 계정 식별
- 트랜잭션 승인
1. 계정 식별
- 소유자와 자산의 매핑 유지를 위해 사용자와 사용자 계정을 모두 식별해야 한다.
공개 -> 개인 접근 방식
을 사용해서 사용자 계정을 식별하고, 사용자가 소유권을 이전한다.- 블록체인의 계정 번호는 공개 암호 키라서 공개된 주소를 통해 누구나 메시지를 전송할 수 있다.
2. 트랜잭션 승인
- 소유권 양도에 관한 내용에 그 소유권자가 동의했는지를 증명하는 데이터를 항상 포함한다.
개인 -> 공개 접근 방식
과 유사하여, 소유자는 개인 키를 사용해 암호문을 생성하고, 다른 모든 사람은 공개 암호 키를 사용해 거래를 증명할 수 있다.- 공개 암호 키는 소유권을 이전하려는 계정 번호와 같다.
13. 노드 여러분, 트랜잭션을 승인합니까?
디지털 서명 만들어 검증에 사용하기. 자필 서명과 유사하게 전자 원장에 트랜잭션에 동의한다고 표시한다.
개별 트랜잭션의 보안
을 위해 절대적으로 중요하다.
목표
계정의 소유자 또는 합법적 소유자만 계정 내 자산을 다른 계정으로 이전할 수 있도록 보장한다.
해결해야 할 과제
합법적 소유자로만 이전 권한 제한 + 개방성 유지
P2P 시스템은 누구에게나 개방되어 있어 모든 사람이 트랜잭션을 생성하고 시스템에 제출할 수 있지만 이전은 계정의 합법적 소유자만이 가능하다.
아이디어
자필 서명의 기능을 디지털 버전으로 만들어 계정을 식별, 인증, 허가를 가능하게 한다.
디지털 서명의 주요 기능 알아보기
개인 -> 공개 방식의 정보 흐름을 활용한다.
디지털 서명의 3대 주요 요소
- 서명의 생성
- 특정 데이터에 대한 프로세스가 시작되면 입력된 데이터에 해당하는 해시값을 생성하고, 개인 키를 사용해서 암호화한다. 해시값의 암호문이 바로 디지털 서명이다.
- 고유한 개인 키를 사용해 생성되었기 때문에 누가 생성했는지 특정할 수 있다.
- 특정 데이터의 디지털 지문(해시값)에 의해 생성되었기 때문에 고유한 데이터이다.
- 서명을 이용한 데이터 검증
- 모든 사람이 나의 공개 키를 활용하여 암호문으로부터 복호화된 값을 얻을 수 있다.
- 메시지 수신자는 받은 데이터의 해시값을 스스로 계산해본다.
- 수신자가 계산한 해시값과 복호화된 값이 일치하면 수신자는 아래의 두 가지 사실을 알 수 있다.
- 나의 공개 키를 사용해 서명을 복호화할 수 있었기 때문에 내가 서명한 것이다.
- 복호화된 암호문이 최초에 보내려고 했던 데이터의 해시값과 일치한다.
- 서명을 이용한 사기 판별
- 메시지 수신자가 받은 데이터의 해시값을 스스로 생성한다.
- 공개 키를 이용해 디지털 서명을 복호화하여 복호화된 원래 데이터 해시값을 얻는다.
- 수신자가 계산한 해시값과 복호화하여 얻은 해시값이 다르면 이는 문제가 있다.
작동원리
- 트랜잭션 데이터는 계정의 소유자가 소유권을 이전하는 데 동의했다는 사실을 알려준다
- 트랜잭션의 전체 내용은 고유하므로 서명한 사람의 동의 없이 다른 트랜잭션의 서명으로 사용할 수 없다. 트랜잭션 내용이 바뀌면 소유자가 새로 서명을 생성해야 한다.
- 소유권을 이전하려는 계정의 소유자만이 서명을 생성할 수 있다.
- 누구나 쉽게 검증할 수 있다.
블록체인에서 디지털 서명의 용도
트랜잭션 서명
- 트랜잭션에 필요한 모든 정보를 기술
- 트랜잭션 데이터의 암호화 해시값 생성
- 소유권을 이전하려는 계정의
개인 키
를 사용해 트랜잭션의 해시값 암호화 - 암호문을 트랜잭션에 디지털 서명으로 첨부
트랜잭션 검증
- 서명을 제외하고 검증한 트랜잭션 데이터의 해시값 생성
- 검증하려는 트랜잭션의 디지털 서명 복호화
검증된 트랜잭션 데이터의 해시값
과검증하려는 트랜잭션의 디지털 서명을 복호화한 두 값
을 비교한다. 값이 동일하면 소유권을 이전하려는 계정에 해당하는 개인 키 소유자가 승인한 트랜잭션이고, 다르면 그렇지 않다.
14. 블록체인-데이터-구조를 만들어봅시다
전체 트랜잭션 데이터 구축 및 유지하기
목표
전체 트랜잭션 이력을 정렬 상태로 유지한다.
해결해야 할 과제
모든 트랜잭션 데이터를 발생 순서를 유지하면서 어떠한 변경이 있을 경우 재빨리 감지할 수 있도록 저장한다.
아이디어
- 트랜잭션이 추가된 순서대로 정렬괸다.
- 데이터는 해시 참조를 사용해 변경-감지 방식으로 저장된다.
책을 블록체인-데이터-구조로 변환하기
- 페이지 의존성을 분명히 드러내기
책에서 페이지는 번호가 연속되는지 검증하여 어떤 페이지가 없는지 바로 알 수 있다. 특히 각 페이지에 현재 번호와 직적 페이지 번호를 같이 표시하게 되면 현재 페이지와 직전 페이지 사이의 종속관계를 형성하여 어떤 방식으로 페이지 번호를 매기던 사라지 페이지를 탐색할 수 있다. - 내용과 페이지 번호 분리하기
책의 한 페이지는 내용과 페이지의 번호로 구성된다. 여기서 페이지에 있는 내용을 덜어낸 후 그 내용이 어디있는지에 대한 참조값만을 남긴다. - 페이지 번호를 참조값으로 대체하기
내용 뿐 아니라 페이지 번호도 참조값으로 대체한다. - 참조값 생성하기
암호화 해시값을 사용해서 고유한 참조값을 생성한다. 책의 페이지 참조값은 페이지의 내용(내용 참조값과 앞 페이지 참조값)에 기반해 계산한다. - 책등 없애기
책등을 없애서 페이지 정렬이 엉망이 되었다고 해도 각 페이지가 앞 페이지의 참조값을 가지고 있기 때문에 이를 이용해서 페이지에서 페이지로 역으로 추적해 순서를 알아낼 수 있다.
목표 달성: 결과 평가
- 정보 저장으로부터 순서를 분리하고, 페이지의 물리적 위치로부터 논리적 위치(순서)를 분리해 냈다.
- 참조값으로 해시값을 사용했기 때문에 누구나 간단한 계산을 통해 정확성을 검증할 수 있다.
- 페이지들은 더 이상 책등에 붙어있지 않으므로 오직 직전 페이지 참조값을 이용해 페이지에서 페이지로 거꾸로 탐색할 수 밖에 없다.
변환된 책으로 블록체인-데이터-구조 이해하기
변환된 책 | 블록체인-데이터-구조 |
---|---|
순서일람표의 페이지 | 블록 헤더 |
전체 순서일람표 | 블록 헤더의 체인 |
순서일람표의 페이지 참조값 | 블록 헤더의 암호화 해시값 |
내용 | 트랜잭션 데이터 |
내용 페이지 | 트랜잭션 데이터를 가진 머클 트리 |
내용 페이지를 가리키는 참조값 | 트랜잭션 데이터를 가진 머클 트리의 루트 |
순서일람표 페이지와 해당 내용 페이지로 구성된 가상의 단위 | 블록체인-데이터-구조의 한 블록 |
전체 순서일람표와 전체 내용 페이지 | 블록체인-데이터-구조 |
- 순서일람표 페이지와 해당 내용 페이지로 구성된 가상 단위
전자는 해시 참조를 통해 후자를 참조함으로써 가상의 한 단위를 형성한다. 이것을 블록이라 하고, 블록들이 모두 모여 블록체인-데이터-구조를 형성한다. - 순서일람표라 불리는 페이지 더미
블록체인-데이터-구조 내 단일 블록 헤더와 동일하다. 참조를 통해 선형으로 연결되어 블록 헤더의 체인을 형성한다. 트랜잭션 데이터를 직접 저장하지 않고 해당 트랜잭션 데이터에 대한 해시 참조만 저장한다. - 내용을 담고 있는 페이지 더미
변환된 책의 내용은 블록체인에 의해 유지되는 트랜잭션 데이터와 같다. 다만 이는 이해를 돕기 위한 개념이며, 실제 블록체인 응용은 내용 데이터(트랜잭션 데이터)를 머클 트리라 불리는 데이터베이스에 직접 저장하고, 머클 트리의 루트는 블록 헤더에 저장된다. - 순서일람표 페이지를 식별하고 연결할 페이지 참조값
페이지 참조값은 블록체인-데이터-구조 내 개별 블록 헤더의 암호화 해시값과 같다. 블록 해시 또는 이전 블록의 해시라 불리고, 각 블록 헤더를 고유하게 식별하고 이전 블록 헤더를 참조하기 위해 사용된다. - 내용 페이지를 식별하고 연결할 내용 참조값
연계된 트랜잭션 데이터를 가리키는 블록 헤더의 해시 참조와 같다. 블록 헤더에 저장된 내용 참조값은 데이터베이스에 저장된 트랜잭션 데이터의 머클 트리 루트이다.
블록체인-데이터-구조에서 트랜잭션 저장하는 방법
각 블록은 블록 헤러를 가지고 있고, 이전 블록이 있으면 이전 블록 헤더를 가리키는 해시 참조를 가지고 있다. 다시 말하면 각기 다른 두 개의 머클 트리를 가리키는 해시 참조를 가지고 있다. 그리고 머클 트리 루트의 이름을 보며 이들이 가진 트랜잭션 데이터가 무엇인지 짐작할 수 있다. P2P 시스템을 생각해보면, 이 시스템에 참여했을 때 전체 트랜잭션 데이터, 모든 해시 참조값, 모든 블록헤더를 수신하게 된다. 즉 로컬 컴퓨터는 데이터를 모두 저장하고 저장된 데이터들을 가리키는 해시 참조를 가진 블록체인-데이터-구조를 생성한다. 여기서 주의할 점은 블록체인-데이터-구조에 각자의 헤더를 가진 수많은 블록이 존재하지만 전체 블록체인-데이터-구조는 오직 하나의 헤드만 가진다는 점이다.
15. 잘 뜨개질된 블록체인, 어떻게 변경할까?
새로운 트랜잭션 추가하기
최초의 블록체인-데이터-구조는 단 두 개의 트랜잭션만 가지고 있는데, 새 트랜잭션 데이터를 추가하려면 다음의 세 단계를 수행한다.
- 새로 추가하려는 모든 트랜잭션 데이터를 담고 있는
새 머클 트리 생성
- 이전 블록 헤더를 가리키는 해시 참조와 새로운 트랜잭션 데이터를 담고 있는 머클 트리의 루트를 포함하는
새 블록 헤더 생성
새 블록을 카리키는 해시 참조를 만들고 블록체인-데이터-구조의 헤드 갱신
변경 감지하기
블록체인-데이터-구조 내 변경이 발생하면 연쇄 반응을 일으켜 즉시 감지 가능하고, 변경 발생 유형은 아래와 같다.
- 트랜잭션 데이터의 세부 사항 변경
- 머클 트리의 트랜잭션을 변경하고, 해시 참조를 변경
- 머클 트리의 트랜잭션과 그 해시 참조를 통째로 대체
- 머클 트리 루트를 변경
- 블록 헤더 참조를 변경
위의 유형들처럼 트랜잭션이 하나 변경되면 부모 노드를 따라 연쇄반응을 일으켜 블록 헤더값이 변경된다. 이는 자신을 참조하는 블록의 헤더값에 영향을 끼치므로 모든 값에 영향을 미친다. 따라서 제대로 된 방법으로 데이터를 변경하려면 전체 해시 참조 연결고리를 모두 갱신해야하는데, 이는 변경된 데이터를 직접 가리키는 해시 참조로부터 시작하여 가장 최근 블록 헤더를 가리키는 해시 참조까지 모든 해시 참조를 갱신하여 변경 내용을 반영한다는 것이다.
의도한 변경 vs 의도하지 않은 변경
해시 참조의 성질에 의해 블록체인-데이터-구조의 해시 참조는 의도된 변경, 의도하지 않은 변경을 구분하지 않고 동일하게 인식한다. 그리고 의도와 상관없이 어느 해시 참조 중 하나라도 유효하지 않으면 전체 데이터 구조가 무효화된다.
References
[블록체인 무엇인가?] 다니엘 드레셔 지음