#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 연산
}