Last update: 2017/01/10
22:59 tp:python:crypto01_python https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/doku.php/tp:python:crypto01_python
https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/ Printed on 2017/05/25 16:21
AZIIV DOWRX UYGQR YZXWM PDVZC MHPEX ZVIIX
ERMEI KEWQG ZIIRI VYRXZ CXVLX ZCVYV PLBEW
CIXIM NZPYG EQRME YYZUY EPIEV RPDSD JTLAH
ZMMYN MOVPW MSWJI CDIMZ PYGII RTLAH DKPPT
MZMVP
le mot de passe utilisé est : LIEVRE
Quel est le titre de ce texte ?
3 Chiffre par transposition
Au contraire d'un chiffre par substitution, dans lequel on remplace les lettres par d'autres, un chiffre
par transposition conserve les mêmes lettres, mais les mélange.
Nous proposons ici, pour une chaîne de caractères de longueur n, et étant donné un nombre p<n, de
chiffrer la chaîne d'origine en prenant, dans cet ordre, les caractères en position 0, p, 2p, 3p, etc…
Lorsqu'on arrive au bout de la chaîne, on reprend à 0. Ainsi, la chaîne abcdefgh comporte 8 lettres.
Choisissons p=3. La transposition obtenue est : adgbehcf En effet, on part de la lettre 0, puis on
prend la lettre 3, puis la 6, puis la 1 (6+3=9 et 9%8=1), puis la 4 etc…
position 01234567
lettre a b c d e f g h
Ce système fonctionne correctement dans la mesure où p et n sont premiers entre eux (pgcd(n,p)=1).
Il faudra garder ceci à l'esprit.
On peut remettre les lettres dans l'ordre en utilisant une autre valeur de p. La valeur à utiliser est
l'inverse de p modulo n, c'est la valeur q telle que (p*q)%n=1. Il existe des algorithme pour calculer
cet inverse (algorithme d'Euclide étendu). Nous nous contenterons de le trouver empiriquement. Dans
notre exemple, le nombre q vaut 3 aussi. En effet, (3*3)%8=1
Écrivez une fonction qui prend en paramètre une chaîne de caractères et un nombre et qui, après
avoir vérifié que le nombre est bien premier avec la longueur de la chaîne (vous disposez de la
fonction math.gcd (du module math…) pour ça) transpose la chaîne de caractères comme indiqué.
On conservera tous les caractères de la chaîne (lettres, espaces, retours chariots). Attention, car
l'ajout d'un simple espace parasite en fin de chaîne modifiera le chiffrement…
Vous écrirez la fonction transpose(s,p) qui transpose la chaîne de caractères s en prenant une
lettre sur p. Votre fonction devra aussi vérifier que la valeur de p entrée est convenable. Si ce n'est
pas le cas, votre fonction devra renvoyer la valeur None.
Par exemple, transpose('abcdefgh',3) doit renvoyer adgbehcf et transpose('Tténrumaeo
lg',9) doit donner une phrase intelligible.