목차
제 1 장 ECC 알고리즘
제 1 절 ECC 알고리즘 정의 및 종류
1.1.1 ECC 알고리즘 정의
1.1.2 ECC 알고리즘 종류
제 2 절 ECC의 수학적 정의
1.2.1 ECC에서 파라미터 생성
1.2.2 ECC에서 덧셈
1.2.3 ECC에서 뺄셈
2장 EC-ElGamal 예제 소스
제 1 절 ECC 알고리즘 정의 및 종류
1.1.1 ECC 알고리즘 정의
1.1.2 ECC 알고리즘 종류
제 2 절 ECC의 수학적 정의
1.2.1 ECC에서 파라미터 생성
1.2.2 ECC에서 덧셈
1.2.3 ECC에서 뺄셈
2장 EC-ElGamal 예제 소스
본문내용
xx_2 = xx - sum_x;
if(xx_2<0)
{
xx_2+=pp;
xx_2 = mod(xx_2,pp);
}
U_clide = Uclide(xx_2,pp);
k= (yy-sum_y)*U_clide;
k = mod(k,pp);
sum_x = (((k*k)%pp)-xx-sum_x);
sum_x = mod(sum_x,pp);
sum_y = (k*(xx-sum_x)-yy);
sum_y = mod(sum_y,pp);
}// 리더에서 kcg 값 구하기 (즉 태그의 ckg값과 같음) 끝
else if(xx==sum_x && (yy != sum_y || (yy+sum_y)%pp ==0))
{
sum_x=xx;
sum_y=yy;
printf("\n항등원 연산 x1값 y1값 : (%d,%d)을 보냅니다.!!\n",sum_x,sum_y);
break;
}
if(sum_x<0)
sum_x+=pp;
if(sum_y<0)
sum_y+=pp;
printf(" %d 번째 연산 값 : (%d,%d) 입니다.!!\n",i,sum_x,sum_y);
}
printf("\n kc1좌표값: (%d,%d).!!\n",sum_x,sum_y);
bab=ecc_end(pp,aa,c2xx,c2yy,sum_x,sum_y);
return yy;
}
long ecc_end(long pp, long aa, long xx, long yy, long c2xx, long c2yy)
{
float p_2, kcg_y;
long yy_2, xx_2, U_clide, k, bab, sum_x, sum_y;
printf("\n 암호화 된 좌표값: (%d,%d).!!\n",xx,yy);
p_2=pp/2.0;
if(c2yy>p_2)
{
kcg_y = c2yy - p_2 ;
c2yy = p_2 - kcg_y ;
}
else if(c2yy
{
kcg_y = p_2 - c2yy;
c2yy = p_2 + kcg_y;
}
printf("\n ckg 값의 역원은 (%d,%d)",c2xx,c2yy);
sum_x = c2xx;
sum_y = c2yy;
if(xx==sum_x && yy==sum_y && yy+sum_y!=0) // 리더에서 M 값 복호하기 (즉 태그의 (ckg+M)-kcg 함 )
{
yy_2 = (yy+yy);
yy_2 = mod(yy_2,pp);
U_clide = Uclide(yy_2,pp);
k = (((3*((xx*xx)%pp))+aa)*U_clide);
k= mod(k,pp);
sum_x = k*k-(2*xx);
sum_x = mod(sum_x,pp);
sum_y = k*(xx-sum_x)-yy;
sum_y = mod(sum_y,pp);
}
else if(xx != sum_x)
{
xx_2 = xx - sum_x;
if(xx_2<0)
{
xx_2+=pp;
xx_2 = mod(xx_2,pp);
}
U_clide = Uclide(xx_2,pp);
k= (yy-sum_y)*U_clide;
k = mod(k,pp);
sum_x = (((k*k)%pp)-xx-sum_x);
sum_x = mod(sum_x,pp);
sum_y = (k*(xx-sum_x)-yy);
sum_y = mod(sum_y,pp);
}// 리더에서 M 값 복호하기 (즉 태그의 (ckg+M)-kcg 함) 끝
else if(xx==sum_x && (yy !=sum_y || (yy+sum_y)%pp ==0))
{
sum_x=xx;
sum_y=yy;
}
if(sum_x<0)
sum_x+=pp;
if(sum_y<0)
sum_y+=pp;
printf("\n\n==================================메세지 복호화 ==============================\n\n");
printf(" 최종 밥의 M 값 c2-kc1(kcg) : (%d,%d) 입니다.!!\n",sum_x,sum_y);
printf("\n\n==============================================================================\n\n");
return yy;
}
long mod(long a, long p)
{
a = a - ((a/p)*p);
return a ;
}
long Uclide(long inverse, long mod)
{// 공약수(역원) 구하기 sub routine
long p1=mod;// 법 p 에 대한 역원구하기
long x1=1; long y1=0;// 유클리트 알고리즘
long x2=0; long y2=1;// 유클리트 알고리즘
long ii=0;
long r1, quot1, e;
quot1 = 0 ;
while(inverse!=0)
{
r1 = p1-((p1/inverse)*inverse); // size(p2) 와 p1 의 공약수 구하기
quot1 = p1/inverse;// 몫
if(ii%2 ==0)
{
y1-=(y2*quot1);
}// p2와 곱하는 값
else
{
y2-=(y1*quot1);
} // p2와 곱하는 값
ii++;
p1=inverse; // 최종 p1이 공약수
inverse=r1;
}
if(ii%2 ==0)
{
e=y1;
}
else
{
e=y2;
} // this2 는 size(p2)의 역원(mod p) 최종 결과
if(e<0)
{
e+=mod;
}// 양수로 만들기
return e;
}
---------------------------소 스 끝----------------------------
프로그램에 대한 문의는 이메일로 접수하나 답변은 보장하지 못한다. 본 문서는 글자 하나하나 정성들여 작성하였으며 인용문을 제외한 모든 정리(그림, 수식, 설명 등)는 문서 제작자 스스로 작성하였다. 물론 과제용으로 수정하여 제출 가능 하나 본 문서는 암호학에 관심이 깊은 학생들의 기초 자료로서 가치를 가지길 바란다. 또한 본 문서는 인터넷 어디에도 쉬운 ECC 소스가 공유되지 않아 작성한 문서이다. 개인 블러그나 홈페이지를 통해 공개할 예정도 있으나 무분별하게 공유되는 것은 제작자라면 모두 원치 않는 일이므로 레포트샵을 통해 공개하는 것은 이해하길 바란다.
if(xx_2<0)
{
xx_2+=pp;
xx_2 = mod(xx_2,pp);
}
U_clide = Uclide(xx_2,pp);
k= (yy-sum_y)*U_clide;
k = mod(k,pp);
sum_x = (((k*k)%pp)-xx-sum_x);
sum_x = mod(sum_x,pp);
sum_y = (k*(xx-sum_x)-yy);
sum_y = mod(sum_y,pp);
}// 리더에서 kcg 값 구하기 (즉 태그의 ckg값과 같음) 끝
else if(xx==sum_x && (yy != sum_y || (yy+sum_y)%pp ==0))
{
sum_x=xx;
sum_y=yy;
printf("\n항등원 연산 x1값 y1값 : (%d,%d)을 보냅니다.!!\n",sum_x,sum_y);
break;
}
if(sum_x<0)
sum_x+=pp;
if(sum_y<0)
sum_y+=pp;
printf(" %d 번째 연산 값 : (%d,%d) 입니다.!!\n",i,sum_x,sum_y);
}
printf("\n kc1좌표값: (%d,%d).!!\n",sum_x,sum_y);
bab=ecc_end(pp,aa,c2xx,c2yy,sum_x,sum_y);
return yy;
}
long ecc_end(long pp, long aa, long xx, long yy, long c2xx, long c2yy)
{
float p_2, kcg_y;
long yy_2, xx_2, U_clide, k, bab, sum_x, sum_y;
printf("\n 암호화 된 좌표값: (%d,%d).!!\n",xx,yy);
p_2=pp/2.0;
if(c2yy>p_2)
{
kcg_y = c2yy - p_2 ;
c2yy = p_2 - kcg_y ;
}
else if(c2yy
kcg_y = p_2 - c2yy;
c2yy = p_2 + kcg_y;
}
printf("\n ckg 값의 역원은 (%d,%d)",c2xx,c2yy);
sum_x = c2xx;
sum_y = c2yy;
if(xx==sum_x && yy==sum_y && yy+sum_y!=0) // 리더에서 M 값 복호하기 (즉 태그의 (ckg+M)-kcg 함 )
{
yy_2 = (yy+yy);
yy_2 = mod(yy_2,pp);
U_clide = Uclide(yy_2,pp);
k = (((3*((xx*xx)%pp))+aa)*U_clide);
k= mod(k,pp);
sum_x = k*k-(2*xx);
sum_x = mod(sum_x,pp);
sum_y = k*(xx-sum_x)-yy;
sum_y = mod(sum_y,pp);
}
else if(xx != sum_x)
{
xx_2 = xx - sum_x;
if(xx_2<0)
{
xx_2+=pp;
xx_2 = mod(xx_2,pp);
}
U_clide = Uclide(xx_2,pp);
k= (yy-sum_y)*U_clide;
k = mod(k,pp);
sum_x = (((k*k)%pp)-xx-sum_x);
sum_x = mod(sum_x,pp);
sum_y = (k*(xx-sum_x)-yy);
sum_y = mod(sum_y,pp);
}// 리더에서 M 값 복호하기 (즉 태그의 (ckg+M)-kcg 함) 끝
else if(xx==sum_x && (yy !=sum_y || (yy+sum_y)%pp ==0))
{
sum_x=xx;
sum_y=yy;
}
if(sum_x<0)
sum_x+=pp;
if(sum_y<0)
sum_y+=pp;
printf("\n\n==================================메세지 복호화 ==============================\n\n");
printf(" 최종 밥의 M 값 c2-kc1(kcg) : (%d,%d) 입니다.!!\n",sum_x,sum_y);
printf("\n\n==============================================================================\n\n");
return yy;
}
long mod(long a, long p)
{
a = a - ((a/p)*p);
return a ;
}
long Uclide(long inverse, long mod)
{// 공약수(역원) 구하기 sub routine
long p1=mod;// 법 p 에 대한 역원구하기
long x1=1; long y1=0;// 유클리트 알고리즘
long x2=0; long y2=1;// 유클리트 알고리즘
long ii=0;
long r1, quot1, e;
quot1 = 0 ;
while(inverse!=0)
{
r1 = p1-((p1/inverse)*inverse); // size(p2) 와 p1 의 공약수 구하기
quot1 = p1/inverse;// 몫
if(ii%2 ==0)
{
y1-=(y2*quot1);
}// p2와 곱하는 값
else
{
y2-=(y1*quot1);
} // p2와 곱하는 값
ii++;
p1=inverse; // 최종 p1이 공약수
inverse=r1;
}
if(ii%2 ==0)
{
e=y1;
}
else
{
e=y2;
} // this2 는 size(p2)의 역원(mod p) 최종 결과
if(e<0)
{
e+=mod;
}// 양수로 만들기
return e;
}
---------------------------소 스 끝----------------------------
프로그램에 대한 문의는 이메일로 접수하나 답변은 보장하지 못한다. 본 문서는 글자 하나하나 정성들여 작성하였으며 인용문을 제외한 모든 정리(그림, 수식, 설명 등)는 문서 제작자 스스로 작성하였다. 물론 과제용으로 수정하여 제출 가능 하나 본 문서는 암호학에 관심이 깊은 학생들의 기초 자료로서 가치를 가지길 바란다. 또한 본 문서는 인터넷 어디에도 쉬운 ECC 소스가 공유되지 않아 작성한 문서이다. 개인 블러그나 홈페이지를 통해 공개할 예정도 있으나 무분별하게 공유되는 것은 제작자라면 모두 원치 않는 일이므로 레포트샵을 통해 공개하는 것은 이해하길 바란다.
소개글