#include #include #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; }