블록체인

#2 타원곡선

tworiver 2023. 7. 25. 11:21

타원곡선과 블록체인

 타원 곡선 암호학은 블록체인과 암호화폐에서 중요한 보안 기술로 사용되고 있습니다. 이를 이해하기 위해서는 먼저 타원 곡선이 무엇인지와 암호학적인 특성을 간략하게 살펴보겠습니다.

1. 타원 곡선 (Elliptic Curve):
타원 곡선은 수학적인 곡선의 한 종류로서, 그래프 상의 점들이 특정한 규칙에 따라 정의된다는 특징을 갖고 있습니다. 이 규칙은 덧셈 연산으로 정의되며, 덧셈 연산이 타원 곡선 위에서 잘 정의되도록 임의의 기준점 (Generator Point, G)을 정의하는 것이 일반적입니다. 이때, 덧셈 연산은 여러번 반복해서 수행하면 해당 점의 배를 구하는 것과 동등합니다.

2. 타원 곡선 암호학 (Elliptic Curve Cryptography, ECC):
타원 곡선 암호학은 타원 곡선을 기반으로 한 암호학적인 알고리즘의 집합을 말합니다. 이러한 알고리즘은 공개키 암호화, 디지털 서명, 키 교환 등 다양한 암호학적 기능을 제공합니다. ECC는 RSA와 비교하여 같은 수준의 보안 강도를 가지면서 훨씬 짧은 키 길이를 사용할 수 있기 때문에 더 효율적으로 동작할 수 있습니다.

3. 블록체인과 타원 곡선 암호학:
블록체인에서 타원 곡선 암호학은 주로 디지털 서명과 공개키 암호화를 위해 사용됩니다.

디지털 서명: 블록체인에서는 거래 데이터의 무결성과 인증을 보장하기 위해 디지털 서명이 사용됩니다. 거래를 생성한 송신자는 자신의 개인키로 해당 거래에 대한 디지털 서명을 생성하고, 이를 블록에 포함시켜서 기록합니다. 수신자는 송신자의 공개키를 사용하여 디지털 서명을 확인함으로써 거래의 유효성을 검증할 수 있습니다. 타원 곡선 암호학의 특성 때문에 짧은 키 길이로도 강력한 보안을 제공하므로, 블록체인에서 디지털 서명에 사용되는 알고리즘으로 많이 선택됩니다.

공개키 암호화: 블록체인에서는 사용자들이 안전하게 메시지를 교환할 필요가 있습니다. 공개키 암호화는 이러한 요구를 충족시키는 데에 사용됩니다. 사용자는 개인키와 공개키의 쌍을 생성하며, 개인키로 메시지를 암호화하면 공개키로만 복호화할 수 있습니다. 따라서 송신자는 수신자의 공개키를 이용하여 메시지를 암호화하여 전송하면, 해당 메시지는 수신자만이 자신의 개인키로만 복호화하여 읽을 수 있습니다.

타원 곡선 암호학은 블록체인의 보안과 개인정보 보호에 기여하며, 효율적인 암호화 기술로서 블록체인 기술의 안전성을 강화하는 데에 큰 역할을 합니다.

 

 

타원곡선 파이썬 구현

타원 곡선(cryptographic elliptic curve)은 암호학에서 중요한 수학적 도구로 사용되는데, 특히 공개키 암호 시스템과 디지털 서명에 활용됩니다. 이러한 타원 곡선을 코딩으로 구현하는 방법에 대해 자세히 설명해드리겠습니다. 주로 사용되는 언어로는 Python을 기준으로 설명하겠습니다.

타원 곡선의 정의
타원 곡선은 다음과 같은 형태의 수학적 곡선을 가리킵니다.
y^2 = x^3 + ax + b
여기서 a와 b는 곡선을 정의하는 파라미터이며, a와 b는 유한체(유한한 크기의 집합)에서 선택됩니다. 또한, a와 b는 곡선의 특성을 결정하는 중요한 값들입니다.

유한체(Finite Field) 구현
타원 곡선은 유한체에서 정의되므로, 먼저 유한체를 구현해야 합니다. 유한체는 mod 연산으로 구현할 수 있습니다. 예를 들어, 특정 소수 p를 사용하는 경우, 모든 연산은 p를 기준으로 mod 연산을 수행합니다.

def mod_inverse(a, p):
    # 확장 유클리드 호제법을 이용하여 a의 역원을 구합니다.
    # a^-1 ≡ a^(p-2) (mod p) when p is prime.
    return pow(a, p-2, p)

class FiniteFieldElement:
    def __init__(self, num, prime):
        self.num = num % prime
        self.prime = prime

    def __add__(self, other):
        if self.prime != other.prime:
            raise ValueError("Primes must be the same")
        num = (self.num + other.num) % self.prime
        return FiniteFieldElement(num, self.prime)

    def __sub__(self, other):
        if self.prime != other.prime:
            raise ValueError("Primes must be the same")
        num = (self.num - other.num) % self.prime
        return FiniteFieldElement(num, self.prime)

    def __mul__(self, other):
        if self.prime != other.prime:
            raise ValueError("Primes must be the same")
        num = (self.num * other.num) % self.prime
        return FiniteFieldElement(num, self.prime)

    def __pow__(self, exponent):
        num = pow(self.num, exponent, self.prime)
        return FiniteFieldElement(num, self.prime)

    def __eq__(self, other):
        if self.prime != other.prime:
            return False
        return self.num == other.num

    def __ne__(self, other):
        return not (self == other)

    def __repr__(self):
        return f"FiniteFieldElement({self.num}, {self.prime})"



