SW/블록체인

블록체인 : 해시함수, 디지털 서명, 암호학 관련 기법, 개념, 개요, 설명, 예제

얇은생각 2022. 1. 22. 07:30
반응형

해시 함수

해시 함수의 첫 번째 특징은 메시지 축약입니다. 입력 값으로 어떤 데이터를 넣더라도 동일한 크기의 출력 값을 도출해낸다는 점입니다. 정확히 말하면, 입력 값으로 어떤 크기의 데이터를 넣든, 어떤 타입의 데이터를 넣든 같은 사이즈의 출력 값이 출력됩니다.

 

블록체인 : 해시함수, 디지털 서명, 암호학 관련 기법, 개념, 개요, 설명, 예제 1

 

 

그림에는, 해시 함수의 입력 값 X와 출력 값 Y가 있습니다. 입력 값 X를 해시 함수를 이용해 해싱을 하면 출력 값 Y를 얻을 수 있습니다. 그림의 해시 함수 H를 SHA-256 해시 함수라고 가정해보겠습니다.

이 경우, 예시에 나와 있는 것처럼 소문자 하나를 입력하든, 긴 문자열을 입력하든 32바이트의 동일한 사이즈의 output을 만듭니다. 이와 같은 해시 함수의 성질을 이용하면 용량이 큰 원본 데이터의 사이즈를 많이 줄일 수 있습니다.

 

.블록체인 : 해시함수, 디지털 서명, 암호학 관련 기법, 개념, 개요, 설명, 예제 2

 

해시 함수의 두 번째 특징은 collision-free입니다. 이 뜻은 발생 가능한 충돌로부터 자유로울 수 있음을 의미합니다. 마찬가지로 SHA-256 해시 함수를 이용해 예를 들어보겠습니다.  모든 입력 값을 SHA-256 해시 함수를 이용해 해시 하는 경우, 출력 값의 범위는 2^256으로 제한됩니다. output은 2^256의 가능성을 가지는 반면, 왼쪽의 input은 매우 다양한 입력 값을 가질 수 있는 것입니다.

왼쪽에 있는 모든 포인트가 화살표로 매핑되어 오른쪽에 있는 지점으로 이동한다고 생각해본다면, 왼쪽의 포인트들이 오른쪽의 특정 포인트들에 여러 번 매핑될 수밖에 없다는 것을 알 수 있습니다. 무한대의 범위를 가지는 입력 값을 한정된 2^256 크기의 출력 값에 대응시키려면 충동이 발생할 수밖에 없습니다. 이때, 충돌이 적을수록 좋은 해시 함수라고 말할 수 있습니다.

암호화 해시 함수의 세 번째 특징은 비 대칭성입니다. 해시 결과인 Y값을 이용해 역으로 X값을 구하는 것이 불가능하다는 것입니다. 예제에서 볼 수 있듯이, 8과 9의 곱셈 결과를 계산하는 것은 매우 쉽습니다. 그러나 72의 결과값을 가지는 x와 y의 조합을 찾는 것은 그렇게 쉽지는 않습니다. 다양한 경우가 존재하기 때문입니다.

함수에서 추출된 값(Y)으로 원래 값(X)을 구할 수 없기 때문에 자신이 공개하길 원하지 않는 데이터를 다른 사람들이 못 보게 할 수 있습니다. 이게 바로 공개키에서 주소를 만들 때, 암호화 해시 함수를 이용하는 이유입니다.

 

 

 

해시 함수 종류

SHA-1 알고리즘은 임의의 길이의 입력데이터를 160bit의 출력 데이터로 바꿔줍니다. 이때 2^64보다 작은 입력 데이터를 다룹니다. SHA는 Secure Hash Algorithm의 약자로써 SHA를 보통 샤라고 부릅니다. SHA-256 알고리즘은 비트코인 시스템에서 사용하는 해시 함수입니다.

