본문 바로가기
Coding(코딩)/Blockchain 이론 정리

[Blockchain 개념 정리] - Block의 해시(Hash)값은 어떻게 생성될까?

by DevKev 2022. 9. 20.

기초 암호학

 

일단 암호화폐(Cryptocurrency)라는 단어에서 알 수 있듯 블록체인은 단방향일 수 밖에 없습니다.

 

단방향 혹은 양방향의 판단은 복호화 가능 여부에 따라 정의될 수 있습니다.

 

양방향이라면? 저희의 자산이 안전할 수가 없겠죠 다들 해킹이 가능하니...

블록체인과 관련된 내용을 다루고자 하니 일단 단방향에 대한 개념을 간단하게 다루고

SHA256을 이용한 단방향 암호화에 대한 실습을 이 포스트에서 다루겠습니다.

 

[실습]

단방향 암호화는 암호문에서 평문으로 복호화 할 수 없는 방법입니다. 그 중에서 Hash 함수는 대표적인 단방향성 암호화 방식입니다. 특정 문자를 Hash 함수의 입력값으로 넣고 결과물을 받으면 결과문(암호문)로 입력값(평문)을 역추적할 수 없습니다.

 

가장 많이 쓰는 함수인 SHA256에 대해 간략히 살펴보면,

 

ex) SHA 256

: 암호화 방식 SHA-2 계열 중 하나로 비트코인 공개키 및 주소 형성에 자주 사용됩니다. 256이라는 숫자는 결과물의 용량(256비트, 32byte)을 의미하며, 어떤 크기의 입력값이 들어가더라도 동일한 용량을 가진 출력값이 나옵니다. 즉, 1byte 당 16진수 두자리에 해당한다는 사실도 알 수 있습니다..

 

그럼 이제 헤더(header)를 바탕으로 블록해쉬(block hash)로 변환하는 실습을 해보겠습니다.

비트코인 블록 754,760(https://www.blockchain.com/explorer/blocks/btc/754760) 에 대해서 살펴보면,

해쉬값이 0000000000000000000368c72a6a69020a4c5e84126590523c29a07f7253f381이고 다음의 정보가 나옵니다.

"ver":598949888,
"prev_block":"00000000000000000001358742ef5c32c55226b808ed756832f052f6e7a71495",
"mrkl_root":"e6384596b21ad07eec51a5da3807736fd3c3ba853fcba3956fdfd48c68655174",
"time":1663565552,
"bits":386451604,
"nonce":472163637

 

아래의 웹 python 컴파일러를 이용해서 돌려보겠습니다.

https://www.programiz.com/python-programming/online-compiler/

 

block_info 변수에서 hash 값은 단순 비교를 위해서 적어놓은 것일 뿐 hash 함수 이용에 이용되는 변수는 아닙니다.

import hashlib
import struct


little_endian = lambda value: struct.pack('<L', value).hex()
reverse_order_pair = lambda value: ''.join([value[i - 2:i] for i in range(len(value), 0, -2)])

block_info = {
    'hash':'0000000000000000000368c72a6a69020a4c5e84126590523c29a07f7253f381',
    'ver':598949888,
    'prev_block':'00000000000000000001358742ef5c32c55226b808ed756832f052f6e7a71495',
    'mrkl_root':'e6384596b21ad07eec51a5da3807736fd3c3ba853fcba3956fdfd48c68655174',
    'time':1663565552,
    'bits':386451604,
    'nonce':472163637,
    'ver':598949888
}

convert_block_info = {}

convert_block_info['ver'] = little_endian(block_info['ver'])
convert_block_info['time'] = little_endian(block_info['time'])
convert_block_info['bits'] = little_endian(block_info['bits'])
convert_block_info['nonce'] = little_endian(block_info['nonce'])

convert_block_info['prev_block'] = reverse_order_pair(block_info['prev_block'])
convert_block_info['mrkl_root'] = reverse_order_pair(block_info['mrkl_root'])

header_hex = convert_block_info['ver'] + convert_block_info['prev_block'] + convert_block_info['mrkl_root'] + convert_block_info['time'] + convert_block_info['bits'] + convert_block_info['nonce']

header_bin = bytes.fromhex(header_hex)

hash = hashlib.sha256(hashlib.sha256(header_bin).digest()).digest()

result_header_hex = hash[::-1].hex()

print(result_header_hex)

위의 코드를 run하면 다음의 결과가 나오죠?

코드 실행 결과

알고있는 hash 값과 동일한 hash 값이 나오는 것을 볼 수 있습니다.

 

재밌네요 점점 알아가고 있는 과정이.

 

더 많이 정리해보도록 하겠습니다.

 

감사합니다.

 

아래는 참고한 사이트입니다.

 

사이트

https://emn178.github.io/online-tools/sha256.html

 

SHA256 Online

 

emn178.github.io

https://www.devglan.com/online-tools/rsa-encryption-decryption

https://encode-decode.com/des-encrypt-online/

 

정확한 복호화의 개념은 아니지만 많은 pre-computed 예시들이 저장되어 있어서 간단한 원본 복원이 가능한 사이트입니다. 이 때문에 사이트 회원가입 시 비밀번호를 대문자/소문자, 특수문자, 숫자를 섞어서 해커들이 비밀번호를 풀지 못하도록 설정 유도를 합니다.

 

https://crackstation.net/

 

CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.

Free Password Hash Cracker Enter up to 20 non-salted hashes, one per line: Supports: LM, NTLM, md2, md4, md5, md5(md5_hex), md5-half, sha1, sha224, sha256, sha384, sha512, ripeMD160, whirlpool, MySQL 4.1+ (sha1(sha1_bin)), QubesV3.1BackupDefaults How Crack

crackstation.net