dimanche 3 juillet 2016

L'objet Deque - chiffremet de Porta - COURS N°12

L'objet deque

Problématique

Vous souhaitez créer un programme permettant le chiffrement de Porta, et l'objet deque est là pour vous aider,

Tout d'abord une petite visite vers le tutoriel de Sakarov concernant le chiffre de Porta -> ICI

L'objectif est de savoir comment faire une rotation par pas de 1 de l'ensemble des caractères de la 2ème ligne de chaque groupe. C'est à dire comment passer de

nopqrstuvwxyz

à

znopqrstuvwxy
yznopqrstuvwx
xyznopqrstuvw
wxyznopqrstuv
vwxyznopqrstu
uvwxyznopqrst
tuvwxyznopqrs
stuvwxyznopqr
rstuvwxyznopq
qrstuvwxyznop
pqrstuvwxyzno
opqrstuvwxyzn
nopqrstuvwxyz


Ne vous inquiétez pas, je ne me suis pas amusé à tout écrire à la main ;)

Construire un objet deque

Rien de plus simple, regardez !

Code:

from collections import deque
alphabets = deque(['n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'])

Rotation d'un pas

Pour créer cette rotation on va utiliser sa méthode rotate

Code:

alphabets.rotate(1)
J'ai 13 lettres, 13 rotations, allons-y !

Code:

from collections import deque


alphabets = deque(['n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'])
for i in range(13):
    alphabets.rotate(1) # 1 rotation
    print(alphabets)

Résultat

term.jpg

Aide à la résolution

On a 13 groupes AB, CD, EF, ... qu'on va créer ainsi

A vaut 65 en code ascii et je dois aller jusqu'à Z qui vaut 90, donc les groupes donneront (65, 66), (67, 68), ... vous voyez l'astuce ? :)

Code:

Pour i allant de 65 à 89 et par pas de 2
    groupe = (i, i+1)
    ajouter groupe dans la liste de groupes

Ce qui donne en python

Code:

groupes = []
for i in range(65, 90, 2):
    groupe = (i, i+1)
    groupes.append(groupe)

print(groupes)

Résulat:

Code:

[(65, 66), (67, 68), (69, 70), (71, 72), (73, 74), (75, 76), (77, 78), (79, 80), (81, 82), (83, 84), (85, 86), (87, 88), (89, 90)]
Mais bon, faut assimiler des chiffres à des lettres, c'est pas très lisible, donc on va utiliser une fonction chr qui transcris du code ascii en littéral.

Code:

groupes = []
for i in range(65, 90, 2):
    groupe = (chr(i), chr(i+1))
    groupes.append(groupe)

print(groupes)

Résultat:

Code:

[('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')]
Eurêka !!!

On peut écrire tout cela en une ligne, une fois qu'on a vérifié que notre algo est fonctionnel

Code:

groupes = [(chr(i), chr(i+1)) for i in range(65, 90, 2)]
Voilà on a notre groupe...

Création des 2 lignes d'alphabet

AB -> (abcdefghijklm, nopqrstuvwxyz)
CD -> (abcdefghijklm, znopqrstuvwxy)
...

Je crée un dictionnaire,

Code:

correspondance = {('A', 'B'): ('abcdefghijklm', 'nopqrstuvwxyz'),
                        ('C', 'D'): ('abcdefghijklm', 'znopqrstuvwxy'),
                        ....}

Comment le créer sans trop se fatiguer ? Allez je le donne, si vous avez tout suivi, ça devrait aller pour comprendre

Code:

from collections import deque

groupes = [''.join((chr(i), chr(i+1))) for i in range(65, 90, 2)]
alpha_maitre = 'abcdefghijklm'
alpha_esclave = deque('nopqrstuvwxyz')

correspondance = {}

for groupe in groupes:
    alpha_esclave_string = ''.join(alpha_esclave)
    correspondance[groupe] = (alpha_maitre, alpha_esclave_string)
    alpha_esclave.rotate(1)

print(correspondance)

Résultat:

Code:

{'EF': ('abcdefghijklm', 'yznopqrstuvwx'), 'QR': ('abcdefghijklm', 'stuvwxyznopqr'), 'KL': ('abcdefghijklm', 'vwxyznopqrstu'), 'YZ': ('abcdefghijklm', 'opqrstuvwxyzn'), 'IJ': ('abcdefghijklm', 'wxyznopqrstuv'), 'GH': ('abcdefghijklm', 'xyznopqrstuvw'), 'ST': ('abcdefghijklm', 'rstuvwxyznopq'), 'UV': ('abcdefghijklm', 'qrstuvwxyznop'), 'AB': ('abcdefghijklm', 'nopqrstuvwxyz'), 'CD': ('abcdefghijklm', 'znopqrstuvwxy'), 'WX': ('abcdefghijklm', 'pqrstuvwxyzno'), 'MN': ('abcdefghijklm', 'uvwxyznopqrst'), 'OP': ('abcdefghijklm', 'tuvwxyznopqrs')}
Remarque: ''.join(iterable) veut simplement dire que je joins les espaces par rien du tout, c'est à dire que je les transforme par ''. Par exemple ('A', 'B') devient 'AB' ou ['m', 'n', 'o'] devient 'mno'. Les exemples c'est toujours sympa!

Voilà votre tableau de correspondance, je vous laisse faire la suite, le plus simple quoi ;)

Bonne continuation...
Images jointes


from Hackademics : Forum de hacking – hackers white hat – cours de securite informatique, apprendre langage python, tutoriels de reverse engineering http://ift.tt/29bMHdp
via IFTTT

Aucun commentaire:

Enregistrer un commentaire