Partage
  • Partager sur Facebook
  • Partager sur Twitter

Cryptage par remplacement de caractères

Problème comment décoder ?

Sujet résolu
4 octobre 2020 à 2:01:21

Bonjour ! ou bonsoir !

Je veux faire un programme de cryptage par remplacement de caractère (substitution je crois). Le programme que je veut faire est simple:

Il va remplacer chaque lettre de l'alphabet par une chaine de caractère uniquement composé de chiffre [0-9] et de caractère spéciale [@,#,€,%,&,-,+,(,) etc...]

Exemple ici une key est une list contenant l'alphabet crypter. Admettent que le programme à choisi la key1, il va avoir le a = @275#, b = €9&74 et c = %2&11#

Donc la chaine de sortie seras: @275€9&74%2&11#

Et ces 'key' j'ai prévus d'en généré 30 mais au départ je vais en faire que 3 pour tester le programme.

Étape 1 l'user entre son message (sans majuscule ni ponctuation et chiffres)

Étape 2 le programme choisi une key au hasard parmi les 30 (3 pour le moment) et replace les lettres.

Bien tous sa c'est bien jolie mais le problème c'est comment faire pour décrypter ? 

Je crois qu'il faudrait prendre la  chaine de caractère crypté et essayer avec tous les key jusqu'à que le message sois lisible mais je ne sais pas comment je pourrait le traduire en python.

Cordialement merci de vos réponses !

  • Partager sur Facebook
  • Partager sur Twitter

Rien n'est impossible.

4 octobre 2020 à 3:18:22

Pour décrypter il te faut la clé.

Tu as juste à remplacer les caractères chiffrés par les caractères non chiffrés et c'est bon. La transformation inverse de ce que tu as fait pour chiffrer.

  • Partager sur Facebook
  • Partager sur Twitter

Blond, bouclé, toujours le sourire aux lèvres...

4 octobre 2020 à 4:06:12

Python ne peut pas savoir si le texte résultant de ton décryptage est vraiment correct. Tu peux toujours vérifier qu'il n'y a plus de caractère crypté, mais c'est tout.
Dans les techniques de cryptage, on place une clé au départ qui dit comment décrypter.
Dans ton cas, si tu as 3 codes, tu pourrais écrire au début:
cle=chr(code)
et au décryptage tu retrouve la clé avec:
code=int(cle)
Si tu prévois aller jusqu'à 30 codes, il te faudra 2 chiffres. Tu dois les coder toujours de la même façon et le décrypteur doit l'attendre de cette façon.
Par exemple, pour 3, je pourrais avoir '@0+3' et pour 30, j'aurais '@3+0'
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

5 octobre 2020 à 21:47:35

LoupSolitaire a écrit:

Pour décrypter il te faut la clé.

Tu as juste à remplacer les caractères chiffrés par les caractères non chiffrés et c'est bon. La transformation inverse de ce que tu as fait pour chiffrer.


Non imagine l'user1 ouvre le programme donc une 1 clé est choisit au hasard et il code sont message.

Maintenant il va fermer le programme et envoyer le code à user2 

User2 ouvre le programme donc une AUTRE clé est choisit au hasard donc le décodage seras illisible.

  • Partager sur Facebook
  • Partager sur Twitter

Rien n'est impossible.

5 octobre 2020 à 22:21:21

Bonjour,

Si toutes les clés possibles sont connues, tu peux déjà implémenter une analyse fréquentielle: https://fr.wikipedia.org/wiki/Analyse_fr%C3%A9quentielle (même si ça a certaines limites).

Pour chaque clé, tu calcules la fréquence d'apparition de chaque lettre et tu compares (à l'aide de la distance euclidienne) chaque ensemble de fréquence trouvé à celui théorique établit. L'ensemble le plus proche étant probablement l'ensemble correspondant à la clé utilisée.

PS: https://chiffrer.info/ :)

