Déchiffrement par substitution à clef variable

Résolu
ZeeSlick58 -  
 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 54087 Date d'inscription   Statut Modérateur Dernière intervention   7 340
 
0
ZeeSlick58
 
Bonjour, c'est ce que j'ai fait dans mon message.
merci
0
Chris 94 Messages postés 54087 Date d'inscription   Statut Modérateur Dernière intervention   7 340 > ZeeSlick58
 
Ce que tu as fait ?

Pour la forme canonique, c'est moi qui lui é 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 54087 Date d'inscription   Statut Modérateur Dernière intervention   7 340 > ZeeSlick58
 
Et puis, inutile de signaler les remarques et consignes... d'un modo ;-)
0
khrug
 
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
ZeeSlick58
 
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