타원 곡선 클래스 구현
이제 유한체 구현을 사용하여 타원 곡선 클래스를 구현할 수 있습니다.

class EllipticCurvePoint:
    def __init__(self, x, y, a, b):
        self.x = x
        self.y = y
        self.a = a
        self.b = b

        # 무한 원소(infinity)를 표현하는 특별한 경우를 처리합니다.
        if x is None and y is None:
            return

        # 타원 곡선의 좌표 (x, y)가 타원 곡선 방정식을 만족하는지 검증합니다.
        if y**2 != x**3 + a * x + b:
            raise ValueError("Point is not on curve")

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y and self.a == other.a and self.b == other.b

    def __ne__(self, other):
        return not (self == other)

    def __add__(self, other):
        if self.a != other.a or self.b != other.b:
            raise ValueError("Points are not on the same curve")
        
        # 무한 원소와의 덧셈은 다른 원소 그 자체를 반환합니다.
        if self.x is None:
            return other
        if other.x is None:
            return self
        
        # 점과 자기 자신의 덧셈인 경우, 타원 곡선의 접선에서 대칭한 점을 반환합니다.
        if self == other:
            slope = (3 * self.x**2 + self.a) * mod_inverse(2 * self.y, self.p)
        else:
            # 두 점의 덧셈인 경우, 기울기를 계산합니다.
            slope = (other.y - self.y) * mod_inverse(other.x - self.x, self.p)
        
        # 새로운 점의 x, y 좌표를 계산합니다.
        x3 = (slope**2 - self.x - other.x) % self.p
        y3 = (slope * (self.x - x3) - self.y) % self.p

        # 계산된 좌표로 새로운 점을 생성하여 반환합니다.
        return EllipticCurvePoint(x3, y3, self.a, self.b)

    def __mul__(self, n):
        # 무한 원소와의 곱셈은 무한 원소를 반환합니다.
        if self.x is None or n == 0:
            return EllipticCurvePoint(None, None, self.a, self.b)
        
        # 계산 결과를 저장할 변수를 초기화합니다.
        result = EllipticCurvePoint(None, None, self.a, self.b)
        temp = self

        # 이진 표현으로 n을 분할하여 덧셈 연산으로 곱셈을 수행합니다.
        while n:
            if n & 1:
                result += temp
            temp += temp
            n >>= 1

        return result

    def __repr__(self):
        return f"EllipticCurvePoint({self.x}, {self.y})"

타원 곡선의 생성과 연산
이제 타원 곡선 클래스를 사용하여 생성과 연산을 수행해보겠습니다.

# 타원 곡선의 파라미터 a와 b를 정의합니다. (예시로 y^2 = x^3 + ax + b 형태의 타원 곡선)
a = 2
b = 3

# 유한체의 소수 p를 정의합니다.
p = 17

# 유한체의 소수 p를 기준으로 각 좌표를 나타내기 위해 FiniteFieldElement 클래스를 사용합니다.
x = FiniteFieldElement(5, p)
y = FiniteFieldElement(1, p)

# 타원 곡선의 생성자 점을 생성합니다.
P = EllipticCurvePoint(x, y, a, b)

# 타원 곡선의 생성자 점 P를 두 번 더합니다.
Q = P + P

# 타원 곡선의 생성자 점 P를 세 번 더합니다.
R = P + P + P

print("P:", P)
print("2P:", Q)
print("3P:", R)

# 타원 곡선의 다른 점을 생성합니다.
x2 = FiniteFieldElement(6, p)
y2 = FiniteFieldElement(10, p)
Q2 = EllipticCurvePoint(x2, y2, a, b)

# 두 점을 더합니다.
S = Q + Q2
print("Q + Q2:", S)

# 두 점의 곱셈을 수행합니다.
n = 7
T = Q2 * n
print("7Q2:", T)


이제 코드를 실행하면 타원 곡선의 생성, 덧셈, 스칼라 곱셈 등의 연산을 수행할 수 있습니다. 이렇게 구현된 타원 곡선 클래스는 암호학적 연산에서 사용할 수 있는 기반이 됩니다. 다양한 암호 시스템과 보안 프로토콜에서 이러한 타원 곡선 클래스를 사용하여 효과적이고 안전한 암호화를 구현할 수 있습니다.

'블록체인' 카테고리의 다른 글

#6 스크립트  (0) 2023.07.25
#5 트랜잭션  (0) 2023.07.25
#4 직렬화  (0) 2023.07.25
#3 타원곡선 암호  (0) 2023.07.25
#1 유한체  (0) 2023.07.25