-
Edité par KoaTao 5 octobre 2020 à 22:28:08

  • Partager sur Facebook
  • Partager sur Twitter
6 octobre 2020 à 3:01:39

Que veut dire "probablement"? Un humain peut jouer aux devinettes, mais pas un programme.
Il faut que le code qui reçoit le message "sache" comment décoder ce message.
On peut compliquer les choses par rapport à ce que j'ai écrit.
Supposons que je veux coder la clé 03. J'ai dit que je peux écrire @0+3.
Mais je peux prendre le complément à 9 de chaque chiffre. Alors, 0 -> 9-0 -> 9 et 3 -> 9-3 -> 6
le code devient @9+6
On peut imaginer que le premier caractère impose une règle supplémentaire.
@ : on complémente les deux chiffres
+ : on complémente le premier seulement
~ : on complémente le deuxième seulement
# : on ne complémente rien
Ce n'est qu'un exemple ...
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

7 octobre 2020 à 8:21:20

"Probablement" car si le message est trop court, ça ne peut pas déchiffrer le message par exemple. On peut très bien utiliser des systèmes qui se base sur des probabilités. ça existe.

Effectivement, on peut transmettre la clé avec le message (ce qui est assez élégant) mais ça vient encore plus baser le chiffrement sur le secret de l'implémentation, ce qui est, en terme de cryptographie, une mauvaise pratique (on peut noter que le chiffrement proposé par l'auteur est déjà trop faible de toute manière ^^ ).

En fait, ce que montre l'analyse fréquentielle, c'est qu'il est assez simple pour un attaquant de casser ce type de code sans avoir recours à des outils très développés.

  • Partager sur Facebook
  • Partager sur Twitter
7 octobre 2020 à 16:03:57

Alex Mikkrow a écrit:

LoupSolitaire a écrit:

Pour décrypter il te faut la clé.

Tu as juste à remplacer les caractères chiffrés par les caractères non chiffrés et c'est bon. La transformation inverse de ce que tu as fait pour chiffrer.


Non imagine l'user1 ouvre le programme donc une 1 clé est choisit au hasard et il code sont message.

Maintenant il va fermer le programme et envoyer le code à user2 

User2 ouvre le programme donc une AUTRE clé est choisit au hasard donc le décodage seras illisible.


D'où sa première phrase "pour décrypter il faut la clé; ensuite, il faut faire la transformation inverse (le "ensuite" était implicite, je pense).

Autre solution, si les codes correspondant aux lettres sont uniques à un jeu de clé (on ne retrouve pas le code dans une autre des clés); on peut limiter le nombre de clé à traiter en excluant celle dont un des codes est absent de son codage. (ou pire, retranscrire dans les n clés et laisser la personne choisir la phrase qui a du sens :D )
  • Partager sur Facebook
  • Partager sur Twitter
7 octobre 2020 à 18:32:05

Normalement, les programmes d'encryptage et de décryptage utilisent une clé fournie dans le message.
Pourquoi s'entêter à faire autrement ...
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

8 octobre 2020 à 18:45:25

"Fournie dans le message" ? Tu veux dire fournie avec le message je pense ? Oui, bien sur.

Mais on est sur la question de l’œuf et de la poule, comment fait-on pour transmettre la clé de manière sécurisée ?

Et de toute manière, vu qu'on va à l'encontre des principes de bases en terme de sécurité en crypto, et que l'auteur fait clairement son programme pour «s'amuser», je ne vois pas le problème à chercher d'utiliser des solutions détournées ?

  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2020 à 20:35:33

Bonjour !

Avec ma première  version de ce programme j'avais crypté un long text de Isaac Asimov sur les robots  et j'ai donner le fichier crypté à mon professeur de NSI (Numérique Science Informatique ) qui avec l'analyse frequenciel essaye de le décodé, je n'ai pas eu de nouvelle.

Oui j'allais partir  sur:

ÉTAPE 1: user 1  entre le message

