Je vous conseille de regarder entièrement le code source et tous les fichiers avant d'écrire une réponse.
Je pense que d'après ma petite connaissance en cryptographie, dite moi si j'ai faux, que c'est la première fois qu'une méthode de chiffrement par substitution qui résiste à une attaque par analyse fréquentielle !
et si le projet est original et inédit pourquoi pas créer une page wikipédia ?
Je pense que d'après ma petite connaissance en cryptographie, dite moi si j'ai faux, que c'est la première fois qu'une méthode de chiffrement par substitution qui résiste à une attaque par analyse fréquentielle !
Tu as déjà sans doute entendu parlé de Enigma? Pour ne citer que ça. Je pense qu'il en existe plein d'autres.
FLOW LORD a écrit:
Je vous conseille de regarder entièrement le code source et tous les fichiers avant d'écrire une réponse.
Honnêtement, c'est difficile et long. J'ai abandonné au bloc B. Trop de trucs dans tous les sens.
Je pense que tu devrais clarifier quelles sont les secrets qui servent à chiffrer et déchiffrer le message. Je n'ai pas trop compris ce que je dois modifier et ce que je dois garder secret pour que personne d'autres que moi puisse déchiffrer le message avec ton code.
le fichier keylib.py sont t'est clé de chiffrement ! Tu dois les garder à tous prix secret ! il est généré lorsque tu chiffre ton premier message
Si tu le surprime tous les messages que tu a chiffré avant sont plus déchiffrable ! Comme si tu perdais t'est bitcoin à jamais ! (Enfin normalement il peut toujours avoir un faille)
Je n'y connais pas en chiffrement, mais l'architecture de ton projet est assez brouillon, on sait pas ou regarder, pas de découplage de code et d'organisation de tes modules.
Ton code pourrait être simplifié pour le lecteur, tu utilises de noms de variable et fonction incompréhensible parfois.
Bref j'ai pas poussé plus loin...
Ancien étudiant OpenClassroom, diplômé en développeur d'application Python
Itou, rien compris, trop de variable mono caractère, c'est illisible.
Sinon mis a part les remarques de lisibilité déjà faites, quelques autres:
- Mettre la clé dans un fichier code ne me semble pas cohérent, c'est une ressource, pas du code, ni sur, si quelqu'un commit et push la sienne sur le repo par inadvertance et que d'autre font un pull, c'est la cata.
- Les noms de fichiers devraient être plus explicites, sans creuser dedans, impossible d'avoir une idée de ce qu'ils font.
- Utilise le Français pour le readme, les grosses fautes d'anglais le rendent parfois incomprehensible.
exemple:
for copy automatically coded message
I take a character group and divide it into of them:
ca ne veut strictement rien dire.
- Inutile de polluer les commit message avec la date, un commit est déjà daté, un message est supposé décrire la modification faite afin d'avoir un historique.
Ce qui est dommage c'est que ton code est peut être intéressant, d'autant qu'il est tout petit et donc devrait être simple a comprendre, mais a cause de tout ca, ca ne donne pas envie d'aller plus loin.
Supposons que les codes à encrypter font 8 bits et que j'ai un mélange des codes: table = [i for i in range(256)] je fais un mélange: shuffle(table) Si j'applique le remplacement: char[i] = table[char[i]] C'est une substitution simple. Si je l'applique plus d'une fois aux caractères suivants: char[i] = table[table[char[i]]] et je le fais 3 fois pour le suivant ... Je peux avoir un cycle de N fois. 1 remplacement pour le premier, 2 remplacements pour le deuxième, ..., N remplacements pour le N-ième. et je reviens à 1 pour le N+1-ième (donc modulo N)
Ça peut ressembler grossièrement à ceci: n = 1 for c in stream: for _ in range(n): c = table[c] n = n%N + 1 sortie.append(c) Je crois que ceci également défie les analyses fréquencielles. Si on a le moyen de coder la fonction de mélange et qu'on y met les paramètre au début du code, on peut varier le mélange. Ça se fait bien avec le modulo: s' = s*m % 257 ou m est un multiplicateur tel qu'on cicle sur 256 itérations. On n'a qu'à donner s de départ et m au début. Plutôt s-1 et m-1 On peut s'arranger pour changer de table de substitution régulièrement. Ça aussi pourrait ètre codé dans le message.
On place la longueur sujette à cette table dans le message (déjà encodé)
Les premières valeurs de s et m pourraient déjà être encodées selon une table (qui sera la clé secrète) etc.
-
Voici le code Python pour générer la liste des multiplicateurs donnant un cycle de 256 itérations pour une fonction pseudo-aléatoire: - sm = lambda s, m: s*m%257 mList = [] for m in range(2, 257): s = sm(1, m) c = 1 while c < 257 and s != 1: s = sm(s, m) c += 1 if c == 256: mList.append(m) print(len(mList)) print(*mList)
- Edité par PierrotLeFou 25 mars 2022 à 6:44:07
Le Tout est souvent plus grand que la somme de ses parties.
Je n'y connais pas en chiffrement, mais l'architecture de ton projet est assez brouillon, on sait pas ou regarder, pas de découplage de code et d'organisation de tes modules.
Ton code pourrait être simplifié pour le lecteur, tu utilises de noms de variable et fonction incompréhensible parfois.
FLOW LORD a écrit: > Je pense que d'après ma petite connaissance en cryptographie, dite moi si j'ai faux, que c'est la première fois qu'une méthode de chiffrement par substitution qui résiste à une attaque par analyse fréquentielle ! Crois-tu que ce que j'ai décrit (brièvement ...) résiste également à une analyse fréquencielle? Je l'ai codé en C il y a plus de 20 ans.
Si je prend le mot "ananas" et le nombre de substitutions (modulo 3): a(1) n(2) a(3) n(1) a(2) s(3) On a 3 façon différentes de coder le 'a' et 2 façons différentes de coder le 'n'. La contrainte est qu'on ne doit rien perdre du message sinon tout sera décalé.
Peut-on décripter cela?
Ça ne marche pas en Python car un caractère ne peut pas servir d'indice. Il faut utiliser ord()
Voir le chiffrement polyalphabétique avec un mot comme clé.
- Edité par PierrotLeFou 27 mars 2022 à 7:46:17
Le Tout est souvent plus grand que la somme de ses parties.
Je passe sur le nom des méthodes pas explicite (b, b1, c, d), sur le nom de méthodes qui induisent en erreur (get_len qui renvoie la moitié de la vraie longueur), sur les méthodes inutiles (sérieusement pourquoi implémenter une méthode inverser_texte quand tu as déjà une fonction inverser liste -- qui comme je l'ai dit est déjà inutile), les path de fichier hardcodés, les messages des commits non informatifs. Bref, je m'arrête.
Egalement, un chiffrage efficace est également parcimonieux et ne multiplie par par 100 la taille du message original...
À part cela c'est bien? Est-ce que le PO est encore intéressé au sujet?
Voici un petit programme en Python qui trouve tous les multiplicateurs m tels que: s = s * m % 257 retourne à la valeur initiale après exactement 256 itérations. Ces multiplicateurs servent à générer des tables de permutation pour l'encryptage par substitution. - F = lambda s, m: s * m % 257 multi = [] for m in range(2, 256+1): s = F(1, m) c = 1 while c < 256 and s != 1: s = F(s, m) c += 1 if c == 256: multi.append(m) print(len(multi)) print(*multi) - 128 3 5 6 7 10 12 14 19 20 24 27 28 33 37 38 39 40 41 43 45 47 48 51 53 54 55 56 63 65 66 69 71 74 75 76 77 78 80 82 83 85 86 87 90 91 93 94 96 97 101 102 103 105 106 107 108 109 110 112 115 119 125 126 127 130 131 132 138 142 145 147 148 149 150 151 152 154 155 156 160 161 163 164 166 167 170 171 172 174 175 177 179 180 181 182 183 186 188 191 192 194 201 202 203 204 206 209 210 212 214 216 217 218 219 220 224 229 230 233 237 238 243 245 247 250 251 252 254 - Voici un bout de code en C qui illustre l'utilisation de ces multiplicateurs. Il suffit de placer dans le message le multiplicateur et la semence de départ pour retrouver la table de permutation utilisée. - #include <stdio.h> #include <stdlib.h> #include <time.h> typedef unsigned char uchar; // Ma fonction pseudo-aléatoire pour permuter la table des codes. int myRand(int m, int s) { return(m*s%257); } // Programme principal. int main() { uchar tableEncoder[256], tableDecoder[256]; // La table complète compte 128 éléments. int tableMultiply[] = {14, 19, 20, 24, 27, 28, 33, 37, 38, 39, 40, 41, 43, 45, 47, 48}; srand(time(NULL)); int m = sizeof tableMultiply / sizeof(int); m = tableMultiply[rand() % m]; printf("Multiplicateur: %d\n", m); int s = rand() % 256 + 1; for(int i = 0; i < 256; i++) { s = myRand(m, s); tableEncoder[i] = s-1; tableDecoder[s-1] = i; } uchar tableOrigine[256], tableSecrete[256]; for(int i = 0; i < 256; i++ ) { tableOrigine[i] = i; tableSecrete[i] = tableEncoder[i]; } for(int i = 0; i < 256; i++) { // Les éléments de tableOrigine ne sont rien d'autre que les indices eux-mêmes. // Ne marche pas si le multiplicateur 'm' est une valeur entre 14 et 48 mais ne se trouvant pas dans la table. if(tableOrigine[i] != tableDecoder[tableSecrete[i]]) { printf("Différence pour %d et %d\n", tableOrigine[i], tableDecoder[tableSecrete[i]]); } } return(0); }
- Edité par PierrotLeFou 11 avril 2022 à 2:33:49
Le Tout est souvent plus grand que la somme de ses parties.
Je passe sur le nom des méthodes pas explicite (b, b1, c, d), sur le nom de méthodes qui induisent en erreur (get_len qui renvoie la moitié de la vraie longueur), sur les méthodes inutiles (sérieusement pourquoi implémenter une méthode inverser_texte quand tu as déjà une fonction inverser liste -- qui comme je l'ai dit est déjà inutile), les path de fichier hardcodés, les messages des commits non informatifs. Bref, je m'arrête.
Egalement, un chiffrage efficace est également parcimonieux et ne multiplie par par 100 la taille du message original...
Merci pour t'est correction !
Honnêtement je ne savais pas quand pouvais le faire en une seule ligne ! Pour la fonction inverser_liste
Pour la fonction get_len c'est le nom de la fonction qui prêtait à confusion, je l'ai modifié.
Pour les fonctions a et b le fonction est un peut dure à expliquer mais je dois faire des tests et je reviendrais !
Je vois pas trop l'intérêt de se moquer. Vous faisiez sûrement pas mieux lorsque vous débutiez la programmation.
Revenons à nos moutons:
@FLOW LORD, il va un moment falloir que tu poses ton système de chiffrement sur le papier. Et ensuite, tu pourras l'implémenter en Python. Parce que là j'ai surtout l'impression qu'une partie de ton algo sert uniquement à faire plein d'opération sur des chaînes de caractères pour mélanger le tout avant de le chiffrer.
On a toujours des «méthodes» aux noms peu éloquent, et souvent, quand on fait ça, c'est qu'on sait pas trop à quoi elles servent et/ou qu'on ne les comprend pas vraiment. Je te ferai remarquer que C1, C2 et C2_inv donnent la même sortie pour une même chaîne en entrée.
Sans compter plein de morceau de code complètement inutile dont on t'a déjà fait part pour certains (je rajouterai un des grands classiques du genre: if reversed_key is True:). Je parle pas de check_word qui est une insulte à l'algorithmie...
Les classes, c'est fait pour faire de la POO, pas pour organiser ton code dans un fichier. Pour ça on divise le code en module, c'est fait pour.
Des logiques parfois douteuses. Un petit ping-pong bloc A, bloc B pour le déchiffrement? On déchiffre complétement une fois et à mince... ça ne fonctionne pas, re déchiffrons autrement?!! Le tout basé uniquement sur une liste exhaustive de mot (pas de chance si on fait une faute ou qu'on utilise des mots qui ne sont pas dans ton dico alors...).
Quand on a un code pas si gros, et qu'on commence à devoir ajouter de nouvelles fonctionnalités dans le code uniquement parce qu'on a un bug qu'on ne sait pas corriger, c'est souvent signe d'un projet mal conçu dès le départ qui ne pourra jamais évoluer.
Bref, un minimum de réflexion avant de coder, ça évite de se retrouver à maintenir un code de 200 lignes qui pourrait en faire 4 fois moins. Sors la tête de python, réfléchis à ce que tu fais vraiment.
vrai que j'ai été méchant. FLOW LORD ne m'a pas donné de réponse satisfaisante. Il a écrit au début: «Je pense que d'après ma petite connaissance en cryptographie, dite moi si j'ai faux, que c'est la première fois qu'une méthode de chiffrement par substitution qui résiste à une attaque par analyse fréquentielle !» Tu dis qu'il est débutant? Je trouve son affirmation un peu préttentieuse. S'il avait exposé son algorithme ou sa méthode au lieu de son code, on aurait pu le conseiller plus facilement.
@FLOW LORD: essaies de nous expliquer ton principe en français et on essaiera de le coder ensemble.
- Edité par PierrotLeFou 29 avril 2022 à 7:57:19
Le Tout est souvent plus grand que la somme de ses parties.
Je n'y vois pas de méchanceté, pour les raisons suivantes:
1) Des remarques bienveillantes lui ont été fournie en parallèle
2) Une des leçons les plus importantes selon moi quand on ouvre son code au monde, est qu'on est pas son code, et que l'attaque est sur le code et nullement sur la personne, si on mélange les 2, on se ferme a l'expérience des autres(qui ne sont pas toujours tendre), et au vu des corrections qu'a fait FlowLord, il a certainement très bien compris ce principe sinon il aurait tout rejeté en bloc.
Mais si il l'a mal pris, je lui présente mes excuse d'avance.
Aucune raison de vouloir éclater les échanges sur plusieurs plateformes.
Pour en revenir aux critiques, il y a une qualité que chaque développeur junior doit avoir, c'est l'humilité, il est facile de croire à nos débuts que notre code est meilleur ou originale, en général ce n'est pas le cas.
Les critiques sont peut-être un peu moqueuses voire dures, mais c'est une réponse au paragraphe de l'auteur :
> c'est la première fois qu'une méthode de chiffrement par substitution qui résiste à une attaque par analyse fréquentielle
Non, bien sûr que non, il suffit de lire le code en diagonal pour voir de grossières erreurs.
Bref comme cela a déjà été dit, il faut poser sa logique puis coder.
Ancien étudiant OpenClassroom, diplômé en développeur d'application Python
FLOW LORD a écrit: «Exemple la chaine: abc de La chaîne devient: QSYIUIOEAZERZTRORRTYRUO » Comme on te l'a déjà dit, ce n'est pas une bonne idée que d'augmenter significativement la longueur du message. As-tu suffisamment de tests pour nous dire par quel facteur les fichiers sont augmentés? «Pour chiffrer un prénom il faut qu'il sois dans la list de mot Tous est paramétrable dans le fichier parametre.py on peut changer de nombre de caractère quand ajoute après après la subtitution.» On doit pouvoir encrypter n'importe quoi sans table de mots ou de codes. Est-ce que ton programme peut décrypter ce qu'il a lui-même encrypté? C'est un bon test de départ. Ton code va sûrement déjouer les analyses fréquencielles, mais à quel prix?
Le Tout est souvent plus grand que la somme de ses parties.
Si cela t'a amusé et appris des choses, c'est le principal. Tu n'as pas répondu à ma question: peux-tu décrypter ce que tu as encrypté? Si oui, c'est le principal. Tu es libre de prendre nos idées ou pas.
Le Tout est souvent plus grand que la somme de ses parties.
Si cela t'a amusé et appris des choses, c'est le principal. Tu n'as pas répondu à ma question: peux-tu décrypter ce que tu as encrypté? Si oui, c'est le principal. Tu es libre de prendre nos idées ou pas.
Pourriez vous être un peu plus indulgent avec lui?
Dire que son code est à revoir est acceptable mais dire qu'il est " extrêmement mauvais" peut être blessant.
On a tous commencé quelque part C'est en codant que l'ont devient codeur, alors continue! C'est du bon boulot
Il est quand même arriver avec un postulat de départ d'avoir créer un chiffrement par substitution plus robuste que tous les autres conçus jusqu'ici. Ce qui est bien évidemment faux et qui démontre quand même très peu de documentation et de recherche sur le sujet au préalable. De plus, il a quand même demandé une relecture complète de son code avant de lui répondre. Je pense qu'à partir du moment où on pose des bases aussi exigeantes, il faut s'attendre que les réponses le soient aussi.
J'ai rien contre son projet, mais ici, c'est quand même une partie du forum fait pour présenter des projets sérieux et/ou orignal normalement plus que des petits projets perso pour s'amuser.
Quant aux remarques, tu observeras aussi que c'est toujours les mêmes depuis 4 mois quasiment, et que peu de choses ont évoluées en terme de qualité de code. Libre à l'auteur de nous ignorer effectivement, mais je vois encore moins l'intérêt de ce sujet alors...
Pardonnez moi de ma stupidité, lors de mon premier message,
mais c'est que ce projet me rend dingue (dans le bon sens biensure c'est merveilleux, c'est vraiment ce que j'aime faire et je vais en faire mon métier
Bref,
Malgré mon très mauvais gestion de projet et ma programmation médiocre.
Depuis que j'ai mis le projet en open source, le programme marche et répond exactement à mon besoin de départ:
Chiffrer du text et seulement sa.
Le programme marche et naïf que j'était je n'osais pas toucher au code source et le laissé pourrire ce que qui montrais parfois des aberration monstrueuse.
" Sa marche, donc je en touche pas" du peur de tous foiré.
Maintenant je fait régulièrement des mise à jour tous les jours pour constamment améliorer le code. Des futures verison feront le jour.
Le programme a ces propres "règles" même si elle est sécurisée et tous le bla bla ce n'est pas mon but. Maintenant ce que je cherche à faire c'est de le casser, c'est à dire de trouver les messages sans les clés.
C'est pour cela que j'ai ouvert un projet annexe "MARS ATTACK", ouvert depuis maintenant quelques semaines j'ai déjà trouver une "faille", que j'ai patché par la suite avec une nouvelle version.
C'est sa que j'aime aussi faire, trouver et recherché, exploiter des faile et les patchés.
Pour moi je trouve sa dingue et éprouvre une certaine fascination qu'un algorithme, 'une boîte noire' ou tu fait enter du text:
Ancien étudiant OpenClassroom, diplômé en développeur d'application Python
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
PXL Le retro gaming facile Thread sur le forum: https://openclassrooms.com/forum/sujet/retro-pxl
Le Tout est souvent plus grand que la somme de ses parties.
Ancien étudiant OpenClassroom, diplômé en développeur d'application Python
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Créateur du cours Développez votre premier jeu vidéo avec l'Unreal Engine4