Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 16-08-2021 16:26:00

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 993

Programmes (brute force) de décodage du crypto soumis par orchidée8

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 wrap

def 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 Lignes

def 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 wrap

def 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 Lignes

def 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...


@+


Arx Tarpeia Capitoli proxima...

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
cinquante six plus soixante quatre
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums