109 lines
2.6 KiB
Plaintext
109 lines
2.6 KiB
Plaintext
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "rsa.h"
|
|
#include "prng.h"
|
|
|
|
void generateKeys(unsigned long *e, unsigned long *d, unsigned long *n){
|
|
unsigned long p = prng(25);
|
|
unsigned long q = prng(47);
|
|
unsigned long phi = 0;
|
|
|
|
// Generate big numbers of p and q
|
|
//generateBigNumber(&p);
|
|
//generateBigNumber(&q);
|
|
|
|
// Check if p and q are prime numbers
|
|
if (isPrimeNumber(p) != 0)
|
|
prime_number_finder(&p);
|
|
|
|
if (isPrimeNumber(q) != 0)
|
|
prime_number_finder(&q);
|
|
|
|
// Calculate n
|
|
*n = p * q;
|
|
|
|
// We're going to calcule the Euler's totient
|
|
// Our number are prime number, so, phi = (p - 1) * (q - 1)
|
|
phi = (p - 1)*(q - 1);
|
|
|
|
/* We will calculate e for the public key */
|
|
generatePublicKey(phi, e);
|
|
|
|
/* We will calcuate d for the private key */
|
|
generatePrivateKey(d, phi, e);
|
|
|
|
/* For encrypting
|
|
m = ( message ** e) % n
|
|
exemple!: A -> 0x65
|
|
(65 ** 4033) % 6938083 = 1140958
|
|
For decrypting
|
|
( m ** d) % n
|
|
Exemple:
|
|
(1140958 ** 830257) % 6938083 = 65
|
|
*/
|
|
}
|
|
static void generateBigNumber(unsigned long *v){
|
|
/*if (*v < 100)
|
|
*v = *v << 6;
|
|
else if (*v >= 100 || *v < 1000)
|
|
*v = *v << 4;
|
|
else
|
|
*v = *v << 2;*/
|
|
}
|
|
/*
|
|
* This function will identify all the divider of the variable a
|
|
* with the Euclidean algorithm
|
|
*/
|
|
static int gcd(unsigned long a, unsigned long b){
|
|
// Ou utiliser l'algorithme d'Euclide ?
|
|
int done = 0;
|
|
while (!done){
|
|
if (b == 0)
|
|
done = 1;
|
|
else{
|
|
int tmp = b;
|
|
b = a % b;
|
|
a = tmp;
|
|
}
|
|
}
|
|
return a;
|
|
}
|
|
/*
|
|
* This function will check if te variable e is a prime number
|
|
* is not, we increment the value to 1 and continue until is a prime number
|
|
*/
|
|
static void prime_number_finder(unsigned long *e){
|
|
while(isPrimeNumber(*e) != 0)
|
|
*e += 1;
|
|
}
|
|
static int isPrimeNumber(unsigned long x){
|
|
for (int i = 2; i < x; i++){
|
|
if (x % i == 0)
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
static unsigned long generatePublicKey(unsigned long phi, unsigned long *e){
|
|
// Generate e
|
|
*e = prng(61);
|
|
//generateBigNumber(e);
|
|
|
|
// Get the coprime with phi
|
|
while ((gcd(phi, *e)) != 1)
|
|
*e += 1;
|
|
|
|
return *e;
|
|
}
|
|
static unsigned long generatePrivateKey(unsigned long *d, unsigned long phi, unsigned long *e){
|
|
// Calculate the modular inverse
|
|
int i = 0;
|
|
for (i = 0; i <= phi; i++){
|
|
if ((i * (*e)) % phi == 1){
|
|
*d = i;
|
|
break;
|
|
}
|
|
}
|
|
//*d = *e;
|
|
return *d;
|
|
}
|