/* This program calculates the Key for two persons
using the Diffie-Hellman Key exchange algorithm */
#include<stdio.h>
#include<math.h>
// Power function to return value of a ^ b mod P
long long int power( long long int a, long long int b,
long long int P)
{
if ( b == 1 )
return a;
else
return ( ( ( long long int ) pow ( a
, b
) ) % P
) ; }
//Driver program
int main( )
{
long long int P, G, x, a, y, b, ka, kb;
// Both the persons will be agreed upon the
// public keys G and P
P = 23 ; // A prime number P is taken
printf ( "The value of P : %lld\n " , P
) ;
G = 9 ; // A primitve root for P, G is taken
printf ( "The value of G : %lld\n \n " , G
) ;
// Alice will choose the private key a
a = 4 ; // a is the chosen private key
printf ( "The private key a for Alice : %lld\n " , a
) ; x = power( G, a, P) ; // gets the generated key
// Bob will choose the private key b
b = 3 ; // b is the chosen private key
printf ( "The private key b for Bob : %lld\n \n " , b
) ; y = power( G, b, P) ; // gets the generated key
// Generating the secret key after the exchange
// of keys
ka = power( y, a, P) ; // Secret key for Alice
kb = power( x, b, P) ; // Secret key for Bob
printf ( "Secret key for the Alice is : %lld\n " , ka
) ; printf ( "Secret Key for the Bob is : %lld\n " , kb
) ;
return 0 ;
}
Ci8qIFRoaXMgcHJvZ3JhbSBjYWxjdWxhdGVzIHRoZSBLZXkgZm9yIHR3byBwZXJzb25zICAKdXNpbmcgdGhlIERpZmZpZS1IZWxsbWFuIEtleSBleGNoYW5nZSBhbGdvcml0aG0gKi8KI2luY2x1ZGU8c3RkaW8uaD4gCiNpbmNsdWRlPG1hdGguaD4gCiAgCi8vIFBvd2VyIGZ1bmN0aW9uIHRvIHJldHVybiB2YWx1ZSBvZiBhIF4gYiBtb2QgUCAKbG9uZyBsb25nIGludCBwb3dlcihsb25nIGxvbmcgaW50IGEsIGxvbmcgbG9uZyBpbnQgYiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxvbmcgaW50IFApIAp7ICAKICAgIGlmIChiID09IDEpIAogICAgICAgIHJldHVybiBhOyAKICAKICAgIGVsc2UKICAgICAgICByZXR1cm4gKCgobG9uZyBsb25nIGludClwb3coYSwgYikpICUgUCk7IAp9IAogIAovL0RyaXZlciBwcm9ncmFtIAppbnQgbWFpbigpIAp7IAogICAgbG9uZyBsb25nIGludCBQLCBHLCB4LCBhLCB5LCBiLCBrYSwga2I7ICAKICAgICAgCiAgICAvLyBCb3RoIHRoZSBwZXJzb25zIHdpbGwgYmUgYWdyZWVkIHVwb24gdGhlICAKICAgICAgICAvLyBwdWJsaWMga2V5cyBHIGFuZCBQICAKICAgIFAgPSAyMzsgLy8gQSBwcmltZSBudW1iZXIgUCBpcyB0YWtlbiAKICAgIHByaW50ZigiVGhlIHZhbHVlIG9mIFAgOiAlbGxkXG4iLCBQKTsgIAogIAogICAgRyA9IDk7IC8vIEEgcHJpbWl0dmUgcm9vdCBmb3IgUCwgRyBpcyB0YWtlbiAKICAgIHByaW50ZigiVGhlIHZhbHVlIG9mIEcgOiAlbGxkXG5cbiIsIEcpOyAgCiAgCiAgICAvLyBBbGljZSB3aWxsIGNob29zZSB0aGUgcHJpdmF0ZSBrZXkgYSAgCiAgICBhID0gNDsgLy8gYSBpcyB0aGUgY2hvc2VuIHByaXZhdGUga2V5ICAKICAgIHByaW50ZigiVGhlIHByaXZhdGUga2V5IGEgZm9yIEFsaWNlIDogJWxsZFxuIiwgYSk7IAogICAgeCA9IHBvd2VyKEcsIGEsIFApOyAvLyBnZXRzIHRoZSBnZW5lcmF0ZWQga2V5IAogICAgICAKICAgIC8vIEJvYiB3aWxsIGNob29zZSB0aGUgcHJpdmF0ZSBrZXkgYiAKICAgIGIgPSAzOyAvLyBiIGlzIHRoZSBjaG9zZW4gcHJpdmF0ZSBrZXkgCiAgICBwcmludGYoIlRoZSBwcml2YXRlIGtleSBiIGZvciBCb2IgOiAlbGxkXG5cbiIsIGIpOyAKICAgIHkgPSBwb3dlcihHLCBiLCBQKTsgLy8gZ2V0cyB0aGUgZ2VuZXJhdGVkIGtleSAKICAKICAgIC8vIEdlbmVyYXRpbmcgdGhlIHNlY3JldCBrZXkgYWZ0ZXIgdGhlIGV4Y2hhbmdlIAogICAgICAgIC8vIG9mIGtleXMgCiAgICBrYSA9IHBvd2VyKHksIGEsIFApOyAvLyBTZWNyZXQga2V5IGZvciBBbGljZSAKICAgIGtiID0gcG93ZXIoeCwgYiwgUCk7IC8vIFNlY3JldCBrZXkgZm9yIEJvYiAKICAgICAgCiAgICBwcmludGYoIlNlY3JldCBrZXkgZm9yIHRoZSBBbGljZSBpcyA6ICVsbGRcbiIsIGthKTsgCiAgICBwcmludGYoIlNlY3JldCBLZXkgZm9yIHRoZSBCb2IgaXMgOiAlbGxkXG4iLCBrYik7IAogICAgICAKICAgIHJldHVybiAwOyAKfSAK