Le cas d'utilisation standard pour BigInteger.isProbablePrime(int)
est dans la cryptographie. Plus précisément, certains algorithmes cryptographiques, tels que RSA , nécessitent de grands nombres premiers choisis au hasard. Mais il est important de noter que ces algorithmes n'exigent pas vraiment que ces nombres soient garantis comme étant premiers - ils doivent simplement être premiers avec un très probabilité élevée.
Quelle est la hauteur très élevée? Eh bien, dans une application de cryptographie, on appelle généralement .isProbablePrime()
avec un argument entre 128 et 256. Ainsi, la probabilité qu'un nombre non premier passe un tel test est inférieure à un sur 2 128 ou 2 256 .
Mettons cela en perspective: si vous aviez 10 milliards d'ordinateurs, chacun générant 10 milliards de nombres premiers probables par seconde (ce qui signifierait moins d'un cycle d'horloge par nombre sur n'importe quel processeur moderne), et que la primalité de ces nombres a été testée avec .isProbablePrime(128)
, vous s'attendrait, en moyenne, à ce qu'un nombre non premier se glisse une fois tous les 100 milliards d'années .
Autrement dit, ce serait le cas, si ces 10 milliards d'ordinateurs pouvaient tous fonctionner pendant des centaines de milliards d'années sans subir de panne matérielle. Dans la pratique, cependant, il est beaucoup plus probable qu'un rayon cosmique aléatoire frappe votre ordinateur au bon moment et au bon endroit pour faire basculer la valeur de retour.isProbablePrime(128)
de faux à vrai, sans provoquer d'autres effets détectables, que pour un non -prime nombre pour réussir le test de primalité probabiliste à ce niveau de certitude.
Bien sûr, le même risque de rayons cosmiques aléatoires et d'autres défauts matériels s'applique également aux tests de primalité déterministe comme AKS . Ainsi, en pratique, même ces tests ont un (très petit) taux de faux positifs de base en raison de pannes matérielles aléatoires (sans parler de toutes les autres sources possibles d'erreurs, telles que les bogues d'implémentation).
Puisqu'il est facile de pousser le taux intrinsèque de faux positifs du test de primalité de Miller – Rabin utilisé de .isProbablePrime()
loin en dessous de ce taux de base, simplement en répétant le test suffisamment de fois, et puisque, même répété tant de fois, le test de Miller – Rabin est toujours beaucoup plus rapide en pratique que les tests de primalité déterministe les plus connus comme AKS, il reste le test de primalité standard pour les applications cryptographiques.
(De plus, même si vous sélectionniez accidentellement un pseudoprime fort comme l'un des facteurs de votre module RSA, cela ne conduirait généralement pas à une défaillance catastrophique. En règle générale, ces pseudoprimes seraient des produits de deux (ou rarement plus) nombres premiers d'environ la moitié de la longueur, ce qui signifie que vous vous retrouveriez avec une clé RSA multi-prime . Tant qu'aucun des facteurs n'était trop petit (et s'ils l'étaient, le test de primalité aurait dû les attraper), l'algorithme RSA fonctionnent toujours très bien, et la clé, bien qu'un peu plus faible contre certains types d'attaques que les clés RSA normales de même longueur, devrait toujours être raisonnablement sécurisée si vous n'avez pas lésiné inutilement sur la longueur de la clé.)