Déchiffrement par substitution à clef variable [Résolu]

-
Bonsoir, je suis en Terminale S et j'ai un problème de compréhension avec l'énoncé d'un de mes exercices en Isn , le sujet est le déchiffrement par substitution à clef variable.
Je dois :
Réaliser un programme python (dechiffr_Gr3_2.py) qui récupére le texte à déchiffrer dans le
fichier ''Gr3_chiffre_a_dechiffrer.txt'', qui effectue son déchiffrement avec la clé ''rec'' et qui
sauvegarde le résultat dans un fichier ''Gr3_dechiffre.txt''.

Ce qui me pose problème c'est qui effectue son déchiffrement avec la clé "rec" car je n'ai jamais vu ça dans mes cours et dans les documents annexes non plus.

Voila le documents qui m'a été fournis par mon professeur :

Le chiffrement/déchiffrement par substitution à clef variable :
Cette méthode de chiffrement consiste à substituer aux caractères du texte d'origine, des caractères
obtenus par des décalages dans l’alphabet, conformément à la règle suivante :
Chaque caractère du message à chiffrer subit un décalage (vers la droite) dans l’alphabet d’un
nombre de rangs égal au rang dans l’alphabet (de 0 pour a, à 25 pour z) du caractère qui le
précède. Pour le 1er caractère du message, le nombre de décalages est donné par le nombre de
caractères du message.
Ainsi le message en clair ''bonjour'' deviendrait ''ipbwxil''. En effet, ''b'' décalé de 7 rangs vers la droite
dans l’alphabet deviendrait ''i'', ''o'' décalé d'un rang deviendrait ''p'', ''n'' deviendrait ''b'' par un
déplacement de 14 rangs vers la droite car l'alphabet est considéré comme rebouclé (a, …, x, y, z, a, b,
…). Le rebouclage de l’alphabet peut être matérialisé dans les calculs par la fonction modulo ou reste
de la division entière (opérateur % en Python).
Pour ce type de cryptage, on appelle clef, le caractère qui définit le nombre de décalages à réaliser.
Pour le déchiffrement, il suffit d’appliquer à chaque caractère du message codé un décalage (vers la
gauche) dans l’alphabet d’un nombre de rangs égal au rang dans l’alphabet du caractère qui vient
d’être précédemment déchiffré. Le nombre de caractères du message n’ayant pas été modifié par le
chiffrement, indique le nombre de décalages à appliquer au 1er caractère du message chiffré.
Ainsi le message chiffré ''ipbwxil'' redevient ''bonjour'', puisqu’après déchiffrement du ''b'', un décalage
d’un rang vers la gauche à partir de ''p'' donne ''o''.


j'ai déjà fait ce programme mais cela ne fonctionne pas car le message déchiffré n'a absolument aucun sens


f=open("Gr3_chiffre_a_dechiffrer.txt","r")  
for u in f:
    print(u)
txtchiffr=(f.read(4))
B=len(u)
print("///////")
prem=ord(u[0])-97
premfin=prem-B
while premfin<=97:
    premfin=premfin+26
premfin1=chr(premfin)
message=premfin1

Z=u[1]
rangpre=ord(Z)-premfin-97
H=rangpre+97
while H<=97:
    H=H+26
G=chr(H)
message=message+G

for i in range(2,B):
    Z=u[i]
    rangpre=ord(Z)-rangpre-97
    H=rangpre+97
    while H<=97:
        H=H+26
    G=chr(H)
    message=message+G
print(message)

y=len(u)
print(y)






Je vous remercie d'avance pour vos réponses. :D
Afficher la suite 

2 réponses

Messages postés
59637
Date d'inscription
mardi 8 janvier 2008
Statut
Modérateur
Dernière intervention
20 novembre 2019
4975
Bonjour, c'est ce que j'ai fait dans mon message.
merci
Chris 94
Messages postés
59637
Date d'inscription
mardi 8 janvier 2008
Statut
Modérateur
Dernière intervention
20 novembre 2019
4975 > ZeeSlick58 -
Ce que tu as fait ?

Pour la forme canonique, c'est moi qui lui passé de la couleur...

Quant au "Bonjour", il est généralement pré-écrit et rien n'interdit jamais d'ajouter un petit "SVP"...
Chris 94
Messages postés
59637
Date d'inscription
mardi 8 janvier 2008
Statut
Modérateur
Dernière intervention
20 novembre 2019
4975 > ZeeSlick58 -
Et puis, inutile de signaler les remarques et consignes... d'un modo ;-)
Commenter la réponse de Chris 94
0
Merci
Bonjour,

Avant de vouloir la décoder, il faut comprendre comment l'encoder, pour ça, inutile de travailler avec ord et chr, à moins que ce soit une contrainte ?
Une simple chaîne représentant les lettres a .. z est plus que suffisant et pour obtenir la position d'une lettre dans la chaîne, on se sert de la méthode index.

Voici comment encoder ta chaîne simplement.

chars = 'abcdefghijklmnopqrstuvwxyz'

text = 'bonjour'

d = chars.index(text[0]) + len(text)
encoded_text = chars[d % 26]

for i in range(1, len(text)):
    d = chars.index(text[i]) + chars.index(text[i-1])
    encoded_text += chars[d % 26]

print(encoded_text)


A toi de trouver comment effectuer l'opération de décodage en suivant cette logique d'encodage.
Merci beaucoup! j'ai essayer de mettre cette "restrictions" sur l'alphabet dans mon programme et cela a super bien marcher je vous remercie de votre aide, bonne journée ... :D
Commenter la réponse de khrug