TP 2 : Codage et décodage

Download Report

Transcript TP 2 : Codage et décodage

TD d’algorithmique
Codage - D´ecodage
I. Pr´
eliminaires
On ´etudie ici plusieurs m´ethodes de cryptage (et d´ecryptage...) de
textes. Les deux premiers sont des m´ethodes de cryptage par substitution (C´esar et Vigen`ere), le dernier, l’algorithme RSA (d’apr`es le nom
des inventeurs, Rivest, Shamir et Adleman), utilise une propri´et´e de la
d´ecomposition en nombres premiers.
Le code d’un caract`ere s’obtient par l’instruction Python ord(), le caract`ere d’un code par chr().
MP*
II. Codage C´
esar
Cette m´ethode de chiffrement consiste a` remplacer une lettre par
la ne lettre qui la suit dans l’ordre alphab´etique, ’a’ succ´edant a` ’z’
(calcul modulaire modulo 26). Ici, on consid`erera une variante sans
calcul modulaire adapt´ee `a tous les caract`eres, quels qu’ils soient et on
bornera n a` 25.
>>> ord(’a’)
97
>>> chr(97)
’a’
´
1. Ecrire
une proc´edure codageCesar(texte,n) qui code un texte selon
le chiffre de C´esar. Quelle est sa complexit´e ?
Pour information, les lettres minuscules non accentu´ees sont cod´ees
par Python de 97 (’a’) `a 122 (’z’). Les majuscules correspondantes de
65 `a 90.
´
2. Ecrire
de mˆeme une proc´edure decodageCesar(texte,n) permettant
de d´ecoder un texte chiffr´e au rang n.
On peut lire un fichier texte ***.txt plac´e dans le r´epertoire courant :
Lorsqu’on ignore la m´ethode de chiffrement ou l’entier n, une ´etude de
fr´equence d’apparition des caract`eres permet de d´eterminer la nature
du codage et la valeur de n.
f=open(’***.txt’,’r’,encoding=’utf8’)
exemple=f.read()
f.close()
De mˆeme, pour cr´eer un fichier ***.txt dans le r´epertoire courant :
f=open(’***.txt’,’w’,encoding=’utf8’)
f.write(’texte’)
f.close()
´
3. Ecrire
une proc´edure frequence(texte) qui re¸coit un texte et qui
renvoie une liste form´ee des caract`eres dont l’unicode varie de 97 a` 148
suivis de leur fr´equence d’apparition.
´
4. Ecrire
une proc´edure plus frequent(liste) qui re¸coit la liste
pr´ec´edente et qui renvoie le caract`ere du texte le plus fr´equent.
5. Charger le texte du fichier mystereCesar.txt. Le d´ecoder.
1
TD d’algorithmique
Codage - D´ecodage
III. Codage Vigen`
ere
Il s’agit l`a aussi d’un codage par substitution mais le rang de d´ecalage
n’est pas fixe comme dans le codage de C´esar. Le d´ecalage d´epend d’une
cl´e de type chaine de caract`eres de longueur L. Le caract`ere d’indice i
du message est d´ecal´e d’une valeur donn´ee par l’unicode du caract`ere
d’indice i mod L de la cl´e.
´
1. Ecrire
une proc´edure codageVigenere(texte,cle) qui re¸coit un texte
et une cl´e (types chaˆınes de caract`eres) et qui renvoie le texte cod´e
selon la cl´e.
´
2. Ecrire
la proc´edure de d´ecodage decodageVigenere(texte,cle). La
tester sur le fichier mystereVigenere.txt
IV. Codage RSA
Le principe repose sur un calcul de puissance modulaire par une cl´e
publique (e, n). Le message `a coder est d’abord transform´e en suite de
blocs de chiffres (unicode des caract`eres) M . Le message cod´e est la suite
des nombres C = M e mod n.
Le message cod´e est d´ecod´e a` l’aide d’une cl´e priv´ee (d, n) par M = C d
mod n.
La s´ecurit´e du cryptage RSA repose sur la difficult´e (en temps de
calcul) `a trouver d a` partir de n et e.
Les cl´es sont cr´e´ees `a partir de deux entiers p et q premiers, en pratique
tr`es grands. On pose n = p×q, l’entier commun aux deux cl´es, d´efinissant
le calcul modulaire.
On cherche ensuite deux entiers e et d premiers avec (p − 1)(q − 1),
tels qu’il existe un entier k v´erifiant :
e × d + k(p − 1)(q − 1) = 1
MP*
(e, n) et (d, n) forment les cl´es publique et priv´ee.
Le principe de calcul est bas´e sur l’algorithme d’Euclide ´etendu, qui
consiste `a calculer, par r´ecurrence, la suite Sn = (rn , un , vn ) d´efinie de
la fa¸con suivante :
S0
S1
Sn
q
Sn+1
= (a, 1, 0)
= (b, 0, 1)
= (rn , un , vn )
= rn−1 //rn
= (rn−1 %rn , un−1 − q ∗ un , vn−1 − q ∗ vn )
On montre que ∀n, rn = aun + bvn et qu’il existe N ∈ N, rN =
pgcd(a, b). Au rang suivant, rN +1 = 0.
1. Impl´ementer un algorithme d’Euclide ´etendu euclide(a,b) recevant
deux entiers a et b et retournant un triplet d’entier (pgcd,u,v) tels que
pgcd = au + bv. Le couple (u, v) est form´e des entiers de B´ezout des
entiers a et b.
On utilise l’algorithme pr´ec´edent pour cr´eer le jeu des deux cl´es,
publique et priv´ee. Pour cela, on commence par choisir deux nombres
premiers p et q, par exemple 101 et 103.
´
2. Ecrire
une proc´edure ED(p,q) qui retourne le couple (e, d) d’entiers
naturels tels que e et d soient premiers avec (p − 1)(q − 1). Pour cela,
on pourra impl´ementer l’algorithme suivant :
proc´
edure ED(q,p)
phi <- (p-1)(q-1)
chercher d entre max(p,q) et phi tel que
d premier avec phi et d positif
d´
eduire e de la relation 1 = e d + k phi
retourner (e,d)
2
TD d’algorithmique
Codage - D´ecodage
Aide : on se servira de la proc´edure euclide(p,q).
´
3. Ecrire
une proc´edure public(p,q) retournant le couple (e, n)
formant la cl´e publique.
MP*
base <- base**2
retourne(resultat)
´
4. Ecrire
une proc´edure prive(p,q) retournant le couple (d, n) formant
la cl´e priv´e.
6. Impl´ementer la fonction codeRSA(M,cle) qui code avec la cl´e le
nombre M < n puis la fonction decodeRSA(C,cle) qui d´ecode le nombre
C avec la cl´e. Tester le codage et le d´ecodage avec les cl´es calcul´ees
pr´ec´edemment.
Le codage RSA d’un nombre M < n consiste `a calculer la puissance e
de M modulo n.
Le calcul direct est lent, voire tr`es lent pour des nombres importants.
On impl´emente alors un algorithme d’exponentiation modulaire bas´e sur
les r´esultats suivants. Soit l’´ecriture de e en base 2 :
´
7. Ecrire
une proc´edure decomp bloc(texte) de d´ecomposition en
blocs de chiffres . Chaque caract`ere du texte est transform´e en nombre
a` cinq chiffres, en compl´etant a` l’aide de 0 si besoin. Ainsi, ’a’ sera cod´e
en 00097. La sortie sera form´ee de la chaˆıne des codes : ’ab’ devient
’0009700098’.
e = aN 2N + ...a1 21 + a0 20 ,
´
8. Ecrire
une proc´edure recomp bloc(chaine). Cette proc´edure est la
r´eciproque de la pr´ec´edente : ’0009700098’ devient ’ab’.
o`
u les ai sont ´egaux a` 1 ou 0. Alors :
Me =
N
Y
i
N
(M 2 )ai = M a0 · (M 2 )a1 · (M 4 )a2 · ... · (M 2 )aN .
i=0
Le calcul modulaire M e mod n est effectu´e apr`es chaque multiplication, ce qui ´evite de travailler avec des nombres plus grand que n.
´
9. Ecrire
une proc´edure codeRSAbloc(chaine,cle) qui code en RSA
une chaˆıne num´erique par bloc de cinq chiffres et qui renvoie une chaˆıne
´
num´erique. Ecrire
de mˆeme la proc´edure decodeRSA(chaine,cle) qui
rec¸coit une chaˆıne num´erique et qui renvoie le texte en clair.
10. D´ecoder le message cod´e mystereRSA.
5. Expliquer et impl´ementer l’algorithme suivant :
Proc´
edure expmod(M,e,n)
resultat <- 1
base <- M
tant que e != 0 faire
ai <- e%2
e <- e//2
si ai == 1 faire
resultat <- (resultat*base)%n
3