타원 곡선에 추가


29

타원 곡선에 추가

면책 조항 : 이것은 타원 곡선의 풍부한 주제에 대한 정의를하지 않습니다. 많이 단순화되었습니다. 타원 곡선이 최근 암호화와 관련하여 많은 미디어 주목을 받았기 때문에 타원 곡선의 "계산"이 실제로 어떻게 작동하는지에 대한 작은 통찰력을 제공하고 싶었습니다.

소개

타원 곡선은 (x,y)양식 평면의 점 집합입니다 y^2 = x^3+Ax+B. ( 4A^3+27B^2 ≠ 0단순한 특이점을 피하기 위해) 모든 분야에서 이러한 곡선을 고려할 수 있습니다. 실수 필드를 사용하면 곡선을 시각화 할 수 있으며 다음과 같이 보입니다.

타원 곡선의 두 가지 예
출처

이 곡선에 대한 특별한 것은 그들이 점이다 내장 또한의 아날로그입니다 산술 연산. 점을 더하거나 뺄 수 있으며이 연산은 연관성 및 정류 성 (아벨 리아 그룹)입니다.

추가는 어떻게 작동합니까?

참고 : 타원 곡선에 점을 추가하는 것은 직관적이지 않습니다. 이런 종류의 추가는 좋은 특성을 가지고 있기 때문에 정의 된 방식입니다. 이상하지만 작동합니다.

타원 곡선 그룹을 형성하는 바와 같이, 거기 첨가제 신원 추가 0.의 동등한 0결과를 변경하지 않을 어떤 지점이. 이러한 부가적인 정체성은 무한대의 "지점"입니다. 평면의 모든 선은이 점을 무한대로 포함하므로 추가해도 아무런 차이가 없습니다.

주어진 선이 세 점에서 곡선과 교차 0하고이 세 점의 합이 이라고 가정합시다 0. 이를 염두에두고이 이미지를 살펴보십시오.

타원 곡선 추가 특수 사례
출처

