프로그래머의 삶 Programmer's Life/C & C++

Diffie - Hellman 키 교환

Oliver's World 2008. 11. 5. 11:18
728x90

 

#include<stdio.h>

int FuncS(int ); // 소수 판별 함수
int FuncF(int ,int ,int ); // 제곱승 연산 함수
int FuncM(int ,int); // mod연산 함수

void main()
{
 int a,p,x,y,ka,kb,sa,sb;
 printf("Diffie - Hellman 키 교환 프로그램입니다. \n");
 printf("\n소수 p를 입력하시오.(숫자만 입력하십시오.)\n");
 scanf("%d",&p);
 p=FuncS(p); //소수 판별 함수 호출
 printf("원시근 정수 a를 입력하십시오.\n");
 scanf("%d",&a);
 printf("A의 비밀키를 입력하십시오.\n");
 scanf("%d",&x);
 printf("B의 비밀키를 입력하십시오.\n");
 scanf("%d",&y);
 ka=FuncF(a,x,p); //  A 의 비밀키를 이용한 이산대수 계산
 kb=FuncF(a,y,p); //  B 의 비밀키를 이용한 이산대수 계산
 sa=FuncF(kb,x,p); // B 값을 전송 받은 후의 A의 이산대수 계산
 sb=FuncF(ka,y,p); // A 값을 전송 받은 후의 B의 이산대수 계산
 printf("%d 값은 B로 전송 %d 값은 A로 전송\n",ka,kb);
 printf("교환되고 난 후의 결과값은 %d,%d\n",sa,sb);
 if(sa==sb) // Diffie-Hellman 키 교환의 오류 확인
  printf("결과적으로 동일한 키 값을 가진다.\n");
 else
  printf("동일하지 않은 키 값을 가진다.-오류\n");
}

int FuncS(int p)
{
 int i;
 for(i=2;i<p;i++)
 {
  if(p%i==0) // 소수식별
  {
   printf("\n소수가 아닙니다. 재입력하십시오.\n");
   scanf("%d",&p); // 소수 아닐경우 재입력
  }
 }
 return p; // 소수의 경우 값을 되돌린다.
}

int FuncF(int a,int x,int p)
{
    int o=1;
 while(x>1) // 제곱승 이상일 경우 실행
 {
  if(x%2==0) // 반복 계산을 줄이기 위하여 밑수의 제곱승 연산
  {
   a*=a;
   x/=2;
   a=FuncM(a,p);
   o*=1;
  }
  else // x가 홀수일 경우 밑수의 제곱승 연산
  { 
   o*=a;
   a*=a;
   x=(x-1)/2;
   a=FuncM(a,p);
  }
 }
 return FuncM(o*a,p);
}

int FuncM(int a,int p)
{
 return a%p; // mod 연산
}


  

 

728x90