Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Répondre
Résumé de la discussion (messages les plus récents en premier)
- yoshi
- 16-08-2021 16:26:00
Bonjour,
J'ai déplacé les programmations ici dans un souci de cohérence.
Codes et sortie du 14-08-2021 à 19:15:59 10:47:21 en ref à
https://www.bibmath.net/forums/viewtopi … 959#p94959
********************************
* Codage avec Grille de Polybe *
* Variante ADFVGVX *
* v 1.0 *
********************************
Présentation du crypto en colonnes
D V V A F F G F
D F V V V F G A
G V V X V D D D
F V F V D V D G
Grille de Polybe :
A D F G V X
A c 1 0 f w j
D y m t 5 b 4
F i 7 a 2 8 s
G p 3 0 q h x
V k e u l 6 d
X v r g z n 9
-------------------------------
Affichage de la permutation 31562847
V D F F V F A G
V D V F F A V G
V G V D V D X D
F F D V V G V D
Affichage de la permutation en 1 ligne de digrammes
VD FF VF AG VD VF FA VG VG VD VD XD FF DV VG VD
Utilisation de la grille de Polybe
eaufeuilleerable
Essai suivant O/N : n
Bye, Bye !
Quant au code source, le voici (j'ai passé beaucoup de temps à le documenter (probablement pas assez ?) :
#!/usr/bin/python
# -*- coding: utf-8 -*-from itertools import permutations,product
from textwrap import wrapdef titre():
print(" ********************************")
print(" * Codage avec Grille de Polybe *")
print(" * Variante ADFVGVX *")
print(" * v 1.0 *")
print(" ********************************")
print("\n")
def Presentation_en_Lignes(SuiteDeLettres,n):
Lignes=[]
for i in range(n):
ligne=""
for mot in SuiteDeLettres:
ligne+=mot[i]
Lignes.append(ligne)
return Lignesdef Affichage_des_Lignes(Lignes):
for ligne in Lignes:
print ("",end=" ")
for lettre in ligne:
print(lettre,end=" ")
print()titre()
nb_l=4
Colonnes=['DDGF','VFVV','VVVF','AVXV','FVVD','FFDV','GGDD','FADG']#Création de la liste des permtations : ici octuplets
Permutations=list(permutations("12345678"))[:]#Création d'un dictionnaire
#1 : les clés
Cles=list(product("ADFGVX", repeat=2))#2 : les valeurs. Chaque sous liste est une ligne
Valeurs=[["c",1,"0","f","w","j"],["y","m","t",5,"b",4],["i",7,"a",2,8,"s"],["p",3,0,"q","h","x"],\
["k","e","u","l",6,"d"],["v","r","g","z","n",9]]#3 : Déclaration du Dictionnaire
Grille_Polybe={}#4 : Association des valeurs aux clés
for i in range(6):
for j in range(6):
k=Cles[6*i+j]
Grille_Polybe[k]=Valeurs[i][j]# Affichages divers
print("\nPrésentation du crypto en colonnes\n")
Lgnes=Presentation_en_Lignes(Colonnes,nb_l)
Affichage_des_Lignes(Lgnes)print("\nGrille de Polybe :\n")
print(" A D F G V X")
for i in range(6):
print("",end=" ")
print("ADFGVX"[i],end=" ")
for j in range(6):
print (Valeurs[i][j],end=" ")
print()# Pour passer toutes les permutations en revue, ecrire simplement... : in Permutations:
Lignes=[]
for Tuple in Permutations[10372:10373]:
print("\n -------------------------------")
perm="".join(Tuple) # remplacement de l'octuplet par une chaîne
Mot_final=""
for i in perm:
Mot_final+=Colonnes[int(i)-1]
Col=wrap(Mot_final,nb_l)
print("\nAffichage de la permutation",perm+"\n")
Lgnes=Presentation_en_Lignes(Col,nb_l)
Affichage_des_Lignes(Lgnes)
Lgnes_en_digrammes=[]
for mot in Lgnes:
ligne_dig=wrap(mot,2)
Lgnes_en_digrammes.append(ligne_dig)
print("\nAffichage de la permutation en 1 ligne de digrammes\n")
print("",end=" ")
Ligne=[]
for mot in Lgnes_en_digrammes:
for dig in mot:
Ligne.append(tuple(dig))
print(dig,end=" ")
print("\n\nUtilisation de la grille de Polybe\n")
print(" ",end="")
for couple in Ligne:
print(Grille_Polybe[couple],end="")print("\n")
rep=""
while not rep in ["O","N"]:
rep=input("Essai suivant O/N : ").upper()print ("\nBye, Bye !")
N-B : wrap permet de découper une chaîne donnée en sous-chaînes de longueur demandée :
>>> C="ABICVDUQEFZJGH"
>>> wrap(C,1)
['A', 'B', 'I', 'C', 'V', 'D', 'U', 'Q', 'E', 'F', 'Z', 'J', 'G', 'H']
>>> wrap(C,2)
['AB', 'IC', 'VD', 'UQ', 'EF', 'ZJ', 'GH']
>>> wrap(C,6)
['ABICVD', 'UQEFZJ', 'GH']
>>> wrap(C,7)
['ABICVDU', 'QEFZJGH']
Programme que j'ai repris, modifié et finalisé ce matin.
La présence de la liste alphabet vient de ce que j'ai cru lire que les instructions ord() et chr() ne fonctionnaient pas sous Linux.
Ne sachant pas non plus si isinstance(), fonctionnait avec Linux, je me suis donc appliqué à m'en passer pour tester la présence d'un chiffre...
N-B : Emploi de insinstance()
>>> k=3
>>> >>> isinstance(k,int)
True
>>> isinstance('k',int)
False
Code et sorties du 16-08-2021 10:47:2
#!/usr/bin/python
# -*- coding: utf-8 -*-from itertools import permutations,product
from textwrap import wrapdef titre():
print(" ********************************")
print(" * Codage avec Grille de Polybe *")
print(" * Variante ADFVGVX *")
print(" * v 2.0 *")
print(" ********************************")
print("\n")
def Presentation_en_Lignes(SuiteDeLettres,n):
Lignes=[]
for i in range(n):
ligne=""
for mot in SuiteDeLettres:
ligne+=mot[i]
Lignes.append(ligne)
return Lignesdef Affichage_des_Lignes(Lignes):
for ligne in Lignes:
print ("",end=" ")
for lettre in ligne:
print(lettre,end=" ")
print()titre()
alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',\
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
nb_l=4
Colonnes=['DDGF','VFVV','VVVF','AVXV','FVVD','FFDV','GGDD','FADG']#Création de la liste des permtations : ici octuplets
Permutations=list(permutations("12345678"))[:]#Création d'un dictionnaire
#1 : les clés
Cles=list(product("ADFGVX", repeat=2))#2 : les valeurs. Chaque sous liste est une ligne
Valeurs=[["c",1,"0","f","w","j"],["y","m","t",5,"b",4],["i",7,"a",2,8,"s"],["p",3,0,"q","h","x"],\
["k","e","u","l",6,"d"],["v","r","g","z","n",9]]#3 : Déclaration du Dictionnaire
Grille_Polybe={}#4 : Association des valeurs aux clés
for i in range(6):
for j in range(6):
k=Cles[6*i+j]
Grille_Polybe[k]=Valeurs[i][j]# Affichages divers
print("\nPrésentation du crypto en colonnes\n")
Lgnes=Presentation_en_Lignes(Colonnes,nb_l)
Affichage_des_Lignes(Lgnes)print("\nGrille de Polybe :\n")
print(" || A | D | F | G | V | X |")
print(" ===||===|===|===|===|===|===|")
for i in range(6):
print("",end=" ")
print("ADFGVX"[i],end=" || ")
for j in range(6):
print (Valeurs[i][j],end=" | ")
print("\n ---||---|---|---|---|---|---|")# Pour passer toutes les permutations en revue, écrire simplement... : in Permutations:
Lignes=[]
for Tuple in Permutations[10370:10373]:
print("\n -------------------------------")
perm="".join(Tuple) # remplacement de l'octuplet par une chaîne
Mot_final=""
for i in perm:
Mot_final+=Colonnes[int(i)-1]
Col=wrap(Mot_final,nb_l)
print("\nAffichage de la permutation",perm+"\n")
Lgnes=Presentation_en_Lignes(Col,nb_l)
Affichage_des_Lignes(Lgnes)
Lgnes_en_digrammes=[]
for mot in Lgnes:
ligne_dig=wrap(mot,2)
Lgnes_en_digrammes.append(ligne_dig)
print("\nAffichage de la permutation en 1 ligne de digrammes\n")
print("",end=" ")
Ligne=[]
for mot in Lgnes_en_digrammes:
for dig in mot:
Ligne.append(tuple(dig))
print(dig,end=" ")
MessageClair=[]
Chiffres=0
for couple in Ligne:
lt=Grille_Polybe[couple]
if lt in alphabet:
MessageClair.append(lt)
Chiffres+=1
if Chiffres==len(Ligne):
print("\n\nUtilisation de la grille de Polybe\n")
print(" ",end="")
print("".join(MessageClair))
rep=""
while rep not in ["O","N"]:
rep=input("\nEssai suivant (O/N) ").upper()
if rep=="N":
print("\n Bye, Bye !")
break
Sortie :
********************************
* Codage avec Grille de Polybe *
* Variante ADFVGVX *
* v 2.0 *
********************************
Présentation du crypto en colonnes
D V V A F F G F
D F V V V F G A
G V V X V D D D
F V F V D V D G
Grille de Polybe :
|| A | D | F | G | V | X |
===||===|===|===|===|===|===|
A || c | 1 | 0 | f | w | j |
---||---|---|---|---|---|---|
D || y | m | t | 5 | b | 4 |
---||---|---|---|---|---|---|
F || i | 7 | a | 2 | 8 | s |
---||---|---|---|---|---|---|
G || p | 3 | 0 | q | h | x |
---||---|---|---|---|---|---|
V || k | e | u | l | 6 | d |
---||---|---|---|---|---|---|
X || v | r | g | z | n | 9 |
---||---|---|---|---|---|---|
-------------------------------
Affichage de la permutation 31562748
V D F F V G A F
V D V F F G V A
V G V D V D X D
F F D V V D V G
Affichage de la permutation en 1 ligne de digrammes
VD FF VG AF VD VF FG VA VG VD VD XD FF DV VD VG
-------------------------------
Affichage de la permutation 31562784
V D F F V G F A
V D V F F G A V
V G V D V D D X
F F D V V D G V
Affichage de la permutation en 1 ligne de digrammes
VD FF VG FA VD VF FG AV VG VD VD DX FF DV VD GV
-------------------------------
Affichage de la permutation 31562847
V D F F V F A G
V D V F F A V G
V G V D V D X D
F F D V V G V D
Affichage de la permutation en 1 ligne de digrammes
VD FF VF AG VD VF FA VG VG VD VD XD FF DV VG VD
Utilisation de la grille de Polybe
eaufeuilleerable
Essai suivant (O/N)
Permutations testées : index compris entre 10370 et 10372 inclus.
Les Permutations sont données par le module permutations de Python sous forme d'un tuple (ici octuplet).
Exemple.
Soit la permutation : 31564728, le tuple correspondant est ('3','1','5','6','4','7','2','8').
Son index dans la lise de tuples Permutations est donnée par l'instruction
Permutations.index(('3','1','5','6','4','7','2','8'))
qui donne l'index 10376.
Cet index testé donne comme message clair : eafueulilereabel...
Pour avoir testé les 40320 permutations, une seule fournit bien le bon message clair...
@+