자연의 질문은 무엇 P+Q입니까? 글쎄, P+Q+R = 0그렇다면 P+Q = -R(또는으로 쓰여짐 R'). 어디있어 -R? 곳이다 R + (-R) = 0에서 X 축의 반대편에있는 R경우에만 교차이를 통해 라인이 수직이되도록 R, -R, 및 0. 이 이미지의 첫 부분에서 이것을 볼 수 있습니다.

타원 곡선에 대한 다양한 추가 다이어그램 출처

이 이미지에서 볼 수있는 또 다른 점은 점 자체의 합이 선이 곡선에 접함을 의미한다는 것입니다.

선과 타원 곡선의 교차점을 찾는 방법

두 개의 별개의 포인트의 경우

일반적으로 정확히 두 점을 통과하는 한 줄이 P=(x0,y0), Q=(x1,y1)있습니다. 수직이 아니고 두 점이 서로 다르다고 가정하면로 쓸 수 있습니다 y = m*x+q. 타원 곡선과의 교차점을 찾으려면

0 = x^3+Ax+B-y^2 = x^3+Ax+B-(m*x+q)^2

3 차 다항식입니다. 이들은 일반적으로 해결하기 쉽지 않은 그, 그러나 우리는 이미이 다항식의 두 개의 0을 알고 두 x-coordinates x0, x1두 점은 우리가 추가 할!

그 방법은 우리의 선형 요소 밖으로 요인 (x-x0)(x-x1)와는 그 루트는 IS 세 번째 선형 요소로 남아있는 x점의 -coordinate R. ( -R. 너무 때문에 대칭의 경우 참고 R = (x2,y2)다음을 -R = (x2,-y2)(가). -그룹에서이며 그것은이의 vectorial 마이너스가 아닙니다.)

P자체에 하나의 포인트 를 추가하는 경우

이 경우에서 곡선의 탄젠트를 계산해야합니다 P=(x0,y0). 우리는 직접 쓸 수 mq측면에서 A,B,x0,y0:

     3*x0^2 + A
m = ------------
        2*y0

     -x0^3 + A*x0 + 2*B
q = --------------------
          2*y0

우리는 방정식을 y = m*x+q얻었고 위의 단락과 같은 방식으로 진행할 수 있습니다.

완전한 케이스 트리

다음은 이러한 모든 경우를 처리하는 방법의 전체 목록입니다.

P,Q타원 곡선의 점으로 하자 ( "무한대"점 포함 0)

  • if P = 0또는 Q = 0, then P+Q = Q또는 P+Q = P, 각각
  • 다른 사람 P ≠ 0Q ≠ 0그렇게 할 수 P = (x0,y0)Q = (x1,y1):
    • 그렇다면 P = -Q(즉 x0 = x1, y0 = -y1)P+Q = 0
    • 그밖에 P ≠ -Q
      • 그렇다면 x0 = x1우리는 P=Q그것을 얻기 위해 접선을 계산합니다 (위 섹션 참조) R. 그때P+Q = P+P = 2P = -R
      • 그렇지 않으면 : y = m*x+y계산하기 위해 위의 두 지점을 통해 양식의 선을 구성 할 수 있습니다 R. 그때P+Q=-R

유한 필드

이 문제의 경우 우리는 단지 크기의 필드를 고려할 p경우 p소수 (때문에 일부 세부 사항 p ≠ 2, p ≠ 3). 이것은 단순히 계산할 수있는 장점이 있습니다 mod p. 다른 분야의 산술은 훨씬 더 복잡합니다.

이 예제에서 우리 p = 5는 여기에서 모든 평등을 합의합니다 mod 5.

2+4 ≡ 6 ≡ 1
2-4 ≡ -2 ≡ 3
2*4 ≡ 8 ≡ 3
2/4 ≡ 2*4 ≡ 3 because 4*4 ≡ 16 ≡ 1, therefore 1/4 ≡ 4

도전

A,B타원 곡선 의 매개 변수 , 주 필드 특성 pP,Q타원 곡선의 두 점이 주어진 경우 그 합을 반환합니다.

  • 매개 변수가 A,B실제로 타원 곡선을 설명 한다고 가정 할 수 있습니다 4A^3+27B^2 ≠ 0.
  • P,Q실제로 타원 곡선 또는 0- 점의 점 이라고 가정 할 수 있습니다 .
  • 이것이 p ≠ 2,3프라임 이라고 가정 할 수 있습니다 .

테스트 사례

MATLAB / Octave에서 (아주 우아하지 않은) 구현을 만들었습니다. ideone.com 자신의 테스트 사례에 사용할 수 있습니다 . 적어도 손으로 만든 몇 가지 계산을 재현했습니다.

여기에서 고려하는 모든 곡선에 적합한 사소한 테스트 사례를 참고하십시오.

0 추가 : P+0 = P 역수 추가 :(x,y) + (x,-y) = 0


들어 p = 7, A = 0, B = 5두 점 P = (3,2)Q = (6,2)타원 곡선에 있습니다. 그런 다음 다음을 유지합니다.

2*Q = Q+Q = P
2*P = P+P = (5,2)
3*P = P+P+P = (5,2)+P = (6,5)
4*P = P+P+P+P = (5,2)+(5,2) = (6,5)+(5,2) = Q

타원 곡선의 모든 위치는 (3,2),(5,2),(6,2),(3,5),(5,5),(6,5),0


들어 p = 13, A = 3, B = 8우리가 얻을

(1,8)+(9,7) = (2,10)
(2,3)+(12,11) = (9,7)
2*(9,6) = (9,7)
3*(9,6) = 0

들어 p = 17, A = 2, B = 2P=(5,1) 우리가 얻을

2*P = (6,3)
3*P = (10,6)
4*P = (3,1)
5*P = (9,16)
6*P = (16,13)
7*P = (0,6)
8*P = (13,7)
9*P = (7,6)
10*P = (7,11)

정말 야심이 있다면

p = 1550031797834347859248576414813139942411
A = 1009296542191532464076260367525816293976
x0 = 1317953763239595888465524145589872695690
y0 = 434829348619031278460656303481105428081
x1 = 1247392211317907151303247721489640699240
y1 = 207534858442090452193999571026315995117

n그런 자연수를 찾아보십시오 n*(x0,y0) = (x1,y1). 자세한 내용은 여기를 참조하십시오.

충수

내 초안을 검토하고 편집 해 주신 @ El'endiaStarman에게 감사드립니다.

왜 타원 곡선입니까?

글쎄, 그것은 일종의 임의의 방정식처럼 보일 수 있지만, 그것은 일반적이지 않습니다. 일반적으로 우리는 투영 평면 에서 기하학적 인 "모양"을 고려합니다 (즉 "무한대"가 나오는 곳). 우리는 모든 동질성 을 고려합니다. 3 차 다항식 (낮거나 더 높은 것은 시험하기가 너무 어렵거나 사소한 것일 수 있습니다.) 우리가 원하는 좋은 특성을 얻기 위해 몇 가지 제한을 적용한 후 그리고 다항식을 비 균질화 한 후 (3 개의 아핀 평면 중 하나로 투영 됨) ) 우리는 다음과 같은 방정식으로 끝납니다.y^2+a*x*y+b*y = x^3+c*x^2+d*x+e이것은 긴 Weierstrass 형태의 타원 곡선입니다. 이것들은 기본적으로 우리가 생각한 것과 같은 곡선이지만 약간 기울어졌습니다. 선형 좌표 변환을 사용하면 간단한 Weierstras 방정식을 쉽게 만들 수 있습니다. 예를 여전히 흥미로운 특성을 보유.

