블록체인(Blockchain)은 데이터를 안전하고 투명하게 기록하고 관리할 수 있는 분산형 데이터베이스 기술입니다. 블록체인은 여러 개의 블록으로 구성되어 있으며, 각 블록은 거래 정보와 이전 블록의 해시 값을 포함하고 있습니다. 이로 인해 블록체인은 데이터의 무결성과 변경 불가능성을 보장합니다.
블록체인의 주요 특징
- 분산화: 블록체인은 중앙 기관 없이 여러 참여자(노드)에 의해 운영됩니다. 모든 참여자는 동일한 데이터를 공유하고, 이를 통해 데이터의 신뢰성을 높입니다.
- 투명성: 모든 거래는 블록체인에 기록되며, 누구나 이를 확인할 수 있습니다. 거래 내역이 공개되기 때문에 부정행위를 방지할 수 있습니다.
- 변경 불가능성: 한 번 기록된 블록은 변경할 수 없습니다. 새로운 블록이 생성될 때마다 이전 블록의 해시가 포함되기 때문에, 이전 블록을 변경하면 모든 후속 블록도 변경해야 하며, 이는 사실상 불가능합니다.
- 보안성: 블록체인은 암호화 기술을 사용하여 거래를 보호합니다. 개인키와 공개키를 이용한 암호화는 사용자의 신원을 안전하게 보호합니다.
- 스마트 계약: 블록체인은 조건이 충족되면 자동으로 실행되는 계약을 지원합니다. 이는 중개자 없이도 안전하게 거래를 수행할 수 있게 합니다.
타원 곡선 암호화(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))
- 변수 초기화: p, Gx, Gy는 타원 곡선의 매개변수입니다. p는 소수이며, Gx, Gy는 타원 곡선의 생성점입니다.
- 개인키 생성: os.urandom, random.random, time.time을 사용하여 임의의 값을 생성하고, 이를 SHA-256 해시를 통해 개인키를 만듭니다. 개인키는 타원 곡선의 소수 p보다 작은 값이어야 합니다.
- double-and-add 알고리즘: double_and_add 함수는 개인키와 생성점 G를 사용하여 공개키를 계산합니다. 이 알고리즘은 이진수 표현을 사용하여 점을 두 배로 늘리거나 더하는 방식으로 공개키를 생성합니다.
- extended_euclidian 알고리즘: extended_euclidian 함수는 주어진 두 수의 최대공약수를 구하고, 이를 통해 역원을 계산합니다.
- 타원 곡선 상의 덧셈: point_add 함수는 두 점을 더하는 연산을 수행합니다. 두 점이 같을 때와 다를 때 각각의 경우를 처리합니다.
- 공개키 생성: double_and_add 함수를 호출하여 공개키를 생성합니다.
- 출력: 최종적으로 생성된 개인키와 공개키를 16진수와 10진수로 출력합니다.
깃허브
'PYTHON > 네트워크보안과 블록체인' 카테고리의 다른 글
[PYTHON] 비트코인 주소 생성 2 (특정 문자열로 시작하는 주소) (0) | 2024.08.11 |
---|---|
[PYTHON] 비트코인 주소 생성 (0) | 2024.08.11 |
[PYTHON] 전자서명 (0) | 2024.08.11 |
[PYTHON] 비대칭 키 암호화 (0) | 2024.08.11 |
[PYTHON] 대칭 키 암호화 (0) | 2024.08.11 |