앞서 예제에서 설명해 드렸던 것처럼, 256bit의 데이터를 생성합니다. 다음으로는 이더리움에서 채택한 keccak256이라는 해시 함수가 있습니다. 256bit의 출력 값을 생성하지만, 실제 이더리움에서 사용될 때에는 처음 96bit를 버리고, 나머지 160bit를 활용합니다.

 

 

 

해시 포인터

해시 포인터는 정보가 저장된 곳을 가리키는 일종의 포인터이며, 마지막으로 기억하는 데이터의 해시값이기도 합니다. 그렇다면 이 해시 포인터를 무엇에 활용할 수 있을까요? 이 해시 포인터를 이용하면 우리가 원하는 정보를 다시 요청할 수 있습니다. 이러한 특징은 우리가 기존에 알고 있던 포인터의 성질과 유사합니다. 또한, 해시가 가리키고 있는 데이터가 변경되었는지 검증하는 데 사용할 수 있습니다.

해시 함수의 성질에 따라, 데이터가 변경되면 데이터의 해시 값이 변하기 때문에, 해시 포인터가 가리키는 해시 값과 데이터의 해시 결과가 일치하지 않습니다. 이를 통해 데이터의 위변조를 검사할 수 있게 됩니다.

 

블록체인 : 해시함수, 디지털 서명, 암호학 관련 기법, 개념, 개요, 설명, 예제 3

 

해시 포인터를 이용한 링크드 리스트 구조를 통해 해시 포인터의 특징에 대해 조금 더 자세히 살펴보도록 하겠습니다. 링크드 리스트로 연결된 모든 블록은 리스트 내의 이전 블록을 가리키는 해시 포인터를 가지고 있습니다. 이러한 구조는 리스트 내의 데이터 변조를 감지할 수 있습니다.

예를 들어, 26번째의 블록이 생성된 와중에, 악의적인 노드가 23번 블록의 데이터를 변조하려고 시도합니다. 그리고 23번째 블록의 데이터를 변경을 하였습니다. 이렇게 되면, 해시 함수의 collision free 성질에 따라 23번 블록의 해시 값이 변경이 됩니다.

따라서 24번 블록 내부의 23번 블록을 가리키는 해시 포인터 값과 실제 해시 값 사이에 불일치가 생깁니다. 더 이상 24번 블록 내의 해시 포인터가 실제의 23번 블록을 가리키지 않습니다. 만약 이러한 문제를 해결하기 위해 24번 블록 내부의 해시 포인터 값을 변경하면 어떻게 될까요?

악의적인 노드는 또다시 24번 블록의 해시 포인터 값을 수정하여 실제 해시값과 일치시키려고 수정을 시도합니다. 하지만 이 경우, 24번 블록의 데이터가 변경됩니다. 따라서 24번 데이터의 해시 값과 25번 내부의 해시 포인터 사이의 불일치를 감지하게 됩니다. 이러한 메커니즘에 의해, 기존의 데이터를 추후에 변경시키는 것이 매우 어렵습니다.

 

 

 

대칭키 알고리즘

블록체인 : 해시함수, 디지털 서명, 암호학 관련 기법, 개념, 개요, 설명, 예제 4

 

다음으로, 블록체인의 거래 검증 과정에서 사용되는 디지털 서명을 설명해 드리기에 앞서, 기본적인 암호화 기법에 대해 설명 드리겠습니다. 우선, 원본 데이터를 특정 알고리즘을 이용해 변조하여, 알아볼 수 없는 형태로 만드는 것을 암호화라고 합니다.

영어로는 encryption이라고 합니다. 복호화는 암호화의 역행되는 과정으로, 암호화된 데이터로부터 원본 데이터를 복원하는 과정을 말합니다. 영어로는 decryption이라고 부릅니다. 암호화 체계는 암호화 키와 복호화 키가 일치하는지 여부에 따라 대칭형 키 암호화 기법과 비대칭형 암호화 기법으로 나뉩니다.