왜 우리는 배제 p=2,3했습니까?

이것은 짧은 Weierstrass 양식의 경우 4A^3+27B^2 ≠ 0특이점을 피하기 위해 제한 이 필요하다는 사실과 관련이 있습니다 (아래에 더 자세히 설명되어 있음). 우리가 가진 특성 2 4 = 0의 분야와 우리가 가진 특성 3의 분야에서, 27 = 0이러한 종류의 분야에 대해 짧은 weierstrass 형태의 곡선을 갖는 것은 불가능합니다.

특이점이란 무엇입니까?

방정식이 4A^3+27B^2=0유지되면 다음과 같은 특이점이 있습니다.이 점에서 알 수 있듯이 미분을 찾을 수 없으므로 탄젠트가 없으므로 연산을 "종료"합니다. 방정식을 y^2 = x^3보거나y^2 = x^3-3*x+2

어쨌든 타원 곡선 이라고 불리는 이유는 무엇 입니까?

그 이유는이 형태의 방정식이 타원 적분으로 나타나기 때문입니다. 이름의 원점에 대한 짧은 슬라이드 쇼.

그들은 암호화와 어떤 관련이 있습니까?

nP = P+P+...+P매우 효율적 으로 계산하는 방법이 있습니다 . 예를 들어 Diffie Hellman 키 교환 에서 사용할 수 있습니다 . 모듈 식 산술은 비틀림 부분 군에 대한 추가로 대체 될 수 있으며, 이들은 한정된 순서를 갖는 곡선상의 점들입니다. (이것은 mP = 0일부의 m경우 기본적으로 계산하는 것을 의미합니다 mod m).

답변:


4

Pyth, (105) 100 바이트

A,@Q3eQ?qGZH?qHZG?&=YqhHhGqeG%_eHhQZ_m%dhQ,-*J?Y*+*3^hG2@Q1^*2eG-hQ2*-eGeH^-hGhH-hQ2-hGK--^J2hGhHeGK

