IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Un algo de crypto qui peut s'exécuter de tête, même par des enfants !

Un algo de crypto qui peut s'exécuter de tête, même par des enfants ? 
Je propose une suite chiffrante avec chaînage et lettre initiale.
Et c'est plus dur à craquer que la machine Enigma !
(Évidemment, il ne fait pas le poids face à un AES ou tout autre algo de pro)
Comment ça marche ?
 
On commence par se donner un alphabet, dans cet exemple : A,B,C,D,E
-> les messages ne devront comporter que ces lettres.
Puis on définit une addition et une soustraction sur cet alphabet.
On remplace simplement les lettres par leur indice, en commençant à 0.
A vaut 0, B vaut 1, ... E vaut 4.
Ensuite on fait de l'arithmétique "modulaire", c'est à dire que quand ça dépasse
on "reboucle" : 
   - on soustrait 5 tant que le résultat est plus grand que 4
   - on additionne 5 tant que le résultat est plus petit que 0  
Ex : 3+4 = 7 et 7 (qui "dépasse" 4) donne 7-5 = 2.
     1-3 = -2 et -2 (qui est plus petit que 0) donne -2 + 5 = 3
Remarque : une arithmétique modulaire à laquelle on est déjà habitué : 
           les minutes sur une horloge : quand ça dépasse 60, on soustrait 60.
Pour aller plus vite, on peut se créer une table qui résume cette arithmétique. 
 


                    - +  A B C D E
                    A A  A B C D E
                    E B  B C D E A
                    D C  C D E A B
                    C D  D E A B C
                    B E  E A B C D


 
On peut même l'imprimer, elle n'est pas secrète !
Comment ça se lit une table comme ça ?
On veut calculer x + y  (où x et y sont des lettres de notre alphabet)
On prend la colonne de x, puis la ligne de y, où y est choisi dans la colonne "+"
Ex : D+B : 4ème colonne (celle du D) et 2ème ligne (celle du B dans la colonne "+")
     on trouve E
