Needham-Schroeder protocol
#include<conio.h>
#include<stdio.h>
#include<dos.h>
struct KDC
{
int challenge;
int response;
int response1;
int response2;
int session_key;
int sender_key;
int receiver_key;
int ticket;
}KDC;
struct A
{
int mykey;
int challenge;
int save;
int response;
int response_got;
int response1;
int response2;
int session_key;
int ticket;
}A;
struct B
{
int mykey;
int challenge;
int response;
int session_key;
int ticket;
}B;
void main()
{
int i;
int temp;
int ch;
clrscr();
for(i=0;i<3;i++)
{
printf("\n You want to communicate (1.Yes/2.No) :: ");
scanf("%d",&ch);
if(i==2)
{
printf("your chance ended!!!");
sound(100);
delay(500);
nosound();
}
if(ch==1)
break;
}
if(ch==1)
{
printf("\n communication started ...");
A.mykey=accept_key_A();
KDC.sender_key=A.mykey;
printf("\n A's key deposited to KDC");
B.mykey=accept_key_B();
KDC.receiver_key=B.mykey;
printf("\n B's key deposited to KDC");
temp=random_number();
A.save=temp;
A.challenge=temp;
//KDC received the challenge
KDC.challenge=A.challenge;
//KDC replies with resonse and ticket
temp=random_number();
KDC.session_key=temp;
KDC.response1=KDC.challenge+KDC.sender_key;
KDC.response2=KDC.session_key+KDC.sender_key;
KDC.ticket=KDC.receiver_key+KDC.session_key;
A.response_got=KDC.response1;//A received the response
A.response1=A.response_got-A.mykey;
if(A.response1==A.challenge)
printf("\n Given challenge is verified.");
else
{
printf("\n communication ended due to lack of hacker.");
goto exit;
}
A.session_key=KDC.response2-A.mykey;
//KDC is verified
A.ticket=KDC.ticket;
//now sender communicate with bob
temp=random_number();
A.save=temp;
A.challenge=temp;
B.challenge=A.challenge;//ra
B.ticket=A.ticket;
temp=B.ticket-B.mykey;
B.session_key=temp;
//send reply
B.response=B.session_key+B.challenge-1;
temp=random_number();
B.challenge=temp;
A.response
=B.response;
if((A.response-A.session_key+1)==A.save)
{
printf("\n bob is authenticated !!!");
printf("\n now further verification starts");
delay(1000);
}
else
{
printf("\n Authentication fail!!!");
goto exit;
}
A.challenge=B.challenge;
A.response=A.challenge+A.session_key-1;
if((B.challenge-1)==A.response-A.session_key)
{
printf("\n Authentication Done!!!");
sound(100);
delay(500);
nosound();
}
else
printf("\n Trudy has interapted the communication");
}
else
{
printf("\n communication aborted !!!");
}
exit:
getch();
}
int accept_key_A()
{
int a;
printf("\n enter the private key of A :: ");
scanf("%d",a);
return (a);
}
int accept_key_B()
{
int b;
printf("\n enter the private key of B :: ");
scanf("%d",&b);
return (b);
}
int random_number()
{
int a;
a=rand()%10;
return (a);
}
OUTPUT:
You want to communicate (1.Yes/2.No) :: 1
communication started ...
enter the private key of A :: 4
A's key deposited to KDC
enter the private key of B :: 3
B's key deposited to KDC
Given challenge is verified.
bob is authenticated !!!
now further verification starts
Authentication Done!!!