암호화폐에서 쓰는 알고리즘은 타원곡선함수이다. 방정식은 y2=x3+7 이다.
위 공식에서 타원곡선상의 특징점 G(x,y)에 개인키를 곱셈연산해서 그 결과값을 공개키로 한다. 공개키는 좌표(x1,y1) 형식이다. 암호화폐에서 쓰는 ecdsa 규격은 secp256k1 이다. 여기서 특징점, 상수는 다음과 같다.
한계값p 베이스값G 반복주기값n 은 다음과 같다.
a=0
b=7
G = (x,y)= (79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 , 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8)
p = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F
= 2256 - 232 - 29 - 28 - 27 - 26 - 24 - 1
n = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141
기본덧셈은 다음과 같이 계산된다.
특정점 (Xp,Yp)에 2를 곱한 결과값은
( (3Xp^2 + a) / 2Yp )^2 - 2Xp ,
Yp + ( (3Xp^2 + a) / 2Yp ) * ( ( (3Xp^2 + a) / 2Yp ) ^2 - 3 Xp)
가 된다. (a=0이고 b는 7이다).
2를 곱한값을 알수있음으로 2^N을 계산할수있다. 2^N승 끼리 더하면 어떤 숫자조합도 구할수 있고 결국엔 개인키*특정점G의 값, 공개키를 얻을수있게된다.
한가지더 ECC타원곡선암호화에서 덧셈연산이 있다. 특정 두개의 점 (Xp,Yp) ,(Xq,Yq)를 덧셈하는 공식은
( m^2 - Xp - Xq , Yp + m( m^2 - Xp - Xq - Xp) ) 가된다.
m=(Yp-Yq)/(Xp-Xq) (기울기)
Xp=Xq,Xq=Yq일때 m은 아래와같은데 2P를 구하는 공식에쓰인다
m=(3Xp^2+a)/(2*Yp) 로써, 타원곡선과 Xp,Yp점에 접하는 직선의 기울기를 구하는 공식이다.
위공식에 한계값p를 적용하면
( (m^2 - Xp - Xq) mod p ,( Yp + m( (m^2 - Xp - Xq) mod p - Xp) mod p) 가된다.
m=((Yp-Yq)/(Xp-Xq) ) mod p (기울기)
m=((3Xp^2+a)/(2Yp) mod p
가 된다.
개인키를 비트로 분해한다. 각분해인자들의 2^N값들은 계산하여 저장해둔다.
최대 256비트임으로 256가지의 값이 있을것이다. 이것을 GNTABLE(0 ~255)이라하자
첫번째값 GNTABLE(0), 즉 2^0의 값은 특정점 G와 동일하다.
가령 개인키 1000001는 26+20임으로 GNTABLE(6)+GNTABLE(0)으로 표현될수 있다.
아니면 위방법말고 그냥 N번 G를 반복해서 뎃셈하는 방법이 있는데 256비트(2^256)만큼의 횟수를 요함으로 시간이 너무 많이 걸릴것이다. 윗에 방법은 최대 256번의 덧셈만 해주면 된다.
한계값 p의 경우는 x,y값은 p값을 넘을수 없다 만약 넘는다면 p로 나눈나머지가 x,y결과값이 될것이다.
n의 경우는 ecc 곱셈연산특성상 결과값이 순환하는특징을 가지고있는데 n번순환한다는것이다. 때문에 개인키를 n으로 나눈 나머지값을 써도 결과는 똑같다.즉 n의 값이 클수록 공개키를 통해 개인키를 알아내기가 어렵고 n값은 p값을 넘지 못한다.또한 한계값 p때문에 알기가 어렵다.