ECDSA 이해하기

Jake Kim·2024년 8월 28일

PSE2024

목록 보기
15/17

ECDSA는 EC + DSA로 볼 수 있다. EC는 Elliptic curve, DSA는 RSA와 비슷한 암호화 기법이다.
EC에 대한 내용은 내 이전 벨로그에도 기록이 있고, 꽤 많이 다뤄진다.
https://velog.io/@jakeweb3/6.-Elliptic-Curves-ECC
하지만 ECDSA는 생각외로 정리된 글이 없어 아래와 같이 메모 해 두려 한다.

Elgamal -> DSA (ECDSA)

ECDSA를 이해하기 위해서는 배경지식이 필요하다.
일단 DSA를 알아야 한다. EC는 Elliptic Curve 이므로 DSA를 알고 EC를 적용하면 이해가 쉽다. 또 DSA를 알기 위해서는 Elgamal을 알면 이해에 도움이 된다. 차근 차근 밟고 올라가는 계단과 같다.

아래 링크를 참조하자. 중요한 부분만 가져와 보았다.

https://blog.humminglab.io/posts/tls-cryptography-9-dsa/

여기에서는 RSA, Elgamal, DSA에 대해서 정리한다.
(해당 글에서 Notation 이 헷갈릴 수 있는데, 예를 들어 k\overline kk1k^{-1} 과 같은 의미다. )

Elgamal Signature 핵심

페르마의 소정리 Fermat's Little Theorem

kp11(modp)k^{p-1} \equiv 1 \pmod {p}

여기서 pp 는 소수, kk0<k<p0<k<p 이다. 나중에 나온다.

Alice : 메시지 송신자,
Bob : 메시지 수신자

  1. Bob은 다음을 공유한다.
    (p,α,β)p=큰소수α=primitive root (given)ββαz(modp)(z is secret key)(p, \alpha, \beta) \\ p = 큰 소수 \\ \alpha = primitive\ root\ (given)\\ \beta \leftarrow \beta \equiv \alpha^z \pmod {p}\\ (z\ is\ secret\ key)

즉 Secret Key zz 를 이용해 세번째 공개키를 만들어 총 세가지 공개키를 공유한다.

  1. Alice는 평문을 암호화한다.
    즉, r,sr, s를 계산하여 Bob에게 재전송
(r, s)rαk(modp)smβk(modp)k is Random, (p1)과 서로소(r,\ s)\\ r \equiv \alpha^k \pmod {p} \\ s \equiv m \beta^k \pmod {p} \\ k\ is\ Random,\ (p-1)과\ 서로소
  1. Bob은 암호문을 받고 본인의 비밀키 z를 이용, 해독 (복호화) 한다.
βk(αz)k>(αk)zrz(modp)βkrz(modp)s(rz)1=m(modp)smβkmrz(modp)\beta^k \equiv (\alpha^z)^k \equiv >(\alpha^k)^z \equiv r^z \pmod {p}\\ \rightarrow \beta^k \equiv r^z \pmod {p}\\ \rightarrow s*(r^z)^{-1} = m \pmod {p}\\ \because s \equiv m \beta^k \equiv mr^z \pmod {p} \\

DH -> ECDH

앞선 내 블로그 글에서 DH (Diffie Helman) 을 정리한 바 있다. 이것을 응용해 ECDH를 만들 수 있다. DH란 결국 지수의 곱 연산을 응용하는 것이다.

ga×gb=ga+bg^a \times g^b = g^{a+b}
(ga)b or (gb)a\neq (g^a)^b \ or \ (g^b)^a

즉 a와 b를 알고 있지 못하면, 공개된 gag^a 혹은 gbg^b 만 가지고는 절대로 (ga)b(g^a)^b를 알아낼 수 없다. ((gb)a(g^b)^a도 마찬가지)

이것을 아래 글에서 ECDH로 정리 해 주었다.

https://blog.humminglab.io/posts/tls-cryptography-12-ecc2/

Generator GG 에 대해서 kGkG로 표기하는 것은, 단순 곱셈이 아닌 Elliptic Curve 연산이다. 앞선 글 Elliptic Curve 에서 정리 해 두었다.

Alice 와 Bob은 다음에 대해 교환한다. 이는 모두에게 공개된 것이다.

(p, G, a, b)the "Domain Parameters"(p,\ G,\ a,\ b)\\ \rightarrow the\ "Domain\ Parameters"

여기서
pp: 모듈러 값 ,
GG: Generator ,
aa, bb: 타원 곡선의 aa, bb

Alice : Ha=daGH_a = d_a G 를 계산 (dad_a는 Random)
Bob : Hb=dbGH_b = d_b G 를 계산
공통의 Secret Key :
S=daHb=da(dbG)=db(daG)=dbHaS = d_a H_b = d_a(d_b G) = d_b (d_a G) = d_b H_a

