[블록체인] 암호학(Cryptography)

2024. 11. 7. 22:31·CS/Blockchain

 

🔑 블록체인 정의

P2P(Peer to Peer) 네트워크를 통해 관리되는 분산 데이터베이스의 한 형태로, 블록체인 노드(네트워크에 연결된 여러 컴퓨터)에 디지털 서명된 거래 정보를 보관하는 분산 원장 기술(Distributed Ledger Technology)

 

🔑 동작 원리

  1. 누군가 트랜잭션(transaction)을 만들어 요청한다.
  2. 트랜잭션을 요청받은 노드는 트랜잭션의 유효성을 검증(validation)한다.
  3. 유효한 트랜잭션이 블록체인의 P2P 네트워크에 전파된다.(boardcast)
  4. 블록 생성자는 블록 생성 규칙을 준수하며, 검증된 트랜잭션(1의 트랜잭션)을 포함하는 새 블록(block)을 생성한다.
  5. 생성된 새로운 블록이 P2P 네트워크에 전파된다.
  6. 기존 블록에 새로운 블록이 연결되며 트랜잭션이 처리된다.

 

🔑 블록체인의 암호학

📝 공개키 암호화 (PKC, Public Key Cryptography)

공개키 암호화 == 비대칭 암호화

  • 비대칭 암호화: 공개키와 개인키의 쌍
    • 개인키(k): 공개해서는 안 되는 나만의 키
    • 공개키(K): 외부로 공개되어도 상관없는 키
  • 계산하기는 쉽지만 그 역(inverse)을 계산하기 어려운 특수한 함수를 바탕으로 생성된 고유키를 사용하여 정보를 보호하는 방법
  • 비트코인 및 이더리움에서는 이산 로그 문제(Discrete Logarithm Problem)를 이용하는 타원곡선 암호화(Elliptic Curve Cryptography)를 활용
🌙 이산 로그 문제 (Discrete Logarithm Problem)
개인키로 공개키를 만들 수 있지만, 공개키로는 개인키를 절대 알 수 없음

https://raonctf.com/essential/study/web/cryptography

  • 개인키로 암호화하면 공개키로 풀어볼 수 있다.
  • 공개키로 암호화하면 개인키로 풀어볼 수 있다.

 

📝 개인키(k)

1 ~ 2^256 사이의 무작위로 선택한 숫자

  • 개인키 생성 프로세스는 온라인 프로세스
  • 대부분의 프로그래밍 언어에 있는 rand 함수 같은 암호학적으로 안전하지 않은 난수 생성기 사용 금지
  • 암호학적으로 안전한 이유?
    • 너무나도 큰 숫자이다. 아무리 랜덤하게 뽑아도 동일한 숫자를 뽑을 확률이 굉장히 낮다.

 

📝공개키(K)

타원 곡선에 있는 점 (타워 곡선 방정식을 만족하는 x와 y 좌표의 집합)

  • 이더리움은 secp256k1을 사용한다.
  • 그래프 상의 한 점을 여러 차례 연산(개인키만큼 반복)해서 도착하는 점이 공개키가 된다.
    • 공개키를 가지고는 몇 번의 연산을 통해 도착했는지 알 수 없어 안전하다.
  • 이더리움에서 16진수 문자 130개로 직렬화(serialization)된 공개키를 확인할 수 있다.
  • 이더리움은 타원 곡선 공개키 접두어 04(압축되지 않은 지점)를 사용한다.

 

📝 해시 함수 (Hash Function) - 주소 생성

공개키를 주소로 변환하기 위해 해시 함수 사용

이더리움 지갑을 만들었을 때 생기는 이더리움 주소는..? → 해시함수

 

📍 해시 함수

  • 임의 크기의 데이터를 고정된 크기 데이터로 매핑하는 함수
  • 해시 함수의 입력을 메시지 또는 입력 데이터, 결과를 해시(hash)라고 한다.
  • 결괏값을 알고 있을 때 입력 데이터를 다시 작성하는 것이 불가능한 단방향(one-way) 함수이다.