입력은 (p, A, P, Q), 위치 PQ형식의 두 지점 (x, y)또는 특수 0지점 인 경우 와 같이로 예상 됩니다 0. 여기서 온라인으로 사용해 볼 수 있습니다 . 마지막 두 예는 특수한 0작동 방식을 보여줍니다 .

몇 바이트를 절약하기 위해 mod p최종 답변 에만 사용 합니다. 이는 x0^p모듈 식 지수화를 수행하지 않고 몇 번 같은 작업을 수행하므로 매우 느려질 수 있습니다.

이 Python 함수와 거의 동일한 논리를 따라 작동합니다.

def add_ellip(p, A, P, Q): # points are in format (x, y)
    z = 0 # representing special 0 point

    if (P == z):
        return Q
    if (Q == z):
        return P

    if P[0] == Q[0]:
        if (P == (Q[0], -Q[1] % p)):
            return z
        else:
            m = ((3*pow(P[0], 2, p) + A)*pow(2*P[1], p-2, p)) % p
    else:
        m = (P[1] - Q[1])*pow(P[0] - Q[0], p-2, p) % p

    x = (pow(m, 2, p) - P[0] - Q[0]) % p
    y = (m*(P[0] - x) - P[1]) % p
    return (x, y)

이것은 모듈 식 곱셈의 역수 xx^(p-2) mod pif와 같다는 사실에 크게 의존합니다 p. 따라서 m분모의 모듈 식 곱셈 역수를 찾아 분자에 곱하여 선의 기울기 를 계산할 수 있습니다. 꽤 편리합니다. Python 함수는를 사용하기 때문에 더 큰 문제를 조금 더 효율적으로 계산해야합니다 pow.

또한 이 주제 에 대한 Wikipedia 페이지에 표시된 바로 가기를 사용했습니다 . A한 번만 사용 하고 B전혀 사용 하지 않는 것이 흥미 롭습니다 .

또한 재미를 위해 :

def pow2floor(x):
    p = 1
    x >>= 1
    while (x > 0):
        x >>= 1
        p <<= 1
    return p