ÉTAPE 2: choisi une clé entre 0 et 30 

Une fois le message codé et envoyé avec la clé par exemple:

a = 3€×2

b = @9*1

c = 81×+

L'user 1 à  choisi  la clé  20

Donc l'user 2 reçois: 3€×2@9*181×+ et la clé 20

Mais bon cette solution m'intéresse pas.

Merci de vos réponses mais la solution la plus simple pour moi c'est de tester le message codé avec toute les clés  et c'est user 2 qui verras le message décoder je me met au travail dès maintenant !

  • Partager sur Facebook
  • Partager sur Twitter

Rien n'est impossible.

9 octobre 2020 à 3:06:54

Si le but est de faire damner ton prof, c'est une bonne technique ...
S'il connait toutes les règles d'encodage, il peut toutes les essayer, disons sur les 100 premiers codes, et voir ce que ça donne.
Le code le plus vraisemblable devrait être le bon.
Je suppose que ça ne devrait pas être trop difficile de t'envoyer un message codé que tu ne pourras pas décoder
si tu ne connais pas la règle de codage.
Et elle pourrait résister aux analyses fréquencielles.
Par exemple, faire un codage par permutation des codes, mais en changeant de table à tous les X caractères.
Puis faire varier la longueur des segments entre X et X plus une autre valeur choisie au hasard mais donnée codée dans le message.
Puis, seul le multiplicateur et la semence  de la première table de permutation sont donnés non codés.
Et je pourrais continuer à complexifier mon algorithme ...
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

9 octobre 2020 à 3:36:38

PierrotLeFou a écrit:

Si le but est de faire damner ton prof, c'est une bonne technique ...
S'il connait toutes les règles d'encodage, il peut toutes les essayer, disons sur les 100 premiers codes, et voir ce que ça donne.
Le code le plus vraisemblable devrait être le bon.
Je suppose que ça ne devrait pas être trop difficile de t'envoyer un message codé que tu ne pourras pas décoder
si tu ne connais pas la règle de codage.
Et elle pourrait résister aux analyses fréquencielles.
Par exemple, faire un codage par permutation des codes, mais en changeant de table à tous les X caractères.
Puis faire varier la longueur des segments entre X et X plus une autre valeur choisie au hasard mais donnée codée dans le message.
Puis, seul le multiplicateur et la semence  de la première table de permutation sont donnés non codés.
Et je pourrais continuer à complexifier mon algorithme ...

Non dans ce cas là uniquement, j'ai moi même  choisit une clé parmi les 30 et moi seul je suis capable de le décoder (Je sais que sa contredit le principe de mon programme (clé choisi au hasard ) mais bon il ma donner le droit de le faire car le décryptage était défectueux. ) l'importance est que j'ai eu une bonne note pour un projet personnel
  • Partager sur Facebook
  • Partager sur Twitter

Rien n'est impossible.

9 octobre 2020 à 4:33:05

Tu as  écrit:
«Non dans ce cas là uniquement, j'ai moi même  choisit une clé parmi les 30 et moi seul je suis capable de le décoder
(Je sais que sa contredit le principe de mon programme (clé choisi au hasard ) mais bon il ma donner le droit de le
faire car le décryptage était défectueux. ) l'importance est que j'ai eu une bonne note pour un projet personnel»
Ce n'est pas moi ton prof, c'est lui qui décide.
Mais si tu ne peux pas décoder même en connaissant la clé, je ne t'aurais pas donné une bonne note ...
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

9 octobre 2020 à 6:36:41

PierrotLeFou a écrit:

Tu as  écrit:
«Non dans ce cas là uniquement, j'ai moi même  choisit une clé parmi les 30 et moi seul je suis capable de le décoder
(Je sais que sa contredit le principe de mon programme (clé choisi au hasard ) mais bon il ma donner le droit de le
faire car le décryptage était défectueux. ) l'importance est que j'ai eu une bonne note pour un projet personnel»
Ce n'est pas moi ton prof, c'est lui qui décide.
Mais si tu ne peux pas décoder même en connaissant la clé, je ne t'aurais pas donné une bonne note ...