Ex : E-D : 5ème colonne (celle du E) et 3ème ligne (celle du D dans la colonne "-")
     on trouve B (comme on pouvait s'y attendre :  D+B = E     E-D = B )
 
Ariane veut envoyer un message à Béatrice :
son message : BAAACDBB (comme "Béa a assez des bébés")
elle choisit une clef qui ne doit être connue que de Ariane et Béatrice : CADE
elle choisit une lettre initiale au hasard : E 
(elle n'est pas secrète, mais doit être changée à chaque chiffrement)
le chiffrement :
il s'effectue lettre après lettre : à chaque étape on additionne 
    - la lettre à chiffrer
    - la lettre de la clef
    - la lettre résultant de l'étape qui précède (sauf à la première étape où c'est la lettre initiale)


                               message

                               v-------------v

                               B A A A C D B B

                               C A D E C A D E

      lettre initiale → E    ^-------------^

                               clef répétée autant de fois que nécessaire


étape 1 : on calcule ( B + C ) + E
                   ^   ^     ^--- lettre initiale (car il s'agit de la première étape)
                 |   +--------- lettre de la clef qui correspond
           +------------- lettre qui va être chiffrée à cette étape
          à l'aide de la table (en utilisant la colonne "+"), on trouve : B+C = D et D+E = C
          donc la première lettre du message chiffré est "C"

étape 2 : ( A + A ) + C
            ^   ^     ^----- résultat de l'étape qui précède
            |    +----------- lettre de la clef qui correspond
            +---------------- lettre qui va être chiffrée à cette étape
          on trouve A+A = A et A+C = C, donc la deuxième lettre du message chiffré est "C"

étape 3 : (A+D)+C = A
étape 4 : (A+E)+A = E
étape 5 : (C+C)+E = D
étape 6 : (D+A)+D = B
étape 7 : (B+D)+B = A
étape 8 : (B+E)+A = A
 
Ariane va envoyer à Béatrice (qui connaît déjà la clef) 
le message chiffré (cryptogramme) plus la lettre initiale : "ECCAEDBAA" 
(par convention, on ajoute la lettre initiale en tête de message)
 
Pour le décodage, on effectue les opérations inverses (en utilisant la colonne "-" de la table) :
Chaque lettre déchiffrée = ( lettre chiffrée - lettre précédente ) - lettre de la clef
étape 1 : ( C - C ) - E
            ^  ^     ^--- la lettre initiale (car il s'agit de la première étape)
            |  +--------- la lettre de la clef
            +------------- la lettre à déchiffrer
          à l'aide de la table (en utilisant la colonne "-"), on trouve C-E = D et D-C = B
          donc la première lettre du message déchiffré est "B"
étape 2 : ( C - A ) - C
            ^   ^     ^--- la lettre qui précède dans le message chiffré
            |   +--------- la lettre de la clef
            +------------- la lettre à déchiffrer
          on trouve C-A = C et C-C = A
          donc la deuxième lettre du message déchiffré est "A"
étape 3 : (A-D)-C = A
étape 4 : (E-E)-A = A
étape 5 : (D-C)-E = C
étape 6 : (B-A)-D = D
étape 7 : (A-D)-B = B
étape 8 : (A-E)-A = B
Elle obtient "BAAACDBB" : Béatrice a bien déchiffré le message.
 
   2 règles à respecter pour que cet algo ne soit pas trop facile à craquer :
 1 - changer de lettre initiale à chaque chiffrement
 2 - choisir une clef suffisamment longue. Si la clef est trop courte, il suffira de peu de temps pour essayer toutes les combinaisons possibles.
 
De tête, c'est peut-être un peu difficile, mais avec la table en antisèche, ça se fait ! 
Nos ressources disponibles
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# coding:utf8
#--------------------------------------------------------------------------------------
#-- code qui effectue les opérations décrites au dessus  ------------------------------

# addition ou soustraction (selon que sign vaut +1 ou -1 des lettres x,y,z appartenant à l'alphabet alphabet  
def op ( alphabet,x,y,z,sign ):
    x,y,z = alphabet.index( x ),alphabet.index( y ),alphabet.index( z )
    return alphabet[( x + sign*y + sign*z )%len( alphabet )]

# chiffrement du message text par la clef key avec la lettre initiale init (les lettres appartiennent à l'alphabet alphabet)   
def cipher ( alphabet,text,key,init ):
    res = ''
    for t,k in zip( text,key*len( text )):
        res += op( alphabet,t,k,init,+1 )
        init = res[-1]
    return res

# déchiffrement du message text par la clef key avec la lettre initiale init (les lettres appartiennent à l'alphabet alphabet)   
def decipher ( alphabet,text,key,init ):
    res = ''
    for t,k in zip( text,key*len( text )):
        res += op( alphabet,t,k,init,-1 )
        init = t
    return res

#--------------------------------------------------------------------------------------
#-- code qui permet d'afficher une petite démo ----------------------------------------

# construction d'une chaîne de caractères représentant la table (+/-) sur l'alphabet alphabet 
def make_table ( alphabet ):
    res = '- +  '+' '.join( alphabet )
    for x in alphabet :
        X = alphabet.index( x )
        res += '\n%s %s '%( alphabet[(-X)%len( alphabet )],x )
        for y in alphabet :
            Y = alphabet.index( y )
            res += ' %s'%( alphabet[ (X+Y)%len( alphabet )])
    return res

def exemple ( alphabet,message,clef,init,comment,corrupt=-1 ):
    ciphered = cipher( alphabet,message,clef,init )
    if corrupt >= 0 : 
        c = alphabet.index( ciphered[corrupt] )
        c = alphabet[(c+8)%len( alphabet )]
        ciphered = ciphered[:corrupt] + c + ciphered[corrupt+1:]    
    deciphered = decipher( alphabet,ciphered,clef,init )
    print('\n%s :\n"%s" "%s" : "%s" --> "%s" --> "%s"'%( comment,clef,init,message,ciphered,deciphered ))

def exemple_from_doc (): 
    print("la table de l'exemple")
    print( make_table('ABCDE'))
    exemple( 'ABCDE','BAAACDBB','CADE','E',"et le message de l'exemple" )

def bigger_exemple (): 
    alphabet = 'abcdefghijklmnopqrstuvwxyz' 
    
    print(u'\n\nVoici une table pour les 26 lettres + espace (représenté par "_") :')
    print( make_table( alphabet+'_' )+'\n\n' )
    
    print(u'Et voici quelques exemples expliqués :')
    alpha = alphabet+alphabet.upper()+u' çé?!'
    
    exemple( alpha,u'Salut Béa ! Comment ça va ?','La clef','Z',u'chiffrement de référence\n  clef   lettre initiale\n v-----v   v')
    exemple( alpha,u'Salut Béa ! Comment ça va ?','La clef','Y',u'en changeant uniquement la lettre initiale, le cryptogramme est entièrement différent')
    exemple( alpha,u'Salut Béa ! Comment ça va ?','la clef','Z',u'en changeant uniquement la première lettre de la clef, le cryptogramme est entièrement différent')
    exemple( alpha,u'Salut Béa ! Comment ça va ?','La cleF','Z',u'en changeant uniquement la 7° lettre de la clef, le cryptogramme est différent à partir de la 7° lettre')
    exemple( alpha,u'Salut Béa ! Komment ça va ?','La clef','Z',u"en changeant uniquement la 20° lettre du message, le cryptogramme est différent à partir de la 20° lettre\n--> d'où l'intéret de changer la lettre initiale à chaque chiffrement !\n(c'est ce détail qui a permis de casser la machine Enigma)")
    exemple( alpha,u'Salut Béa ! Comment ça va ?','La clef','Z',u"en changeant uniquement la 7° lettre du cryptogramme, seules les 7° et 8° lettres du message déchiffré sont différentes",7 )

exemple_from_doc() 
bigger_exemple()
Avatar de marco056
Membre chevronné https://www.developpez.com
Le 01/04/2021 à 22:45
J'ai parcouru vite fait ton algo : ce n'est pas identique à la méthode de Vigenère ?
Avatar de Captain'Flam
Membre confirmé https://www.developpez.com
Le 07/04/2021 à 18:19
En effet marco056, cet algorithme ressemble à celui de Vigenère, mais j'y ai ajouté une "lettre initiale" (à changer à chaque chiffrement) qui permet d'éviter que 2 clairs proches donnent 2 chiffrés proches.
C'était la faille de la machine Enigma : comme les messages commençaient toujours par la même séquence de lettres, les chiffrés commençaient aussi par une même séquence de lettres.
L'analyse statistique était rendue possible...
Si tu exécutes la petite démo du script, tu verras qu'en changeant seulement la lettre initiale, on a un chiffré complement différent.
Avatar de marco056
Membre chevronné https://www.developpez.com
Le 07/04/2021 à 20:16
J'ai essayé de crypter un texte mais sans succès, je voulais tenter de le décrypter ensuite...
Voici le texte :
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
Le bateau ivre

Comme je descendais des Fleuves impassibles,
Je ne me sentis plus guidé par les haleurs :
Des Peaux-Rouges criards les avaient pris pour cibles
Les ayant cloués nus aux poteaux de couleurs.

J'étais insoucieux de tous les équipages,
Porteur de blés flamands ou de cotons anglais.
Quand avec mes haleurs ont fini ces tapages
Les Fleuves m'ont laissé descendre où je voulais.

Dans les clapotements furieux des marées
Moi l'autre hiver plus sourd que les cerveaux d'enfants,
Je courus ! Et les Péninsules démarrées
N'ont pas subi tohu-bohus plus triomphants.

La tempête a béni mes éveils maritimes.
Plus léger qu'un bouchon j'ai dansé sur les flots
Qu'on appelle rouleurs éternels de victimes,
Dix nuits, sans regretter l'oeil niais des falots !

Plus douce qu'aux enfants la chair des pommes sures,
L'eau verte pénétra ma coque de sapin
Et des taches de vins bleus et des vomissures
Me lava, dispersant gouvernail et grappin

Et dès lors, je me suis baigné dans le Poème
De la Mer, infusé d'astres, et lactescent,
Dévorant les azurs verts ; où, flottaison blême
Et ravie, un noyé pensif parfois descend ;

Où, teignant tout à coup les bleuités, délires
Et rythmes lents sous les rutilements du jour,
Plus fortes que l'alcool, plus vastes que nos lyres,
Fermentent les rousseurs amères de l'amour !

Je sais les cieux crevant en éclairs, et les trombes
Et les ressacs et les courants : Je sais le soir,
L'aube exaltée ainsi qu'un peuple de colombes,
Et j'ai vu quelque fois ce que l'homme a cru voir !

J'ai vu le soleil bas, taché d'horreurs mystiques,
Illuminant de longs figements violets,
Pareils à des acteurs de drames très-antiques
Les flots roulant au loin leurs frissons de volets !

J'ai rêvé la nuit verte aux neiges éblouies,
Baiser montant aux yeux des mers avec lenteurs,
La circulation des sèves inouïes,
Et l'éveil jaune et bleu des phosphores chanteurs !

J'ai suivi, des mois pleins, pareille aux vacheries
Hystériques, la houle à l'assaut des récifs,
Sans songer que les pieds lumineux des Maries
Pussent forcer le mufle aux Océans poussifs !

J'ai heurté, savez-vous, d'incroyables Florides
Mêlant aux fleurs des yeux de panthères à peaux
D'hommes ! Des arcs-en-ciel tendus comme des brides
Sous l'horizon des mers, à de glauques troupeaux !

J'ai vu fermenter les marais énormes, nasses
Où pourrit dans les joncs tout un Léviathan !
Des écroulement d'eau au milieu des bonaces,
Et les lointains vers les gouffres cataractant !

Glaciers, soleils d'argent, flots nacreux, cieux de braises !
Échouages hideux au fond des golfes bruns
Où les serpents géants dévorés de punaises
Choient, des arbres tordus, avec de noirs parfums !

J'aurais voulu montrer aux enfants ces dorades
Du flot bleu, ces poissons d'or, ces poissons chantants.
- Des écumes de fleurs ont bercé mes dérades
Et d'ineffables vents m'ont ailé par instants.

Parfois, martyr lassé des pôles et des zones,
La mer dont le sanglot faisait mon roulis doux
Montait vers moi ses fleurs d'ombre aux ventouses jaunes
Et je restais, ainsi qu'une femme à genoux...

Presque île, balottant sur mes bords les querelles
Et les fientes d'oiseaux clabaudeurs aux yeux blonds
Et je voguais, lorsqu'à travers mes liens frêles
Des noyés descendaient dormir, à reculons !

Or moi, bateau perdu sous les cheveux des anses,
Jeté par l'ouragan dans l'éther sans oiseau,
Moi dont les Monitors et les voiliers des Hanses
N'auraient pas repêché la carcasse ivre d'eau ;

Libre, fumant, monté de brumes violettes,
Moi qui trouais le ciel rougeoyant comme un mur
Qui porte, confiture exquise aux bons poètes,
Des lichens de soleil et des morves d'azur,

Qui courais, taché de lunules électriques,
Planche folle, escorté des hippocampes noirs,
Quand les juillets faisaient crouler à coups de triques
Les cieux ultramarins aux ardents entonnoirs ;

Moi qui tremblais, sentant geindre à cinquante lieues
Le rut des Béhémots et les Maelstroms épais,
Fileur éternel des immobilités bleues,
Je regrette l'Europe aux anciens parapets !

J'ai vu des archipels sidéraux ! et des îles
Dont les cieux délirants sont ouverts au vogueur :
- Est-ce en ces nuits sans fond que tu dors et t'exiles,
Million d'oiseaux d'or, ô future Vigueur ? -

Mais, vrai, j'ai trop pleuré ! Les Aubes sont navrantes.
Toute lune est atroce et tout soleil amer :
L'âcre amour m'a gonflé de torpeurs enivrantes.
Ô que ma quille éclate ! Ô que j'aille à la mer !

Si je désire une eau d'Europe, c'est la flache
Noire et froide où vers le crépuscule embaumé
Un enfant accroupi plein de tristesses, lâche
Un bateau frêle comme un papillon de mai.

Je ne puis plus, baigné de vos langueurs, ô lames,
Enlever leur sillage aux porteurs de cotons,
Ni traverser l'orgueil des drapeaux et des flammes,
Ni nager sous les yeux horribles des pontons.

Arthur Rimbaud
J'ai l'erreur suivante : "ValueError: substring not found"
Avatar de Sve@r
Expert éminent sénior https://www.developpez.com
Le 11/08/2021 à 19:36
Bonjour
Citation Envoyé par Captain'Flam Voir le message
C'était la faille de la machine Enigma : comme les messages commençaient toujours par la même séquence de lettres, les chiffrés commençaient aussi par une même séquence de lettres.
L'analyse statistique était rendue possible...
Absolument pas. La machine Enigma était composée de 3 rotors et chaque lettre tapée faisant avancer le premier rotor d'un cran. Quand le premier rotor finissait son tour (à la 26° lettre donc) le second rotor avançait d'un cran. Et pareil quand le second terminait son tour le 3° avançait d'un cran. Ainsi la même lettre répétée 3 fois ne donnait pas la même séquence à l'arrivée. En fait, si on réfléchit bien, la machine Enigma n'était qu'un Vigenère avec une clef de 26^3 lettres. Or une analyse statistique sur Vigenère n'est possible qu'en connaissant la longueur de la clef et avec un message plus long que ladite clef.

Ensuite les messages ne commençaient jamais par la même séquence. Effectivement la clef de 3 lettres (définissant la position des rotors au départ) était mensuelle mais conscients du risque effectif de l'analyse statistique, pour chaque message l'opérateur définissait sa propre clef et faisait commencer son message par cette clef.
Si par exemple le code mensuel était "ABC", l'opérateur choisissait par exemple "DEF" et faisait commencer son message par "DEF" chiffré par "ABC". Puis il plaçait ses rotors en "DEF" et tapait le message (chiffré alors sur "DEF" et non "ABC".
De l'autre côté, l'opérateur plaçait ses rotors sur "ABC", entrait 3 premières lettres du message qui sortaient déchiffrées en "DEF", plaçait ensuite ses rotors sur "DEF" et déchiffrait le reste du message.
Et pour un second message l'opérateur recommençait avec un autre code (ex "GHI" qu'il chiffrait avec "ABC" puis rebelote. Ainsi le code mensuel "ABC" n'était utilisé que pour 3 lettres par message.

Les erreurs qui ont perdu Enigma
  • tout d'abord l'opérateur qui choisissait son code, pour pallier aux erreurs possibles de transmission, l'écrivait en fait 2 fois. Ex pour "DEF" il écrivait "DEFDEF". Et là effectivement ça a donné un point d'appui pour l'analyse statistique car le premier "D" arrivait de l'autre côté deux fois chiffré de deux façons (exemple la première fois "Z" et la seconde "M" ce qui signifie que le rotor ayant tourné 2 fois donne la suite "Z-M" (et pareil avec "E" et "F". Or si un simple "Z" ne donne aucune possibilité, une suite "Z-M" elle offre une étude possible car le nombre de ces suites était bien moins important que le nombre de clefs possibles (approximativement dans les 10000). Il a suffit aux cryptanalystes de répercuter toutes les suites possibles pour pouvoir effectivement les tester assez rapidement. Et contrairement à la légende, cela ne se faisait pas pendant la guerre à Blentchley Parc mais dans les années 1932 en Pologne par l'équipe du mathématicien Marian Rejewski qui a détecté cette faille et a permis les premières analyses des messages d'Enigma.
  • les différents alphabets des rotors étaient conçus de façon à ce qu'une lettre ne puisse jamais devenir elle-même. Un "A" pouvait donner "B", "C", "D" etc jusqu'à "Z" mais jamais jamais jamais ne resortait en "A". Or en cryptanalyse, toute connaissance est une faille. Elle permettait de faire "matcher" certains mots probables tels que "weer" (météo) ou "Hitler" pour éliminer rapidement un grand nombre de possibilités (fait présenté dans le film "Imitation Game"
  • les opérateurs devaient à chaque nouveau message choisir une nouvelle clef mais par fainéantise, ils choisissaient souvent la même clef plusieurs fois. Si un message était déchiffré, sa clef pouvait alors rapidement être testée sur les autres (ce fait à été lui aussi indiqué dans ce même film mais moins bien expliqué).
  • chaque mois les rotors étaient changés de place (il y avait 5 rotors possibles pour 3 emplacements) mais là encore, un même rotor ne pouvait pas se retrouver deux fois à la même place. Ce qui permettait aux casseurs cette fois de Bletchley Parc d'éliminer la moitié des tests à faire


Anecdote: dans le film "Imitation Game", les anglais déchiffrent leur premier message qui fait état d'une attaque imminente sur une flotte de navires dans laquelle justement se trouve le frère du plus jeune de l'équipe. L'équipe (dans laquelle le frère insiste lourdement) veut prévenir l'Etat Major de l'attaque mais Turing justement dit qu'il ne faut pas car sinon les allemands sauront que leurs transmissions n'est plus sécurisée. Bon déjà ce n'est pas à lui de prendre cette décision mais on va passer car c'est fait pour donner de l'intensité au film. Toutefois cette histoire est réellement arrivée. Les anglais ayant eu connaissance d'un convoi allemand mais craignant qu'une attaque massive démasque leur atout ont décidé de n'envoyer leurs navires de guerre que sur une partie du convoi et laisser filer l'autre partie. Sauf que les navires anglais ayant accompli leur mission, sont tombés par hasard sur le reste du convoi et, ne sachant pas qu'il fallait les laisser, ont donc profité de l'aubaine pour les finir (normal). Quand il a été mis au courant, Churchill a flippé sa mère mais le coup de bol c'est que Donitz était tellement confiant dans Enigma qu'il n'y a pas pensé. Il cru a à la place que c'était une fuite de son état major et a orienté l'enquête dans ce sens.
Avatar de Dragon78
Candidat au Club https://www.developpez.com
Le 09/05/2024 à 9:40
Bonjour,

Je suis débutant en Python, et je voulais me faire la main sur un sujet et celui que tu me présentes Captain'Flam m'a beaucoup intrigué : je te remercie pour ce code.

En lisant le commentaire de Marco056, j'ai testé et effectivement je ne codais/décodais pas correctement le poème d'Arthur Rimbaud, aussi me suis-je donné comme défi de trouver une solution que je vous propose ici.

Je ne sais pas Captain'Flam si tu avais une solution pour les caractères qui ne sont pas dans l'alphabet proposé, alors je serais content de tes commentaires sur ma proposition fondée sur ton code (que j'ai épuré pour la lisibilité de la solution) : puis-je encore améliorer ma solution ?

C'est ma première contribution, alors soyez indulgents.

Cordialement,
Dragon78[ATTACH]654420d1/a/a/a" />
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.