Déchiffrement par substitution à clef variable

Résolu/Fermé
ZeeSlick58 - Modifié le 2 nov. 2019 à 18:27
 ZeeSlick58 - 3 nov. 2019 à 10:56
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
A voir également:

2 réponses

Chris 94 Messages postés 50978 Date d'inscription mardi 8 janvier 2008 Statut Modérateur Dernière intervention 17 février 2023 7 325
2 nov. 2019 à 18:12
0
Bonjour, c'est ce que j'ai fait dans mon message.
merci
0
Chris 94 Messages postés 50978 Date d'inscription mardi 8 janvier 2008 Statut Modérateur Dernière intervention 17 février 2023 7 325 > ZeeSlick58
2 nov. 2019 à 18:23
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"...
0
Chris 94 Messages postés 50978 Date d'inscription mardi 8 janvier 2008 Statut Modérateur Dernière intervention 17 février 2023 7 325 > ZeeSlick58
2 nov. 2019 à 18:27
Et puis, inutile de signaler les remarques et consignes... d'un modo ;-)
0
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.
0
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
0