PYTHON/네트워크보안과 블록체인

[PYTHON] 블록체인 개인키 공개키생성

G허니 2024. 8. 11. 20:17

 

블록체인(Blockchain)은 데이터를 안전하고 투명하게 기록하고 관리할 수 있는 분산형 데이터베이스 기술입니다. 블록체인은 여러 개의 블록으로 구성되어 있으며, 각 블록은 거래 정보와 이전 블록의 해시 값을 포함하고 있습니다. 이로 인해 블록체인은 데이터의 무결성과 변경 불가능성을 보장합니다.

 

블록체인의 주요 특징

  1. 분산화: 블록체인은 중앙 기관 없이 여러 참여자(노드)에 의해 운영됩니다. 모든 참여자는 동일한 데이터를 공유하고, 이를 통해 데이터의 신뢰성을 높입니다.
  2. 투명성: 모든 거래는 블록체인에 기록되며, 누구나 이를 확인할 수 있습니다. 거래 내역이 공개되기 때문에 부정행위를 방지할 수 있습니다.
  3. 변경 불가능성: 한 번 기록된 블록은 변경할 수 없습니다. 새로운 블록이 생성될 때마다 이전 블록의 해시가 포함되기 때문에, 이전 블록을 변경하면 모든 후속 블록도 변경해야 하며, 이는 사실상 불가능합니다.
  4. 보안성: 블록체인은 암호화 기술을 사용하여 거래를 보호합니다. 개인키와 공개키를 이용한 암호화는 사용자의 신원을 안전하게 보호합니다.
  5. 스마트 계약: 블록체인은 조건이 충족되면 자동으로 실행되는 계약을 지원합니다. 이는 중개자 없이도 안전하게 거래를 수행할 수 있게 합니다.
타원 곡선 암호화(ECC)를 사용하여 개인키와 공개키를 생성
import os
import random
import time
import hashlib

p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
Gx = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
Gy = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8

# 개인키 생성
while True:
    randomness = str(os.urandom(16)) + str(random.random()) + str(time.time())
    randomness_byte = randomness.encode()
    randomness_hash = hashlib.sha256(randomness_byte).hexdigest()
    private_key = int(randomness_hash, 16)
    if private_key < p:
        break

# 공개키 생성, K = k*G (공개키 = 개인키 * G)

# x * G의 곱하기 연산을 위한 double-and-add 알고리즘
def double_and_add(p, private_key, Gx, Gy):
    key = bin(private_key)[:2]
    temp_x = Gx
    temp_y = Gy

    for i in range(1, len(key)):
        temp_x, temp_y = point_add(p, temp_x, temp_y, temp_x, temp_y)

        if key[i] == "1":
            temp_x, temp_y = point_add(p, temp_x, temp_y, Gx, Gy)

    return temp_x, temp_y

# 곱셈의 역원을 계산하기 위한 extended_euclidian 알고리즘
def extended_euclidian(n, b):
    r1, r2 = n, b
    t1, t2 = 0, 1

    while r2 != 0:
        q = r1 // r2
        r1, r2 = r2, r1 - q * r2
        t1, t2 = t2, t1 - q * t2

    return t1   # t1이 역원

# 타원 곡선 상의 덧셈 연산을 위한 함수
def point_add(p, x1, y1, x2, y2):
    # P와 Q가 같은 점
    if x1 == x2 and y1 == y2:
        inverse = extended_euclidian(2 * y1, p)   # 역원
        slope = ((3 * x1**2) * inverse) % p
    # P와 Q가 다른 점
    else:
        inverse = extended_euclidian(x2 - x1, p)
        slope = ((y2 - y1) * inverse) % p

    x3 = (slope**2 - x1 - x2) % p
    y3 = (slope * (x1 - x3) - y1) % p
    
    return x3, y3

# 공개키 생성
public_key_x, public_key_y = double_and_add(p, private_key, Gx, Gy)

# 출력
print("개인키(16진수) =", hex(private_key))
print("개인키(10진수) =", private_key)
print("")
print("공개키(16진수) =({}, {})".format(hex(public_key_x), hex(public_key_y)))
print("공개키(10진수) =({}, {})".format(public_key_x, public_key_y))

 

  1. 변수 초기화: p, Gx, Gy는 타원 곡선의 매개변수입니다. p는 소수이며, Gx, Gy는 타원 곡선의 생성점입니다.
  2. 개인키 생성: os.urandom, random.random, time.time을 사용하여 임의의 값을 생성하고, 이를 SHA-256 해시를 통해 개인키를 만듭니다. 개인키는 타원 곡선의 소수 p보다 작은 값이어야 합니다.
  3. double-and-add 알고리즘: double_and_add 함수는 개인키와 생성점 G를 사용하여 공개키를 계산합니다. 이 알고리즘은 이진수 표현을 사용하여 점을 두 배로 늘리거나 더하는 방식으로 공개키를 생성합니다.
  4. extended_euclidian 알고리즘: extended_euclidian 함수는 주어진 두 수의 최대공약수를 구하고, 이를 통해 역원을 계산합니다.
  5. 타원 곡선 상의 덧셈: point_add 함수는 두 점을 더하는 연산을 수행합니다. 두 점이 같을 때와 다를 때 각각의 경우를 처리합니다.
  6. 공개키 생성: double_and_add 함수를 호출하여 공개키를 생성합니다.
  7. 출력: 최종적으로 생성된 개인키와 공개키를 16진수와 10진수로 출력합니다.

 

깃허브

https://github.com/Ghoney99/Network-Secure-and-BlockChain