어제 글을 너무 많이 봐주셔서 깜짝 놀라고 있습니다. 정말 감사드립니다~
여행글을 더 많이 써야하나...살짝 고민했지만 사람이 추억으로만 살 수 없겠죠?ㅎㅎ(여행글 밑천은 금방 드러날 거고)
오늘은 공개키와 개인키 같은 열쇠 메커니즘에 대해 글을 쓰려고 했으나....
간단하게 정리하면 너무 금방 끝날 거 같고(글실력의 부족...) 더 들어가자니 저에게도 너무 어렵고(지식의 부족..) 해서 주제를 살짝 틀었습니다.
백서글(3)에서 공개키와 개인키에 대해서 간략하게 알아봤었습니다. 간단하게 말하면 암호화 과정이고 그 암호화에 쓰이는 해시함수 중 하나가 SHA256이라는 놈이었습니다. 근데 저희는 이 SHA256이라는 놈을 또 본 적이 있죠. 바로 블록을 해시해서 다음 블록에 담는다든가 블록 생성을 위해 목표값을 찾는 과정에서 SHA256이라는 해시 함수를 사용한다는 것을 알았습니다. 머클트리를 만드는 과정도 이 함수를 통한 해시의 연속이었죠. 여기저기 다 해시를 해대는 통에 이 해시함수에 대해서 알아야할 거 같긴 한데 이게 수학이라서.ㅎㅎ
그래두 얇게라도 알아봐야겠죠?^^
우선 암호화 해시 함수에는 3가지 전제가 있다고 하는데 다음과 같습니다.
X를 넣어서 Y를 구하는 해시함수 f(X) = Y 가 있다고 치고,
역상저항성 : 역으로 Y 값으로 X를 구하는게 거의 불가능해야한다는 이야기입니다.
제 2역상 저항성
충동저항성 : 이 두개는 저한테는 비슷한 의미로 다가오는데 둘 다 입력값(X)이 달라지면 완전히 다른 Y값이 나온다는 것을 전제로, 2번은 해시함수를 바꾸기 전에는 다른 X 값으로 Y값을 구하기 힘들다는 것이고 3번은 같은 Y값을 가지는 다른 X값 2개를 찾기 힘들다는 것입니다.
말로만 저렇게 써 놓으면 이해해기가 쉽지는 않습니다.
아무튼 암호화 해시함수가 저런 특성을 가졌다고 하니 네 알겠습니다~ 하고, 이 암호화 해시함수를 블록체인에서 왜 쓰는 지 그리고 어떻게 쓰이는 지 알면 이해가 더 쉬울 거 같습니다. 이 과정은 암호화 해시함수를 쓰는 블록체인의 특성을 설명하는 일도 되겠네요.
그럼 왜 암호화 해시함수를 쓰는지 이것도 정리하고 넘어갈게요.
해시함수는 어떤 데이터를 넣든 똑같은 크기(길이)의 값이 나오기 때문입니다. 정확히는 32바이트라고 하네요. 이렇게 똑같은 크기가 나오면 데이터 용량을 줄이는 데 용이하겠죠. 머클 트리 공부하면서 봤듯이 거래 내역 같은 경우 용량이 큰데 이걸 32바이트로 압축할 수 있으니까요.
위의 전제 1번에서 보다시피 암호화 해시함수는 함수에서 추출된 값(Y)으로 원래 값(X)을 구할 수 없기 때문에(이걸 비대칭이라고 합니다.) 자신이 공개하길 원하지 않는 데이터를 다른 사람들이 못 보게 할 수 있습니다. 이게 바로 공개키에서 주소를 만드는 데 이 암호화 해시함수를 사용하는 이유죠.
블록체인은 이제까지의 기록을 해시상태로 저장해서 검증하게 만들었습니다. 그런데 저 원래값(X)을 바꿔도 똑같은 Y값을 구할 수 있다면 아무도 모르게 사기를 칠 수 있겠죠. 하지만 위의 전제 2, 3번에 의해 원래 값(X)을 자기 맘대로 바꾸고 똑같은 결과(Y)를 구하는 게 거의 불가능하기 때문에, 하나의 거래내역을 건드리게 되면 바로 그 해시값이 바로 바뀌게 되고 암호화 해시함수로 연결되는 그 다음 기록들의 값이 전부 바뀌게 됩니다. 그럼 이 바뀐 기록들은 정당한 노드들에 의해 거부되겠죠. 자기가 가지고 있는 블록의 내용과 다를 테니까요. 암호화 해시 함수라는 장치 하나로 건드릴 수 없는 기록을 만드는 겁니다.
이유를 대략적으로 설명했으니 SHA256 함수가 쓰이는 것 봤던 세 가지 경우에 대해 알아보겠습니다.
키 생성과정은 개인키에서 공개키를, 공개키에서 주소를 만든다고 백서글(3)에서 설명드렸습니다.(정확히는 링크글이 설명해드렸습니다.ㅎㅎ)
우선 가장 중요한 개인키가 있어야겠죠.
개인키는 인과관계가 없는 숫자를 나열하는 난수생성기라는 메커니즘을 사용하여 256비트 크기의 무작위 숫자를 만들어냅니다. 단순히 생각하면 그냥 노트에 아무 숫자나 막 적는 것과 비슷하죠. 이 256비트 크기의 숫자를 base58check 라는 장치로 코딩을 하면 저희가 지갑에서 볼 수 있는 개인키가 형성됩니다. 저 base58check는 영대문자(26개), 소문자(26개), 숫자(10개) 중에서 정말 어쩔 수 없이 주소를 직접 쓰는 사람들을 위해 헷갈리기 쉬운 0(숫자 0), O(대문자 O), l(소문자 l), I(대문자 I)를 뺀 58개의 글자로 원래 데이터를 짧게 만드는 거라고 생각하시면 됩니다.
공개키를 만드는 방법은 타원곡선 곱셈 함수라는, 설명에 한글보다 숫자가 많은 어떤 방법으로 만든다고 합니다.
전 문과생이라..이건 도저히...그래두 숫자보다 글이 많은 설명이 있어서 링크만 하겠습니다. @icoreport님의 글 이것도 역추적이 힘들다고 하니 간단하게 암호화 함수라고 생각하고 넘어갑니다.
그럼 공개키를 만들었으니 주소를 만들어야겠죠. 이 주소를 만드는 과정에서 저 SHA256 함수와 RIPEMD160이라는 함수가 들어갑니다. 공개키를 우선 SHA256함수로 해싱하고 그 결과값을 다시 RIPEMD160이라는 함수로 해싱하면 160비트(20바이트) 크기의 숫자가 생성됩니다. 이렇게 두번을 하는 이유는 크기를 256비트에서 160비트로 줄일 수 있을 뿐 아니라 보안상도 더 좋다고 하네요. 이렇게 160비트 크기의 숫자를 위에 개인키와 같이 base58check에 넣어서 저희가 알고 있는 거 같은 13UbfK4dX7nhypePmob3SLvy4Z3JuSQtsM 이런 주소를 만드는 것입니다.
이렇게 만든 공개키와 주소는 타원곡선 곱셈함수의 특성 그리고 SHA256이라는 암호화 함수의 특성 상 원래 값을 알아내기가 사실상 불가능합니다. 이 주소로부터 두단계를 올라가서 개인키를 알아내는 건 불가능이라고 봐야겠죠. 이런 암호화 해시함수 덕에 주소는 걍 공개되도 제 제산에는 전혀 상관없는 정보가 되는 거죠.
블록체인 인포에도 주소는 버젓이 공개됩니다. 단지 이 주소가 누구껀지는 모르죠.(비트코인을 어마어마하게 들고 있는 유명인들 주소는 알기도 하더군요..)
거래의 방식 관련글에서 입력값에는 개인키와 공개키로 만든 전자서명이, 출력값에는 받는 사람의 공개키가 들어간다고 말씀드렸습니다. 받는 사람의 공개키를 보내는 사람이 안다는 것은 이미 공개가 되었다는 의미겠죠. 공개가 되어도 위와 같은 암호화 구조를 가지고 있으면 보내는 사람이 받는 사람의 개인키를 알 수 없기 때문에 지갑에 있는 자산은 건드릴 수 없으니까요.
반대로 말해서 개인키를 도난 당하면? 내 꺼! 라고 할 수 있는 건 없게 됩니다. 스팀잇에서 개인키에 해당하는 마스터키를 잘 보관하라고 5번이나 설명하는 이유죠.
SHA256함수의 두 번째 용도는 블럭을 해시할 때와 머클트리였습니다. 블록을 생성할 때 이전 블록을 이 SHA256함수로 해싱해서 그 해시값을 담았습니다. 머클트리를에서는 루트까지 두 개씩 짝지어 하나를 만들어 내는 과정에서 거래내역의 해싱부터 각 이진트리의 결과값을 이 함수를 통해서 해싱했었죠. 이 해싱을 통한 머클루트와 이전 블록의 해시를 담는 과정이 변경할 수 없는 기록이라는 블록체인의 특성을 만들 수 있었습니다. 이해가 잘 안되시는 분은 제 백서글(6)과 그 안에 링크글을 꼭 읽어봐주세요.
마지막으로 SHA256함수가 쓰이는 곳은 바로 블록 생성, 다른 말로 채굴입니다. 블록 생성은 난스(nonce) 값을 0부터 하나씩 올려가며 해시함수에 대입하여 목표값보다 낮은 출력값을 찾으면 블록 생성에 성공한다고 설명드렸습니다.(블록의 생성글) 여기서 SHA256함수가 쓰이는 방식은 위에 두 방식과 많이 다릅니다. 위의 두 경우는 암호화 해시함수의 전제를 그대로 사용합니다. 역으로 값을 찾는 것은 거의 불가능하고 입력값이 다르면 출력값이 완전 다르다는 특성을 이용하기 위해 암호화 해시함수를 썼습니다. 하지만 블록 생성에서는 1번의 그 어려움을 이용합니다. 해시함수에서는 결과가 랜덤하게 나옵니다. 이렇게 어떤 값이 나올지 모르는 가운데 원래 값(X)를 굳이 찾고자 한다면 변수를 하나씩 바꿔가면 계속 넣어보는 방법 밖에 없겠죠. 이래서 거의 불가능하다고 하는 거고요.
하지만 정확한 값을 찾는 것이 아니라 어느 범위안에 수를 찾을라고 하면 난이도는 줄어들 것입니다.
어디서 많이 들어본 말입니다. 바로 블록 생성을 위한 목표값을 찾는 방식과 난이도 조절에 대한 이야기죠. 난스를 1씩 올려 계속 대입하면서 난이도에서 설정한 목표값보다 낮은 수를 찾는 것이 블록생성의 조건이었습니다.
정확한 값을 찾는게 아니라 범위를 찾는 거죠. 비트코인은 2016블록 대략 2주에 한번씩 난이도를 조절한다고 블록 생성글에서 말씀드린 적이 있습니다. 그 난이도 조절이 바로 이 범위를 늘렸다 줄였다 하는 것이죠. 전체적으로는 계속 난이도가 상승하고 있으니 절대적인 범위는 줄어드는 것이겠지만 전 2주동안 범위보다 상대적으로 넓은 범위를 준다면 난이도는 하락할 것입니다.
얇게나마 암호화 해시함수에 대해 알아봤습니다. 저 알고리즘이 뭐고, 어떤 원리이고 하는 개념적인 것보단 우선 왜 쓰는지, 어떻게 쓰는지를 아는 것이 중요하다는 생각에 이런 글을 적어봤습니다. 앞으로 다른 블록체인이나 해시함수를 공부하다가 그 차이점이나 상대적 장점이 개념적인 원리에서 시작된다고 하면 이것도 공부를 해보려고 합니다.(핑계 좋죠.ㅎㅎ)
글을 쓰다보니 정말 사토시 나카모토는 외계인인가 하는 생각이 많이 듭니다. 제가 알기로 암호화폐는 이 전부터 있었는데 이중 지불문제나 중앙화된 신뢰기관에 대한 문제를 풀지 못해서 잊혀졌다고 들었습니다. 그리고 이번 글에서 본 암호화 해시함수도 비트코인이 나오기 전부터 존재했었구요. 합의 알고리즘을 가진 블록을 만들고 그것을 암호화 해시함수로 연결해서 이 모든 문제를 해결했다는 게 너무 놀랍지 않나요?^^ 공부를 해 나갈수록 외계인가 싶네요 전..ㅎㅎ
긴 글 읽어주셔서 감사합니다~~ 정말 글만 있는 긴 글 읽어주셔서 더 감사드립니다.ㅎㅎ
다음 글은 비트코인의 언어인 스크립트에 대해서 알아보려고 합니다. 이것도 얇게나마 알아야 이더리움을 공부해도 비교가 될 거 같아서요.
좋은 연말 되세요~~~^^
비트코인 백서부터 시작합니다
[비트코인트리1-1] 블록이란 무엇인가
비트코인 백서부터 시작합니다(2)
비트코인 백서부터 시작합니다(3)
비트코인 백서부터 시작합니다(4)
[비트코인트리4-1] 블록의 생성에 대해 알아봅시다
비트코인 백서부터 시작합니다(5)
[비트코인트리5-1] 거래수수료와 Unconfirmed Transaction
비트코인 백서부터 시작합니다(6)
[비트코인 트리 6-1] 블록의 저장공간과 스케일링(세그윗)
비트코인 백서부터 시작합니다(7)
[비트코인트리7-1] 비트코인의 특이한 거래 방식
비트코인 백서부터 시작합니다(8)
참조 :
@loum 님의 글 쉽게 이해하는 블록체인 기술(1)
@easyblockchain 님의 글 쉽게 설명하는 블록체인, 공개키와 개인키는 뭔가요?
@etainclub 님의 글 초보자를 위한 Blockchain 강좌 #5 디지털 서명
김석원님의 글 How Blockchain wors - 블록체인의 원리
IWAN 님의 글 원리부터 파악하는 비트코인
Ourselves 캠페인
셀프보팅을 하지 않고 글을 올리시고
ourselves 테그를 달아 주시면
많은 분들이 관심 가져 줄꺼에요