Exponentiation rapide
L'algorithme suivant est utilisé
pour le calcul de x=me mod n et m=xd
mod n, qui servent à crypter et décrypter le message. En effet,
lorsque les valeurs de e et de d sont élevées, le calcul ne peut
se faire facilement en calculant la puissance puis le modulo.
Cet algorithme appelé repeated square and multiply algorithm permet
simplement et rapidement d'effectuer un tel calcul en utilisant l'écriture
binaire de l'exposant. Sa complexité est proportionnelle au logarithme
de l'exposant (nombre de chiffre).
On exprime k en numération binaire.
Par exemple, si k s'écrit 10011010 (k=154), on a :
k=2+8+16+128 et alors ak=a2.a8.a16.a128
La suite a1, a2, a4, a8, a16,
a32, a64, a128 est obtenue par élévation
au carré successives.
Pour le calcul de ak, il suffit de prendre chacun des chiffres binaires
de l'exposant k en partant de droite et d'effectuer les opérations (au
départ, p=1) :
Algorithme théorique de la fonction à utiliser (en C)
long puissance (long a, long k, long n) { for ( p=1 ; k>0 ; k=k/2 ) { if ( k % 2 != 0 ) p = ( p * a ) % n a =( a * a ) % n } return p; } |
Exemples de calcul
Comment, par exemple calculer le 4137 mod 527 (= 113) qui intervient dans l'exemple de cryptage avec cet algorithme ?
a = 41 p=1 au départ. on lit les bits de droite à gauche : le premier chiffre binaire vaut 1 donc : le 3ème chiffre binaire vaut 1
donc : le 6ème chiffre binaire vaut 1
donc : |
Cet algorithme devient très vite interressant pour les grands nombres.