먼저 소개해 드릴 것은 대칭키 알고리즘입니다. 영어로는 Symmetric key 알고리즘이라고 합니다. 해당 알고리즘에서는 하나의 키만을 이용합니다. 데이터를 암호화, 복호화할 때, 같은 키를 이용하여 데이터를 변환합니다. 그림 왼쪽의 Plain text는 아무 변조가 가해지지 않은 원본 데이터를 의미합니다. 이 문서는 누구나 볼 수 있는 문서로, 읽을 수 있는 형태라고 이해하시면 되겠습니다. 반면 오른쪽의 Cipher text는 대칭키에 의해 암호화된 문서로, 내용을 알아볼 수 없는 문서입니다.

대칭키 알고리즘은 그림에서 확인할 수 있는 것처럼, 암호화와 복호화를 할 때 동일한 대칭키를 사용합니다. 대칭키 알고리즘은 뒤에서 설명 드린 비대칭 키와 비교하여 계산 속도가 빠르다는 장점이 있습니다. 대칭키 알고리즘의 대표적인 예로는 트리플데스(3DES)나 AES 같은 알고리즘들이 있습니다.

 

 

 

비대칭키 알고리즘

블록체인 : 해시함수, 디지털 서명, 암호학 관련 기법, 개념, 개요, 설명, 예제 5

 

다음은 비대칭 키 알고리즘입니다. Asymmetric key 알고리즘이라고 합니다. 이 알고리즘에서는 서로 다른 두 개의 키를 이용합니다. 공개키(public key)와 개인 키(private key)라고 하는 두 개의 키가 바로 이 알고리즘에서 사용되는 키들입니다. 공개키는 말 그대로 공개적으로 알려져 있는 키로써, 누구나 이 공개키를 얻을 수 있습니다.

반면 개인 키는 개인 혼자만 소유하는 키로, 누구에게도 공유하지 않습니다. 이러한 알고리즘을 Public Key Encryption 알고리즘이라고도 합니다. 이 두 가지 키를 가지고 공개키 암호화 또는 전자서명에 이용할 수 있습니다. 공개키 암호화는 그림에 나와 있는 과정처럼 공개키를 이용해 데이터를 암호화하고, 개인 키를 이용해 원본 데이터로 복원합니다.

개인 키를 가진 사용자만 공개키로 암호화된 데이터를 확인할 수 있기 때문에 문서를 특정 사용자를 위해 암호화하는 데 사용됩니다. 전자서명은 특정 사용자가 문서를 보냈다는 것을 증명, 또는 검증하기 위한 시스템입니다. 전자서명을 위해 개인 키로 암호화된 문서를 제공합니다. 공개키로 이 문서를 복호화해서 풀리면, 전달받은 데이터가 해당 사용자가 보낸 문서임을 증명할 수 있게 됩니다. 대표적인 비대칭 알고리즘으로는 RSA가 있습니다.

 

 

 

디지털 서명

블록체인 네트워크상에서 거래를 발생시킬 때, 거래를 검증하기 위해 사용되는 디지털 서명 기술에 대해 설명하겠습니다. 디지털 서명은 문서에 하는 인감 날인 또는 사인에 해당하는 기능을 컴퓨터의 세계에서 실현하기 위한 기술입니다. 전자서명이 가져야 할 보안 요구사항을 다음과 같이 정의하고 있습니다.

첫 번째, 위조 불가입니다. 디지털 서명은 본인 이외에 아무도 흉내 내서는 안 됩니다. 두 번째, 인증. 해당 서명이 나의 것인지 확인할 수 있어야 합니다. 세 번째는 재사용 불가. 네 번째, 변경 불가. 서명된 문서에 관해서 내용을 변경할 수 없습니다. 만약 내용이 변경되었다면 서명할 당시의 데이터와 다르다는 것을 알아챌 수 있어야 합니다. 다섯 번째, 부인 방지. 서명자가 자신의 문서임을 입증하기 위해서 서명해 놓고 나중에 부인할 수 없다는 것입니다.