Bonjour PierrotLeFou

Ce que tu racconte là c'est faux. Voici la preuve avec la version finale du programme (100 keys):

#By Alex Seymus and Yoyo55
#just for fun 

from KEYLIB import*
from random import*

alphabet_liste = ["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"]

random_key_choice = choice(list_key)

text = 'licorn'


def atn(text):
		for i in range(26):
			text = text.replace(alphabet_liste[i],random_key_choice[i])
		print(text)

def nta(text):
		for i in range(26):
			text = text.replace(random_key_choice[i],alphabet_liste[i])
		print(text)

atn(text)

nta(text)

OUTPUT:

le codage: 377@231,889@338@)223)=337=202@975

le décodage: licorn


  • Partager sur Facebook
  • Partager sur Twitter

Rien n'est impossible.

9 octobre 2020 à 8:30:02

Ça fonctionne parce que tu fais le chiffrement et le déchiffrement au même moment, avec une clé générée commune.

Mais l'intérêt est souvent de communiquer un message chiffré à quelqu'un qui pourra à son tour le déchiffrer, et ton programme ne permet pas cela (à moins de tester toutes les clés, ce qui équivaut à un message non chiffré).

  • Partager sur Facebook
  • Partager sur Twitter
9 octobre 2020 à 18:53:03

FLOW LORD a écrit:

Avec ma première  version de ce programme j'avais crypté un long text de Isaac Asimov sur les robots  et j'ai donner le fichier crypté à mon professeur de NSI (Numérique Science Informatique ) qui avec l'analyse frequenciel essaye de le décodé, je n'ai pas eu de nouvelle.

