기초 암호학
일단 암호화폐(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
https://www.devglan.com/online-tools/rsa-encryption-decryption
https://encode-decode.com/des-encrypt-online/
정확한 복호화의 개념은 아니지만 많은 pre-computed 예시들이 저장되어 있어서 간단한 원본 복원이 가능한 사이트입니다. 이 때문에 사이트 회원가입 시 비밀번호를 대문자/소문자, 특수문자, 숫자를 섞어서 해커들이 비밀번호를 풀지 못하도록 설정 유도를 합니다.
'Coding(코딩) > Blockchain 이론 정리' 카테고리의 다른 글
[블록체인 개념 정리] 이더리움의 외부 소유 계정(EOA) 및 컨트랙트(Contract) (0) | 2022.12.28 |
---|---|
[Blockchain 개념 정리] - 블록체인 api 사용법 (1) | 2022.09.19 |
[Blockchain 개념 정리] - 블록생성, 채굴 어떻게 되는걸까? (4) | 2022.09.16 |