이제 ECDSA는 쉽게 이해할 수 있다. 위 글에서도 나와 있지만, 아래 도훈님 블로그에도 잘 설명되어 있다. 내용은 대동소이하다.

https://velog.io/@dohoon8/Cryptography-4.-ECDH와-ECDSA에-대하여-pgbr3e5a

여기에 더해, 특히 비트코인에 사용된 Secp256k1 곡선에 대해 ECDSA를 "돌리는" 과정을 간략히 정리한다.

Secp256k1 곡선은 미국 NIST에서 권장하는 안전하고 효율적인 곡선이다.

이 곡선을 선택하는 순간 다음의 Spec, 상수 혹은 "Domain Parameter"가 설정된다.

(p, G, a, b)(p,\ G,\ a,\ b)

  • p=2256232977p=2^256−2^32−977
  • GG : Given
  • a=0,b=7a=0, b=7 in the curve equation y2=x3+ax+by^2=x^3+ax+b
  • Order(n)Order (n): The number of points on the elliptic curve, including the point at infinity:
    n=115792089237316195423570985008687907852837564279074904382605163141518161494337n=115792089237316195423570985008687907852837564279074904382605163141518161494337
  • Cofactor (h): For SECP256k1, h=1h=1.

여기서 nnOrderOrder라고 나와 있지만 ,다항식의 차수 (2차항, 3차항 등)이 아니라, Elliptic Curve에서 Generator GG를 1번에서 N번까지 "돌리면" 다시 1*GG로 돌아오는 차수이다. Plonk-by-hand 예제를 보면 알 수 있다. (해당 예제에서는 16번 돌고 1번 더 돌리면 즉 17번 돌리면 원래 자리로 돌아옴)

  • Key Generation

    • Private Key (d)(d): Randomly chosen integer in the range [1,n1][1,n−1]
    • Public Key (Q)(Q): Calculated by multiplying the private key with the base point GG on the elliptic curve:
      Q=d×GQ=d×G

여기서 dd는 내 비밀키 이므로 절대 유출하지 않는다. QQ는 Bob에게 전달한다.

여기서 kk값의 개념이 등장한다. 이는 랜덤 값으로, 매 서명마다 반드시 랜덤으로 Generate 해야 하는 값이다. 위의 dd는 재사용이 되지만, kk는 재사용 하는 순간 모든 비밀이 풀린다.

To sign a message mm:

  1. Hash the message: Compute the hash of the messagemm, often using SHA-256.
  2. Select random integerkk: Randomly selectkkfrom the range[1,n1][1, n-1].
  3. Compute pointR=(xR,yR)=k×GR = (x_R, y_R) = k \times G: Calculate a point on the elliptic curve.
  4. Computer=xRmodnr = x_R \mod n: Take the x-coordinate ofRRmodulonn.
  5. Computes=k1(z+rd)modns = k^{-1}(z + rd) \mod n: Wherezzis the hashed message andddis the private key. Here,k1k^{-1}is the multiplicative inverse ofkkmodulonn.
  6. Signature: The signature for the message is the pair(r,s)(r, s).

다음 값을 Bob에게 전달한다.

Q,r,sQ, r, s

Verification Process

To verify a signature(r,s)(r, s)for a messagemmand public keyQQ:

  1. Hash the message: Compute the hashzzof the messagemm.
  2. Computew=s1modnw = s^{-1} \mod n: Calculate the modular inverse ofss.
  3. Computeu1=zwmodnu_1 = zw \mod nandu2=rwmodnu_2 = rw \mod n: Calculate two values used in the verification.
  4. Compute pointP=u1×G+u2×QP = u_1 \times G + u_2 \times Q: Use the base point GG and the public key QQ to compute a new point PP on the elliptic curve.
  5. Compute v=xP(modn)v = x_P \pmod {n}: Take the x-coordinate of point P(modn)P \pmod{n}.
  6. Check if v=r?v = r ?
    \rightarrowIf equal, the signature is valid; otherwise, it is invalid.

4. Security Properties of SECP256k1 in ECDSA

  • High Security: The 256-bit key size provides a high level of security against brute-force attacks.
  • Efficiency: Due to the simplicity of its equation and the smaller key size compared to RSA, SECP256k1 allows for faster computations and reduced storage requirements, making it suitable for systems with limited resources like cryptocurrencies.
  • Widely Used: SECP256k1’s application in Bitcoin has led to widespread adoption, making it a well-tested and scrutinized elliptic curve.
profile
세일즈 출신 개발자 제이크입니다.

0개의 댓글