Si on se base sur la version finale du programme, permet moi de douter que ton prof ait vraiment essayer. Vu que tu ne codes que les lettres minuscules, il reste les caractères majuscules, de ponctuation (. , ; : ! ? ' « ») et les espaces ou tout autre caractère spécial ( % + - $ # é à ã ...) ce qui est aide à deviner la structure du code. Ça se casse à la main avec un peu de réflexion.

Il existe des fonctions comme chr et ord qui permettent de passer d'une représentation en code Unicode à une représentation en caractère imprimable (https://docs.python.org/3.9/library/functions.html). Tu pourrais donc essayer d'améliorer ton code, en créant un système de substitution qui se base sur le code d'un caractère plutôt que sur le caractère en lui même.

-
Edité par KoaTao 9 octobre 2020 à 18:55:18

  • Partager sur Facebook
  • Partager sur Twitter
9 octobre 2020 à 20:31:05

hex(ord(caractère)+256)[-2:] devrait coder deux digits pour chaque caractère ou "code"
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

10 octobre 2020 à 16:09:42

KoaTao a écrit:

FLOW LORD a écrit:

Avec ma première  version de ce programme j'avais crypté un long text de Isaac Asimov sur les robots  et j'ai donner le fichier crypté à mon professeur de NSI (Numérique Science Informatique ) qui avec l'analyse frequenciel essaye de le décodé, je n'ai pas eu de nouvelle.

Si on se base sur la version finale du programme, permet moi de douter que ton prof ait vraiment essayer. Vu que tu ne codes que les lettres minuscules, il reste les caractères majuscules, de ponctuation (. , ; : ! ? ' « ») et les espaces ou tout autre caractère spécial ( % + - $ # é à ã ...) ce qui est aide à deviner la structure du code. Ça se casse à la main avec un peu de réflexion.

Il existe des fonctions comme chr et ord qui permettent de passer d'une représentation en code Unicode à une représentation en caractère imprimable (https://docs.python.org/3.9/library/functions.html). Tu pourrais donc essayer d'améliorer ton code, en créant un système de substitution qui se base sur le code d'un caractère plutôt que sur le caractère en lui même.

-
Edité par KoaTao il y a environ 21 heures

Bah le principe du programme est de chiffré uniquement les lettres minuscules. Comment in peut le décoder sans le programme ? Sachons qu'il choisit  une parmi 100 clé et agit uniquement sur les textes cours ?

  • Partager sur Facebook
  • Partager sur Twitter

Rien n'est impossible.

10 octobre 2020 à 17:50:15

Si on part du principe que Alice et Bob ont la même version du programme, et que Alice transmet le message chiffré à Bob, on ne sait toujours pas comment ton programme (dans la version finale postée) est capable de le déchiffrer (la clé n'est pas un paramètre de ta fonction servant au déchiffrement). Et aucune mention de la clé n'est fournie dans le message final.

Un autre problème est ta fonction nta qui est buggée: imaginons que tu souhaites coder le mot orange, et que ton tableau de substitution contient:

"a": "&?!,"
"o": "#*&?"
"r": "!,(:"

Tu vas avoir un sérieux problème.

Au-delà de ça, pour UN texte d'un mot, bien sur que c'est compliqué, on ne peut générer qu'une liste de substitutions possibles pour différentes longueurs de motif.

Pour un texte court (de quelques mots), on peut probablement deviner que chaque motif de substitution est de 4 caractères (ou 2 ou 1). Et établir une liste de possibilités et ne garder que celles qui ont du sens (ce qui a des chances d'éliminer la possibilité d'avoir des motifs de longueur 1 et 2).

Ce qu'il faut comprendre c'est que tu substitues un même caractère par un même motif. Et que même dans un texte court, certains motifs vont se répéter (il y a peu de voyelles mais on en retrouve dans tous les mots). Et c'est autant d'indications qui permettent ensuite de reconstruire le texte originale (ou un ensemble de textes vraisemblables).

Donc oui, avec un texte court ça peut passer, mais ça rend l'utilité de ton programme très limité et n'offre aucune garantie, voire offre un faux sentiment de sécurité.

https://fr.wikipedia.org/wiki/Principe_de_Kerckhoffs.

Attention, je ne dis pas que c'est simple de créer un système de chiffrement, ou même ce que tu fais est mal (il faut bien commencer quelque part). Mais plutôt d'essayer de prendre un peu de recul sur ce que tu fais, et comprendre pourquoi c'est si complexe aujourd'hui de créer un système de chiffrement sûr.

Ce que tu as créé est un système de chiffrement uniquement parce que tes clés génératrices du code sont secrètes. Le reste est quasi transparent, et s'apparente plutôt à une forme de codage de l'information.

-
Edité par KoaTao 10 octobre 2020 à 23:30:22

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2020 à 18:47:07

«Ce qu'il faut comprendre c'est que tu substitues un même caractère par un même motif. Et que même dans un texte court, certains motifs vont se répéter (il y a peu de voyelle mais on en retrouve partout). Et c'est autant d'indications qui permettent ensuite de reconstruire le texte originale (ou un ensemble de textes vraisemblables)».
J'avais écrit du code qui utilisait une table de permutation, mais je l'appliquait plus d'une fois:
Si ma table est P et la position courante est c
Je faisais n=c%3+1 (de 1 à 3)
for i in range(n):
    code=P[code]
Donc la même lettre n'était pas codée de la même façon partout.
ce qui cassait l'analyse fréquencielle.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

27 décembre 2020 à 14:25:32

Bonjour ! 

Je revien à vous pour vous dire que j'ai résolu le problème par moi même. 

Il a maintenant 100 key (chaque key contient une lettre de l'alphabet déjà crypté.)

 imposer des règles: exclusivement des lettres, des espaces et un message court. Le but c'est d'envoyer un message en langage sms par exemple mais compréhensible.

Exemple: rdv a midi devant fontaine

Le déchiffrage est simple et bête (génie logiciel: KISS Keep It Simple Stupide). Je test mon code avec tout les key et si il a plus de chiffre et de caractères spéciaux alors il affiche le code déchiffrer et sort de la boucle.

Je peut envoyer un code chiffré par email et être sur que le destinataire avec mon programme pourra le déchiffrer à condition qu'il a la bonne version du programme ! 

voici l'output de la dernière version du programme CRY3.

le déchiffrage est bencale mais les améliorations futur pourraient rectifiée le tir. 

ici on peut deviner que la lettre a = *211* mais aucun moyen de savoir qu'elle key parmie les 100 à était utilisé pour le cryptage.

On plus j'ai décidé que à chaque mise à jour important de mon programme je génère une  nouvelle KEYLIB qui peut contenir entre 50 et 100 key.

donc la lettre a auras une autre valeur dans quelques mois. il est important d'utiliser la même version du programme pour envoyer des codes secrets.

-------------[CRY3]-------------

version: 3.0

Encrypt or decrypt ? e/d

>>  e

Entrer votre message: rdv a midi devant fontaine

rdv a midi devant fontaine  <==>  331~311&983247&977 *211* 296-328&311&983328& 311&983!204!247&977*211*=342=~205~ 218(707374@=342=~205~*211*328&=342=!204! 

Code copié

#première tantative

Encrypt or decrypt ? e/d

>>  d

coller le code:331~311&983247&977 *211* 296-328&311&983328& 311&983!204!247&977*211*=342=~205~ 218(707374@=342=~205~*211*328&=342=!204!

Il affiche:

331~311&983247&977 *211* 296-328&311&983328& 311&983!204!247&977*211*=342=~205~ 218(707374@=342=~205~*211*328&=342=!204!  <==>  331~311&98o7&977 *211* 296-l311&983l 311&983!204!247&977*211*=342=~20z~ 218(707374@=342=~20z~*211*l=342=!204! 

#deusième tantative

Encrypt or decrypt ? e/d

>>  d

coller le code:331~311&983247&977 *211* 296-328&311&983328& 311&983!204!247&977*211*=342=~205~ 218(707374@=342=~205~*211*328&=342=!204!

Il affiche:

331~311&983247&977 *211* 296-328&311&983328& 311&983!204!247&977*211*=342=~205~ 218(707374@=342=~205~*211*328&=342=!204!  <==>  rdv l mbdb devlnt fontlbne 

#troisime tantative

Encrypt or decrypt ? e/d

>>  d

coller le code:331~311&983247&977 *211* 296-328&311&983328& 311&983!204!247&977*211*=342=~205~ 218(707374@=342=~205~*211*328&=342=!204!

Il affiche:

331~311&983247&977 *211* 296-328&311&983328& 311&983!204!247&977*211*=342=~205~ 218(707374@=342=~205~*211*328&=342=!204!  <==>  r311&98o7&977 a gbdb d!e!vant fontabn!e! 

#quatrième tantative

Encrypt or decrypt ? e/d

>>  d

coller le code:331~311&983247&977 *211* 296-328&311&983328& 311&983!204!247&977*211*=342=~205~ 218(707374@=342=~205~*211*328&=342=!204!

Il affiche:

331~311&983247&977 *211* 296-328&311&983328& 311&983!204!247&977*211*=342=~205~ 218(707374@=342=~205~*211*328&=342=!204!  <==>  rdv a midi devant fontaine 

Encrypt or decrypt ? e/d

>>  exit

Good baye !

Je revien vers vous pour vous remercier de m'avoir aider et de vous dire es ce que c'est possible de déchiffrer le code sans le programme ?

-
Edité par FLOW LORD 28 décembre 2020 à 9:29:19

  • Partager sur Facebook
  • Partager sur Twitter

Rien n'est impossible.

19 juin 2021 à 3:19:31 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


19 juin 2021 à 5:56:40

@MohamedLamineNdiongue Bonjour, merci de ne pas déterrer d'ancien sujet résolu.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter