La bibliothèque GMP est, certes, une bibliothèque qui sait gérer les très grands nombres, mais avant tout, elle est une bibliothèque mathématique. C'est pour cela qu'elle regorge de fonctions mathématiques. Certaines sont les mêmes que celles disponibles dans la bibliothèque mathématique standard. (
Ceil(),
floor(),
sqrt(),
abs(), etc.) Ce n'est pas sur celles-ci que je veux appuyer, car leur utilisation est assez intuitive et nous ne nous en servirons pas durant ce tutoriel. Nous allons voir ensemble seulement les fonctions dont nous ferons usage plus tard.
La fonction "modulo"
Vous vous en rappelez de cette fonction ? On l'a vue dans la partie théorique du tutoriel. C'est sur cette fonction que repose, quasiment, tout le système RSA.
Je vous donne juste le prototype, avec l'exemple vu avant (pour la division) vous devriez vous en sortir...
void mpz_mod (mpz_t r, mpz_t n, mpz_t d )
Cette fonction effectue le calcul suivant :
r = n mod(d)
Vous noterez que les fonctions mpz_mod et mpz_fdiv_r font le même travail ; cela dit, nous voulons le modulo, alors autant utiliser la fonction prévue à cet effet...
La fonction "puissance"
La fonction "puissance" est aussi une des fonctions à la base du système RSA.
Voici son prototype :
void mpz_pow_ui (mpz_t rop, mpz_t base, unsigned long int exp )
Cette fonction effectue le calcul suivant :
rop = baseexp
L'exposant doit être un entier de type "unsigned long int", et non un "mpz_class" !
La méthode get_ui() permet de transformer un mpz_class en "unsigned long int" ; cependant, attention à vérifier que votre objet loge dans "unsigned long int" !
Une fonction idéale pour RSA !
Nous pourrions très bien faire notre programme RSA en utilisant seulement les deux dernières fonctions que l'on vient de voir. Cependant, calculer une puissance puis un modulo (l'un après l'autre) demande de nombreux calculs, et donc du temps. L'astuce consiste en fait à calculer le modulo et la puissance en même temps !

. Et grâce à un algorithme et un peu de magie mathématique (

), on gagne du temps !
Voici le prototype de la fonction "RSA" :
void mpz_powm (mpz_t rop, mpz_t base, mpz_t exp, mpz_t modulo )
Cette fonction effectue le calcul suivant :
rop = baseexp mod (modulo)
Vous l'aurez deviné ; c'est cette fonction qui va nous servir lors du chiffrage et du déchiffrage de nos messages secrets.