암호학에서 중요하게 사용되는 타원곡선에 대해 알아보자. 왜 해당 곡선을 사용할까?
일반적인 경우 | |
---|---|
한 점에서 만남 | 세 점에서 만남 |
예외 사항 | |
---|---|
두 점에서 만남(y축과 평행) | 두 점에서 만남(접선) |
Note: 컴퓨터에서 실제로 사용하는 것은, 특정 곡선위에 있는 점의 성질이다.
그렇기 때문에 위의 타원 곡선위에 있는 점자체를 표현할 수 있도록만 처리할 예정이다.
A+B = x축 대칭(A와 B를 지나는 직선이 만나는 세번째 교점)
위에서 정의한 타원 곡선의 점들 사이의 덧셈은 일반 덧셈과 같이 다음의 성질을 만족한다.
예외 케이스가 어떤 것이 있는지를 확인해보고 고려해야할 것을 정리해보자.
더하는 두 점이 놓여있는 상황은 다음의 경우가 전부다.
None
을 무한 원점이라고 가정할 것이다.class Point:
def __init__(self, x, y, a, b):
self.a = a
self.b = b
self.x = x
self.y = y
if self.x is None and self.y is None:
return
if self.y**2 != self.x**3 + a * x + b:
raise ValueError('({}, {}) is not on the curve'.format(x, y))
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 self.__eq__(other) == False
def __repr__(self):
if self.x is None:
return 'Point(infinity)'
else:
return 'Point({},{})_{}_{}'.format(self.x, self.y, self.a, self.b)
def __add__(self, other):
if self.a != other.a or self.b != other.b:
raise TypeError('Points {}, {} are not on the same curve'.format
(self, other))
# A + I = A (I는 무한원점 == None으로 표현)
if self.x is None:
return other
if other.x is None:
return self
# 두 점이 다른 경우 (y축 평행 O)
if self.x == other.x and self.y != other.y:
return self.__class__(None, None, self.a, self.b)
# 두 점이 다른 경우 (y축 평행 X)
if self.x != other.x:
x1, y1 = self.x, self.y
x2, y2 = other.x, other.y
s = (y2-y1)/(x2-x1)
x3 = s**2-x1-x2
y3 = s*(x1-x3)-y1
return self.__class__(x3, y3, self.a, self.b)
# 두 점이 같은 경우(접하는 경우)
if self == other:
x1, y1 = self.x, self.y
x2, y2 = other.x, other.y
a = self.a
s = (3*x1**2+a)/(2*y1)
x3 = s**2-2*x1
y3 = s*(x1-x3)-y1
return self.__class__(x3, y3, self.a, self.b)
# 두 점이 같은 경우(접하는데 그 점이 y가 0인 경우 - Divied by zero)
if self == other and self.y == 0:
return self.__class__(None, None, self.a, self.b)
raise NotImplementedError