Comme on l'a précédemment évoqué, nous devons trouver des problèmes difficiles d'arithmétique sur lesquels fonder notre protocole de sécurité. La plupart des approches actuelles de sécurité se ramènent au problème de retrouver les facteurs premiers d'un grand entier : depuis l'Antiquité, on cherche à le faire efficacement, et aucune solution n'a jusqu'à présent été trouvée.
On doit donc pouvoir trouver deux grands nombres premiers originaux, et faire leur produit. Notre méthode sera d'autant plus sûre qu'il sera difficile de retrouver les facteurs premiers de ce produit.
Pour obtenir une liste de nombres premiers inférieurs à $N$, on peut procéder comme suit :
On vous demande :
Si $n$ est premier, alors $n$ divise $a^n-a, a>1$
En d'autres termes, $a^n \equiv a [n].$
Pour obtenir un grand nombre premier, l'idée est de tirer un grand nombre de chiffres, d'en constituer un nombre par concaténation, puis de tester si ce nombre est premier.
Le problème avec le théorème de Fermat, c'est que l'implication est dans le mauvais sens : on voudrait quelque chose de la forme "si telle propriété, alors le nombre est premier", comme par exemple dans le théorème de Wilson. Cependant :
On vous demande d'implémenter, dans le capteur, un premier test de primalité probabiliste basé sur Fermat. On pourra :
Miller-Rabin est, en quelque sorte, un raffinement de ce qui précède. Il s'agit à nouveau d'un test probabiliste de primalité, mais pour lequel le risque de se tromper n'arrive jamais en pratique. Ce test est très efficace pour mesurer la primalité de grands entiers.
Son explication en détail dépasse le cadre de ce cours. On vous demande juste d'en faire une implémentation dans votre bibliothèque pour le pyboard, en reprenant le code trouvé ici. On pourra vérifier, dans une console python classique, que l'on produit bien des nombres premiers, à l'aide de la fonction isprime de numpy.