def multi_nP(p, A, n, P):
    d = {}

    def rec_helper(n, P):
        if (n == 0):
            return (0, 0)
        elif (n == 1):
            return P
        elif (n in d):
            return d[n]
        else:
            p2f = pow2floor(n)
            remainder = n - p2f

            lower_half = rec_helper(p2f//2, P)
            d[p2f//2] = lower_half
            nP = add_ellip(p, A, lower_half, lower_half)

            if (remainder):
                nP = add_ellip(p, A, nP, rec_helper(remainder, P))

            d[n] = nP
            return nP

    return rec_helper(n, P)

multi_nP함수 n*P는 주어진 정수 n와 point를 계산 합니다 P. 그것은 재귀 분할에 의한 전략 사용하는 n두 부분으로 p2f하고 remainder있도록 p2f + remainder = n하고 있음을 p2f = 2^k. 그런 다음 해당 부분에서 함수를 다시 호출하여 결과를로 추가합니다 add_ellip. 또한 이미 계산 된 값을 dict에 저장하여 기본 동적 프로그래밍 방식을 사용했습니다 d.

다음 함수는 이론적으로 동일한 전략을 사용하여 보너스 질문을 해결합니다.

def find_nPQ(p, A, P, Q): # P is input point, Q is what we're looking for
    d = {}
    found_Q = False

    def rec_helper(n, P):
        if (n == 0):
            return (0, 0)
        elif (n == 1):
            return P
        elif (n in d):
            return d[n]
        else:
            p2f = pow2floor(n)
            remainder = n - p2f

            lower_half = rec_helper(p2f//2, P)
            d[p2f//2] = lower_half

            nP = add_ellip(p, A, lower_half, lower_half)

            if (remainder):
                nP = add_ellip(p, A, nP, rec_helper(remainder, P))

            d[n] = nP
            return nP


    for x in range(p):
        xP = rec_helper(x, P)
        if (xP == Q):
            return x

불행히도, 계산하기에 충분히 빠르게 아무데도 실행되지 않습니다. 특히 가능한 모든 값을 반복 할 필요가없는 경우이 작업을 수행하는 훨씬 효율적인 방법이있을 것이라고 생각합니다 n.


나는 정직하게 더 이상 어떤 대답도 기대하지 않았다. =) 당신은 무한 점을 어떻게 다루는가? ( y^2 = x^3 + x유효한 타원 곡선이며 곡선 (0,0) ≠ 0의 점입니다!)
flawr

좋은 질문입니다. 처리하지 않은 것 같습니다. : P 사과합니다. 첫 번째 그림을보고 어디에서 B = 0어떻게 0작동 하는지 궁금한 것을 기억 합니다. 그리고 잊어 버렸습니다. B어젯밤 늦은 시점에서 0이 될 수 없다고 생각 합니다. 이에 대한 입력 내용에 대한 제안 사항이 있습니까? 아마도 그렇다면 B = 0, 0 = (-1, -1)? 처리하기 위해 코드를 조정하게되어 기쁩니다. 다른 제출물에 대해서도 표준화되어 있다면 좋을 것 같습니다 ...
Rhyzomatic

글쎄, 제출물이 그들에게 편리한 것을 사용할 수 있도록 퐁당을 열어 두었습니다. 그러나 물론 곡선의 모든 유한 점은 음이 아닌 좌표를 가지며 다른 모든 점은 무한대 점 또는 이와 유사한 것으로 간주됩니다. 또는 더 쉬운 경우 입력 [0](하나의 좌표 만)이 무한대 또는 유사한 것으로 가정 할 수도 있습니다 !
flawr

그것이 제대로 처리되지 않으면 알려주십시오. 그리고 고맙게도 실제로 5 바이트를 절약했습니다!
Rhyzomatic 2016 년

@flawr, 효율적인 컴퓨팅을 위해 올바른 길을 가고 있는지 말해 줄 수 nP있습니까? 생각이 흐르도록 주제에 관한 자료를 알려 주시겠습니까? 인터넷 검색을 찾는 데 어려움을 겪고 있습니다. 감사!
Rhyzomatic 2016 년

0

파이썬 3, 193 191 바이트

Rhyzomatic의 Pyth 답변 및 Python 논리를 기반으로 한 솔루션 . 특히. 나는 x^3 + bx^2 + cx + d당신이 두 개의 뿌리를 가지고 x_1있고 x_2그것을 알아 차리고 b == x_1 + x_2 + x_3그에 따라 빼서 음의 입방 다항식의 세 번째 뿌리를 어떻게 찾았는지 좋아했습니다 . 루비가 더 짧은 것으로 판명되면 설명을 추가하고 골프를 치고 루비로 변환 할 계획입니다.

def e(p,A,B,P,Q):
 if P==0:return Q
 if Q==0:return P
 f,g=P;j,k=Q
 if f==j:
  if g==-k%p:return 0
  m=(3*f*f+A)*pow(2*j,p-2)
 else:m=(g-k)*pow(f-j,p-2)
 x=m*m-f-j;y=m*(f-x)-g;return(x%p,y%p)

풀기 :

def elliptic_curve_addition(p, A, B, P, Q):
    if P == 0:
        return Q
    if Q == 0:
        return P
    f,q = P
    j,k = Q
    if f==j:
        if g == (-k) % p:
            return 0
        m = (3 * f**2 + A) * pow(2*j, p-2)
    else:
        m = (g-k) * pow(f-j, p-2)
    x = m**2 - f - j
    y = m * (f-x) - g
    return (x%p, y%p)

파이썬이 Pyth 응답의 두 배보다 짧다는 것에 놀랐습니다!
flawr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.