mirror of
https://github.com/Clortox/DiffieHellmanTest.git
synced 2025-01-09 09:47:59 +00:00
Create dh.cpp
This commit is contained in:
parent
72e5e64374
commit
fac5c62dc2
195
dh.cpp
Normal file
195
dh.cpp
Normal file
@ -0,0 +1,195 @@
|
||||
// DeffieHellman.cpp
|
||||
//8-13-19
|
||||
//Tyler Perkins
|
||||
//Basic client server implementation of DH Key exchange
|
||||
//Not secure in the slightest, just a POC
|
||||
//Despagettified 8-22-19
|
||||
|
||||
#include <iostream>
|
||||
#include <math.h>
|
||||
#include <cstdlib>
|
||||
#include <time.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
class server {
|
||||
//this is the server, he just genorates the public values and thats it
|
||||
public:
|
||||
int g, n;
|
||||
int otherKey;
|
||||
|
||||
server() {
|
||||
//make the public values g and n, and create our private value
|
||||
cout << "Constructing Server..." << endl;
|
||||
//make n
|
||||
srand(time(NULL));
|
||||
n = rand();
|
||||
cout << "n is " << n << endl;
|
||||
|
||||
//make g
|
||||
g = primeGen();
|
||||
cout << "g is " << g << endl;
|
||||
|
||||
//genorate a non zero private value
|
||||
while (true) {
|
||||
privateServerKey = rand() % n;
|
||||
if (privateServerKey != 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
cout << "SERVER private value is " << privateServerKey << endl;
|
||||
}
|
||||
|
||||
~server() {
|
||||
cout << "Deconstructing Server..." << endl;
|
||||
|
||||
}
|
||||
|
||||
//retreive values from the client
|
||||
void getValue(int type, int value) {
|
||||
//key: 1 - otherprivatekey
|
||||
//2 - compiled key
|
||||
|
||||
switch (type) {
|
||||
case 1:
|
||||
//otherprivatekey
|
||||
forignServerValue = value;
|
||||
case 2:
|
||||
//final value
|
||||
finalValue = value;
|
||||
}
|
||||
cout << "SERVER received value" << endl;
|
||||
}
|
||||
|
||||
//compute first value "otherkey"
|
||||
int findOtherKey() {
|
||||
otherKey = (g ^ privateServerKey) % n;
|
||||
cout << "SERVER otherkey is " << otherKey << endl;
|
||||
return otherKey;
|
||||
}
|
||||
|
||||
int findFinalValue() {
|
||||
finalValue = (forignServerValue ^ privateServerKey) % n;
|
||||
cout << "SERVER final shared secret is " << finalValue << endl;
|
||||
return finalValue;
|
||||
}
|
||||
|
||||
private:
|
||||
int maxKey = 200;
|
||||
int privateServerKey;
|
||||
int finalValue;
|
||||
int forignServerValue;
|
||||
|
||||
int primeGen() {
|
||||
|
||||
while (true) {
|
||||
srand(time(NULL));
|
||||
int randomNumber = (rand() % maxKey);
|
||||
bool isPrime = true;
|
||||
|
||||
//check for prime number
|
||||
for (int i = 2; i <= randomNumber / 2; ++i) {
|
||||
|
||||
//this will catch nonprimes
|
||||
if (randomNumber % i == 0 || randomNumber == 0 ) {
|
||||
|
||||
isPrime = false;
|
||||
}
|
||||
//all else will loop till the for loop ends which confirms a prime number
|
||||
}
|
||||
|
||||
if (isPrime) {
|
||||
return randomNumber;
|
||||
}
|
||||
|
||||
}
|
||||
//this should never be reached
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
class client {
|
||||
//this is the client machine will be not genorating the numbers but just connects to the server
|
||||
public:
|
||||
int g, n;
|
||||
int otherKey;
|
||||
client(int g1, int n1) {
|
||||
//receive the 2 public numbers, g and n, and create our private key
|
||||
srand(time(NULL));
|
||||
cout << "Constructing Client..." << endl;
|
||||
g = g1;
|
||||
n = n1;
|
||||
//cout << "client received g as " << g << endl;
|
||||
//cout << "client received n as " << n << endl;
|
||||
|
||||
//genorate a non zero private value
|
||||
while (true) {
|
||||
privateServerKey = rand() % n;
|
||||
if (privateServerKey != 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
cout << "CLIENT private value is " << privateServerKey << endl;
|
||||
}
|
||||
|
||||
~client() {
|
||||
cout << "Deconstructing Client..." << endl;
|
||||
|
||||
}
|
||||
|
||||
//retreive values from server
|
||||
void getValue(int type, int value) {
|
||||
//key: 1 - otherprivatekey
|
||||
//2 - compiled key
|
||||
|
||||
switch (type) {
|
||||
case 1:
|
||||
//otherprivatekey
|
||||
forignServerValue = value;
|
||||
case 2:
|
||||
//final value
|
||||
finalValue = value;
|
||||
}
|
||||
cout << "CLIENT received value" << endl;
|
||||
}
|
||||
|
||||
//compute first value "otherkey"
|
||||
int findOtherKey() {
|
||||
otherKey = (g ^ privateServerKey) % n;
|
||||
cout << "CLIENT othervalue is " << otherKey << endl;
|
||||
return otherKey;
|
||||
}
|
||||
|
||||
int findFinalValue() {
|
||||
finalValue = (forignServerValue ^ privateServerKey) % n;
|
||||
cout << "CLIENT final shared secret is " << finalValue << endl;
|
||||
return finalValue;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
int privateServerKey;
|
||||
int forignServerValue;
|
||||
int finalValue;
|
||||
};
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
//declare vars
|
||||
|
||||
//create 2 objects, client and server
|
||||
server testServer;
|
||||
//pass g and n to the client. these are public information
|
||||
client testClient(testServer.g,testServer.n);
|
||||
|
||||
//g, n, a, and b are all made; calculate otherkey, or A and B, then send them
|
||||
//give client its otherkey
|
||||
testClient.getValue(1, testServer.findOtherKey());
|
||||
testServer.getValue(1, testClient.findOtherKey());
|
||||
|
||||
//calculate shared secret
|
||||
testClient.findFinalValue();
|
||||
testServer.findFinalValue();
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user