이더리움에서는 SHA3 계열의 keccak-256 함수를 사용한다.

  • 주의: 일반적으로 쓰이는 keccak과 이더리움에서 쓰이는 keccak은 조금 다르다. (변형됨)
  • keccak 함수 안에 빈 값을 넣었을 때 c5d24로 시작되는 결괏값을 얻는다면 이더리움 keccak이 맞다.
    • Keccak256(””) = c5d24…

공개키를 가지고 어떻게 이더리움 주소를 만들까?

  • 공개키 입력의 keccak-256의 해시
  • 마지막 20바이트만 유지하여 주소로 사용한다.
  • 16진수를 나타내는 0x 접두어가 함께 나타나기도 한다.
  • 16진수의 대소문자를 수정하여 이더리움의 이전 버전과 호환되는 체크섬 주소를 사용한다.

 

📝정리

  • 개인키(k): 암호학적으로 무작위한 1 ~ 2^256 사이의 난수
    • Secp256k1을 통해 타원 곡선에서 하나의 점(공개키)을 찍어낸다.
  • 공개키(K): 타원 곡선 위의 점을 직렬화한 값
    • 해시 함수(keccak-256)를 써서 주소를 만든다.
  • 주소
    • 해시의 마지막 20바이트
    • 외부 소유 주소 (EOA, Externally Owned Address)

 

🌙 타원 곡선 함수나 해시 함수는 정방향 연산은 가능하지만 역방향 연산은 불가능하다.
  • 개인키를 통해 공개키를 만들 수 있다.
    • 공개키를 통해 개인키를 만들 수 없다.
  • 공개키를 통해 주소를 만들 수 있다.
    • 주소를 통해 공개키를 만들 수 없다.
반응형

'CS > Blockchain' 카테고리의 다른 글

[블록체인] Smart Contract, DApp  (1) 2024.11.10
[블록체인] 합의(자격 증명, 지분 증명)  (0) 2024.11.09
[블록체인] 트랜잭션(Transaction)  (0) 2024.11.08
'CS/Blockchain' 카테고리의 다른 글
  • [블록체인] Smart Contract, DApp
  • [블록체인] 합의(자격 증명, 지분 증명)
  • [블록체인] 트랜잭션(Transaction)
올콩
올콩
콩 심은 데 콩 난다
  • 올콩
    콩스토리
    올콩
  • 전체
    오늘
    어제
    • 분류 전체보기 (140)
      • SSAFY (10)
      • Algorithm (67)
        • 이론 (5)
        • 백준 (BOJ) (61)
        • 프로그래머스 (1)
      • Language (9)
        • JavaScript (0)
        • TypeScript (0)
        • Java (9)
        • Python (0)
      • Library & Runtime (15)
        • React (13)
        • Node.js (2)
      • Framework (9)
        • 이론 (2)
        • Next.js (3)
        • Vue (4)
      • DevOps (3)
        • Git (3)
      • WEB (17)
        • HTML (9)
        • error (6)
        • etc (2)
      • Computer (5)
        • 자격증 (2)
        • tip (2)
        • etc (1)
      • CS (5)
        • Network (1)
        • Blockchain (4)
  • 블로그 메뉴

    • GitHub
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    티스토리챌린지
    SSAFY
    강의
    자바
    Algorithm
    싸피
    SSAFYcial
    오블완
    딕셔너리
    해시
    파이썬
    kakaomap
    vue
    카카오맵
    DP
    블록체인
    React
    백준
    bfs
    우선순위큐
    Error
    github
    알고리즘
    Java
    소수
    렌더링최적화
    Next.js
    html5
    재귀
    dfs
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
올콩
[블록체인] 암호학(Cryptography)
상단으로

티스토리툴바