블록체인에 사용되는 해시함수는 무엇이고 어떤 특성을 가지고 있는지 알아보고 있습니다.
그 세번째 글로 해시 함수의 특성 2 - 원본 내용을 알 수 없다입니다.
이전 글은 아래 링크에서 보실 수 있습니다.
[블록체인]해시함수 이해1 - 해시함수란?
[블록체인] 해시함수 이해 2 - 특성 1 - 충돌이 거의 발생하지 않는다.
첫번째 글에서 해시함수란
어떤 길이의 데이터를 입력해도 정해진 길이의 결과를 주는 함수
라고 했습니다.
Designed by Freepik
이번 해시함수의 특징은 이 해시결과를 보고서는 원본 메시지가 무엇인지 알아내는 것이 거의 불가능하다는 것입니다.
바로 앞의 글에서 해시 함수는 입력 데이터가 다르면 해시 결과가 다르다라고 말했습니다.
같은 해시결과를 만드는 값은 반드시 존재하지만 실제로 그 값을 찾는 것은 불가능에 가깝다고 설명했습니다.
다시 말하면 해시 결과를 알려줘도 그 결과를 만드는 입력 데이터를 찾는 일은 불가능하다는 거죠.
원본을 알아내는 것이 불가능할까? 동전 던지기 문제
동전을 던저 앞(head), 뒤(tail)을 맞추는 게임을 생각해 보겠습니다.
A와 B가 미리 앞, 뒤를 선택해서 심판을 보기로한 C에게 제출합니다.
이때 그냥 제출하는 것이 아니라 SHA256 해시를 돌려서 결과를 제출합니다.
심판 C가 실제 동전을 던진 후에 A, B가 제출한 답과 비교를 하려고 합니다.
제출된 해시는 모두가 볼 수 있게 그냥 공개합니다.
해시 원본을 알아내는 것은 불가능하니까 동전을 던지기 전이라도 본인이 선택한 결과의 해시를 공개해도 문제가 없겠죠?
정말 문제가 없을까요?
A가 제출한 해시는 아래와 같습니다.
'38744961f4eda323853183a6f6bc135434347285158efaaba7b9280fdb569a95'
B가 제출한 값입니다.
'38744961f4eda323853183a6f6bc135434347285158efaaba7b9280fdb569a95'
해시를 보면 무얼 적어냈는지 모르겠네요.
동전던지기에서 가능한 입력은 head와 tail뿐이니까 해시를 한번 구해볼까요?
>>> a = b'tail'
>>> b = b'head'
>>> sha256(a).hexdigest()
'0c62f876ef1dea830de9f32c2f4b46dd6d74d50d15896e09ef5a2fcd4ac7e1d7'
>>> sha256(b).hexdigest()
'9f2e6d33a3717ee826353a404ba4618d1aeeb6879ad7936bce8ed5f46814924d'
이런, 위의 내용을 보니 금방 알아보겠네요.
A가 제출한 해시는 tail의 해시이고 B는 head의 해시를 제출했군요.
그렇습니다.
이렇게 입력 데이터가 한정된 경우(이번 예에서는 head나 tail)는 미리 입력에대한 해시를 구해보면 쉽게 제출된 해시가 어떤 값인지 분별이 가능합니다.
동전 던지기 문제의 해결 방법은?
이를 해결할 방법은 있는 걸까요?
256 bits의 랜덤한 데이터를 원본 데이터에 덪붙이면 어떨까요?
해시결과가 충돌되지 않는다는 글을 보시면 256 bits 데이터가 갖는 의미를 알 수 있을 겁니다.
이 랜덤값을 키(Key)라고 부르겠습니다.
이 키를 추가해서 해시를 구해볼까요?
>>> a = b'e6d85489f5082f21b2ecb993c799bb45e3ba7ca24618c553ff3b650b2b4e0c9btail'
>>> b = b'96f77711bac6bb95014d94f3b19c604176412101054d6d439a9b142ed2642278head'
>>> sha256(a).hexdigest()
'6c8f20b2fea69cded0afe060ebb80b79a5d0e850f1c1f621c0aadb09454f49d0'
>>> sha256(b).hexdigest()
'3401b7f3ab6d4f1555bf53dc0692611c900fb29fcb9679d5ac6b65880d7847d3'
A와 B가 선택한 값의 앞에 랜덤 키를 추가해서 해시를 구했습니다.
입력에 랜덤 키가 들어가서 해시만 보고 원본이 무엇인지 알수가 없게 되었습니다.
그럼 심판 C는 어떻게 확인을 하죠?
A와 B는 각각 랜덤하게 선택한 키를 가지고 있습니다. 그리고 실제로 자기가 선택한 값을 알고 있죠.
처음에는 해시값만 C에게 제출을 했지만 C가 동전을 던진 후 결과를 확인할 때는 키와 실제 본인이 선택한 값을 제출합니다.
C는 키와 선택한 값(head 또는 tail)을 붙인 후 해시를 실행해 보고 원래 제출한 해시값과 일치하는지 확인만 하면 됩니다.
그런데 만일 A가 동전 던진 결과를 보고 조작된 키와 선택한 값을 제출하면 어떻게 될까요?
가능은 하지만 그런 값을 찾는 것은 불가능에 가깝다고 앞의 글 해시결과가 충돌되지 않는다에서 설명을 했습니다.
이렇게 해서 해시의 두번째 특성까지 알아봤습니다.
다음 이어질 내용은 해시의 세번째 특성이면서 비트코인 마이닝과 관련된 내용입니다.
이전 글은 아래 링크에서 보실 수 있습니다.
[블록체인]해시함수 이해1 - 해시함수란?
[블록체인] 해시함수 이해 2 - 특성 1 - 충돌이 거의 발생하지 않는다.
[블록체인] 해시함수 이해 3 - 특성 2 - 원본 내용을 알 수 없다(현재글)
[블록체인] 해시함수 이해 4 - 특성 3 - 퍼즐 게임을 만들 수 있다