전자서명은 크게 서명(Signing)과 인증(Verification) 두 가지 과정으로 나뉩니다. 서명은 문서가 검증되었음을 알리는 과정이고, 인증은 독자가 해당 문서에 서명이 되었는지를 확인하는 과정입니다. 메시지에 서명할 때에는, 오직 자신의 개인 키만을 이용해 서명합니다. 따라서 개인 키를 분실하지 않도록 매우 주의해야 합니다.

검증할 때는 서명자의 공개키를 이용합니다. 이때 누구나 해당 공개키를 이용해 메시지를 검증할 수 있습니다. 이 알고리즘의 핵심은 원본 데이터가 아닌, 메시지를 해시한 해시 값과 서명자의 개인 키를 이용해서 서명을 생성한다는 것입니다. 원본 데이터의 크기가 클 경우 서명하는 데에 시간이 오래 걸리고 정보의 양이 많아지게 되므로 메시지의 길이를 줄이기 위해 해시 함수를 사용합니다. 또한, 해시 함수를 사용하면 원본 데이터가 변하지 않았다는 메시지의 무결성을 보장할 수 있습니다.

 

 

 

디지털 서명 과정

블록체인 : 해시함수, 디지털 서명, 암호학 관련 기법, 개념, 개요, 설명, 예제 6

 

앨리스가 밥에게 디지털 서명 방식을 이용하여 메시지를 전송하고자 할 때, 앨리스는 자신의 개인 키를 이용해 메시지에 서명합니다. 이때, 원본 데이터 자체를 암호화하는 것이 아니라 해시 함수를 이용해 해시한 메시지에 개인 키로 서명을함으로써 암호화합니다.

앨리스의 개인 키로 서명된 문서는 앨리스의 공개키를 이용해서만 복호화할 수 있습니다. 앨리스는 암호화한 해시 데이터와 원본 메시지를 함께 밥에게 보냅니다. 밥은 앨리스로부터 받은 문서가 진짜 앨리스가 서명한 문서인지 검증해야 합니다. 검증을 위해 서명 부분을 따로 떼내어 앨리스의 공개키(Public key)로 복호화(Decryption)합니다.

그리고 서명된 문서와 함께 전달받은 원본 데이터를 앨리스가 사용한 것과 동일한 해시 함수를 이용하여 해싱합니다. 원본 데이터의 해시값과 앨리스의 서명을 앨리스의 공개키를 이용해 복호화한 값이 일치하는지 확인합니다. 두 값이 일치한다면 해당 문서는 앨리스에 의해 서명된 문서이고, 그렇지 않으면 서명되지 않은 문서입니다.

 

 

 

전자 서명을 위한 API

여기에 전자서명을 위해 필요한 세 가지 동작들이 명시되어 있습니다. 첫 번째 API는 개인 키, 공개키로 이루어진 키 쌍을 만들 수 있는 generateKeys라는 함수입니다. 이 함수는 sk(secret signing key)와 pk(public verification key)라고 하는 두 개의 키를 생성하는데, sk는 서명에 사용되는 개인 키, pk는 검증에 사용되는 공개키입니다. 아무나 서명을 검증하는 데 공개키를 이용할 수 있습니다.

두 번째는 서명을 위한 함수 sign입니다. 개인 키 sk와 원본 메시지를 인자로 넣으면 sig라고 하는 서명을 반환합니다. 세 번째는 검증을 위한 함수 verify입니다. 유효한 서명인지 아닌지 확인하고자 하는 sig와 원본 메시지, 그리고 개인 키로 서명된 원본 데이터를 풀기 위한 공개 키인 pk가 인자에 포함됩니다.

 

 

 

참조

http://www.kmooc.kr/courses/course-v1:POSTECHk+CSED490U1+2021_T1/about 

 

블록체인 입문

블록체인과 암호화폐 기술을 깊이 배우기에 앞서, 비 전공자들도 이해를 할 수 있는 수준으로 블록체인과 암화화폐에 대한 high-level 설명 및 응용 예시를 제공하고 실제 상황에 적용할 수 있다.

www.kmooc.kr

반응형