Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.71 KB | None | 0 0
  1. FILE = "C:/Users/Asus/Desktop/GEDEFU.txt"
  2. charset = ["A", "D", "G", "F","V", "X"]
  3. french = ["E", " ", "A", "I", "S", "N", "R", "T", "O", "L", "U", "D", "C", "M", "P", "G", "B", "V", "H", "F", "Q", "Y", "X", "K", "W","Z", "1", "9", "6", "2", "8", "3", "4", "5", "7", "0"]
  4. clef = "PAHMVIN"
  5.  
  6. def getblock(content): #découpe le texte en block
  7.     solo, block, i = [], [], 0
  8.     for elt in content:
  9.         solo.append(elt)
  10.     if len(solo)%2 != 0: #Padding si le texte n'est pas un chiffre pair.
  11.         solo += "X"
  12.     while i != len(solo):
  13.         block.append(solo[i]+solo[i+1])
  14.         i += 2
  15.     return block
  16.  
  17. def refe(array): #Créer une liste de référence.
  18.     ref, i, j = [], 0, 0
  19.     for i in range(len(array)):
  20.         for j in range(len(array)):
  21.             ref.append(array[i]+array[j])
  22.     return ref
  23.  
  24.  
  25. def occurence(block, ref): #Calcule la fréquence d'apparition d'une pair de lettres.
  26.     i, j, count, res = 0, 0, 0, []
  27.     for i in range(len(ref)):
  28.         for j in range(len(block)):
  29.             if block[j] == ref[i]:
  30.                 count += 1
  31.         count = round((count*100)/len(block), 2)
  32.         res.append(count)
  33.         count = 0
  34.     return res
  35.  
  36. def liste(ref, frequence, french):  #Créer une liste avec correspondance.
  37.     liste , i = [], 0
  38.     for i in range(len(ref)):
  39.         elt = ref[i]+":"+str(frequence[i])
  40.         liste.append(elt)
  41.     sub_liste, frequence, i = [], sorted(frequence, reverse=True), 0
  42.     for i in range(len(french)):
  43.         sub_liste.append(liste[i].replace(liste[i][3:], french[i]))
  44.     return sub_liste
  45.  
  46. def substitution(block, liste, ref): #Remplace les lettres dans le texte par les lettres de la frequence de la langue (Etape 1 du chiffrement)
  47.     for i in range(len(ref)):
  48.         for j in range(len(block)):
  49.             if ref[i] == block[j]:
  50.                 block[j] = block[j].replace(block[j], liste[i][3:])
  51.     return block
  52.  
  53.  
  54. def transposition(key, decomp_solve): #Transposition
  55.     inter_solve = []
  56.     solve = [[0]*len(key) for i in range(186)] #Créer une matrice 7 colonnes pour 186 lignes
  57.     matrice = [[0]*186 for i in range(len(key))] #Créer une matrice de 186 lignes pour 7 colonnes
  58.     tab = list(zip(*[iter(decomp_solve)]*len(key))) #Créer une liste de 7 listes composées de 186 éléménts
  59.     i,j, dic = 0, 0, {}
  60.     for i in range(len(key)):
  61.         for j in range(186):
  62.             matrice[i][j] = tab[j][i] #Remplissage via une intération
  63.     decomp_key = [elt for elt in key] #Décomposition de la clé en une liste de lettre
  64.     for i in range(len(matrice)):
  65.         dic[decomp_key[i]] = matrice[i] #Création d'un dictionnaire avec pour clés les lettres de la clé et comme valeur les colonnes créent
  66.     decomp_key = sorted(decomp_key) #Réorganisation dans l'odre alphabétique de la clé
  67.     for elt in decomp_key:
  68.         inter_solve.append(dic[elt]) #Remplissage de la liste du contenu des 7 colonnes dans l'ordre alphabétique
  69.     for i in range(len(inter_solve)):
  70.         for j in range(len(solve)):
  71.             solve[j][i] = inter_solve[i][j] #Remplissage via une intération
  72.     return solve
  73.    
  74.    
  75.  
  76. def convertString(array,n, p): #Convertit un array en string
  77.     solve_str = ""
  78.     for i in range((n)):
  79.         for j in range((p)):
  80.             solve_str += array[j][i]
  81.     return solve_str
  82.  
  83.  
  84. def main():
  85.     with open(FILE, 'r') as content:
  86.         raw = content.read()
  87.         content.close()
  88.  
  89.     block = getblock(raw) #déclaration du block
  90.     reference = refe(charset) #déclaration de notre charset pour le texte
  91.     frequence = occurence(block, reference) #Analyse de la fréquence d'apparitions
  92.     sub_liste = liste(reference, frequence, french) #Affiliation lettre réelle ==> pair de lettres du texte
  93.     decomp_solve = substitution(block, sub_liste, reference) #Etape 1 réaliser (substitution)
  94.     solve = transposition(clef, decomp_solve) #retourne la solution sous la forme d'un array
  95.     solve_str = convertString(solve, 7, 186) #Convertir la solution en string
  96.     print(sub_liste)
  97.     print(solve_str)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement