Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 09/02/2019, à 19:25

mandeb

crypto, masque jetable, python

bonsoir,

J'utilise régulièrement un petit logiciel perso de chiffrement selon la technique du masque jetable (c'est en python). C'est le plus souvent pour du stockage statique sur HDD pour les chiffrés et sur une clé USB pour les fichiers clé, mais il peut arriver que je doive échanger ces fichiers par mail.
La caractéristique de cette méthode (réputée inviolable) est que le fichier clé à la même taille que le document chiffré, ce qui double l'espace occupé d'une part et pénalise les échanges d'autre part (il faut 2 chemins différents d'acheminement du chiffré et de sa clé) surtout dans le cas de gros fichiers (photos raw par exemple).

Pour essayer d’alléger ces contraintes j'ai pensé à un contournement qui exploite une caractéristique de la fonction seed(xxx) du module random de python : elle est déterministe, ce qui veut dire qu'avec le même seed(xxx) la série pseudo-aléatoire générée sera toujours identique, par conséquent il n'y a plus qu'à envoyer la valeur du seed pour permettre au correspondant de générer son propre fichier clé et de déchiffrer.
De plus on peut très bien utiliser un mot/phrase de passe en générant un hash de ce mot de passe et le passer à seed() : random.seed(hashlib.sha256("MotDePasse").hexdigest())

au final donc : envoi du chiffré par mail en pj et mot de passe oralement par tel (par exemple). Pour corser l'ensemble on peut même convenir une fois pour toute par un canal sûr d'un salage du mot de passe qui sera appliqué à chaque fois.
la seule contrainte : ne JAMAIS utiliser le même mot de passe pour chaque échange.

Est-cet sérieux ? pas sérieux ? vos avis/remarques seront bienvenus.
merci d'avance,
bon we.

Hors ligne

#2 Le 09/02/2019, à 19:46

Nuliel

Re : crypto, masque jetable, python

La méthode du masque jetable est en gros la méthode de Vigenère avec une clé qui fait la même taille que le fichier. A partir du moment où la clé boucle (à cause du caractère pseudo aléatoire), on se retrouve avec un chiffre de Vigenère, potentiellement cassable en utilisant l'indice de coincidence et le début des fichiers (nombre magique, entête, ...)

Une tite remarque: pour faire transiter des données entre un client et un serveur, on utilise généralement un chiffrement asymétrique pour s'échanger les clés puis ensuite on passe à un chiffrement symétrique qui sera plus rapide (moins de calculs). Tu pourrais utiliser cette idée là.

L'idée du random.seed(hashlib.sha256("MotDePasse").hexdigest()) ne rendrait pas simplement à une attaque par dictionnaire (une attaque de mot de passe classique)

Hors ligne

#3 Le 09/02/2019, à 20:25

mandeb

Re : crypto, masque jetable, python

Merci de votre attention,
La période du générateur de python est quand même assez gigantesque, ce qui "protège" quand même pas mal non ? Pour les fichier à en-têtes constants (jpg par exemple) c'est OK pour obtenir le début de la clé, mais est-il possible en connaissant par exemple les 1024 premiers octets d'un fichier pseudo aléatoire (un clé donc) d'inférer sur les suivants en ignorant la valeurs du seed qui a servi ? La connaissance de ces premiers octets permettent-ils d'en déduire le seed ?
Le calcul d'IC permet de conjecturer sur la méthode et/ou la langue utilisée, que peut-il dire sur un fichier jpg par exemple ?
Pour l'attaque par dictionnaire, le mot de passe réel utilisé est le résultat d'un hash+salage, méthode semble-t-il assez répandue pour justement empêcher une attaque par dictionnaire, remonter d'un hash256 vers sa source est-il possible ?  Les règles classiques du choix de MDP solide s'appliquent donc ici bien sûr.
Tout à faire d'accord avec vous pour dire qu'il existe par ailleurs une multitude de protocoles divers et variés avec leur implémentations pour faire des échanges solides et sûrs, mes interrogations ici c'est juste pour le fun de se bricoler un petit truc soi-même wink

Hors ligne

#4 Le 09/02/2019, à 20:46

Nuliel

Re : crypto, masque jetable, python

L'IC permet surtout de connaître la longueur probable de la clé (en tout cas le motif qui est répété) mais effectivement sur un fichier jpg pas sûr que ça fonctionne.


Oui, le fait de saler évite l'utilisation de dictionnaires tout fait.
Remonter d'un sha256 au mdp est complexe.

En gros, si je comprends, est ce qu'un générateur de nombres aléatoire peut être prédictible? Ca peut arriver

cat /proc/sys/kernel/random/entropy_avail

Hors ligne

#5 Le 09/02/2019, à 21:15

mandeb

Re : crypto, masque jetable, python

Oui un générateur aléatoire est prédictible, c'est pour cette raison que l'on parle de pseudo-aléatoire. Il est amorcé avec une graine (seed) et sortira toujours la même série de valeurs avec une même graine. De plus il tourne en boucle et finira par ressortir la même série qu'au départ mais au bout d'un nombre considérable de valeurs (2**19937-1 pour une série de float,  d'après la doc de python).
Pour éviter de tomber sur un seed déjà vu, il est recommandé d'utiliser un seed aléatoire comme une combinaison de timer système, mouvements de souris etc...avec l'instruction random.seed().

En fait je me propose de "détourner" à notre profit ce défaut pour permettre au récepteur de recalculer la clé totale de son côté et ainsi éviter un transfert double en taille. Je pense que c'est valide mais avec les réserves d'usage : mdp forts et pas de répétition de mdp. Je pense que le fichier chiffré isolé garde les même qualités de sûreté puisqu'il est chiffré exactement de la même manière. Ce qui change c'est le protocole d'échange de la clé, en fait il y a échange d'une "clé de clé" au lieu de la clé elle même.
Pour ce que j'en ai compris...;)

Hors ligne

#6 Le 09/02/2019, à 21:21

Nuliel

Re : crypto, masque jetable, python

Tu as entré la commande

cat /proc/sys/kernel/random/entropy_avail

?
Un générateur aléatoire est normalement prédictible à partir du moment où l'entropie est trop faible.

Heu, là je suis plus

Hors ligne

#7 Le 09/02/2019, à 22:11

mandeb

Re : crypto, masque jetable, python

Oui, j'obtiens 3706.
Je ne connaissait pas ce paramètre. Si je comprend ce que j'ai trouvé sur le sujet, il rend compte de l'entropie maximale disponible sur ton système (en gros une compilation en un indice de tous les événements matériels et/ou logiciels qui peuvent servir à générer de l'aléa). Si ton système n'est pas à même de produire assez d'événements suffisamment aléatoires alors son entropie générale sera basse, et plus elle est basse et moins les générateurs pseudo-aléatoires qui s'appuient dessus seront capables à leur tour de générer une entropie élevée. En plus trivial : moins il y a de sources de fabrication possibles de bordel  dans le système, moins il sera possible de générer un bon bordel pour tes applis big_smile
Je vois donc l'entropie comme un "indicateur de bordel", et plus c'est bordélique plus c'est dur à débrouiller, donc mieux c'est pour ce qui nous intéresse.
A valider tout çà bien entendu... j'entend déjà les vrais matheux hurler lol

Hors ligne

#8 Le 09/02/2019, à 22:20

Nuliel

Re : crypto, masque jetable, python

Je suis un "vrai matheux", mais c'est une bonne simplification smile
Si tu as un peu de sous, investis dans des lampes à lave smile

Hors ligne

#9 Le 09/02/2019, à 22:54

mandeb

Re : crypto, masque jetable, python

Yep, je suis de la génération où on en avaient tous une dans notre salon, c'était très mode à l'époque. La lampe ça irait encore, mais le dispositif pour passer de l'analogique au digital ça ne doit pas être donné ! et je ne parle pas du soft sous-jacent.
bonne soirée.

Hors ligne

#10 Le 11/02/2019, à 15:06

mandeb

Re : crypto, masque jetable, python

bonjour,
C'est programmé et ça fonctionne. J'ai pu lever un doute qui me restait : le générateur pseudo aléatoire de python fonctionne de la même manière quelque soit le PC et l'OS. Certaines fonctionnalités internes auraient pu se servir du matériel installé ou des drivers pour générer de l'entropie système et dans ce cas les suite aléatoires auraient été différentes même avec un seed identique. Heureusement ce n'est pas le cas. J'ai testé 2 PC ubuntu, un mint et un W10, ils donnent tous la même suite avec le même seed.
Me voilà donc avec un chiffrement symétrique à symétrie...partagée.;)

Hors ligne

#11 Le 11/02/2019, à 15:29

Nuliel

Re : crypto, masque jetable, python

Bien!

Hors ligne

#12 Le 11/02/2019, à 15:31

Nasman

Re : crypto, masque jetable, python

La limitation la plus sévère est que tu ne peux chiffrer qu'un fichier avec cette clé. Si tu chiffres deux fichiers avec la même clé, il devrait être possible de casser ton chiffrement.

Exemple : chiffrement qu'un fichier PDF et txt avec la même clé:
L'en-tête d'un pdf contient en en-tête MIME du genre PDFxxx (de mémoire). Si l'attaquant essaie différents formats de fichiers (différents code MIME), par exemple PDF, il obtiendra, par différence, les trois premiers caractères de la clé. Si ces derniers sont appliqués au fichier txt (sans en-tête MIME), il découvrira les trois premiers caractères du texte en clair.
Connaissant les 3 premiers caractères du texte, il peut parfois prévoir le quatrième (si le texte est en français intelligible) et donc le 4ème élément de la clé - et déterminer le quatrième élément du pdf.


PC fixe sous Bionic 64 bits et portable avec Focal 64 bits

Hors ligne

#13 Le 11/02/2019, à 15:42

mandeb

Re : crypto, masque jetable, python

Oui tout à fait d'accord (cf #1 du fil). C'est le principe même du "masque jetable", une clé ne doit servir qu'une seule fois.
J'ai fait ça uniquement pour des envois ponctuels par mail (photos en jpg le plus souvent), il est clair que pour du "gros débit" ça ne convient pas.

Hors ligne

#14 Le 11/02/2019, à 17:13

mandeb

Re : crypto, masque jetable, python

un autre doute levé : le sha256 retourne 64 digits hexadécimaux, rien ne prouve que seed utilise les 64 (il pourrait tronquer à 3, 8, 16,32, 50 ....). Eh bien si, les 64 sont utilisés, j'ai testé les 64 sous-chaines possibles et elles retournent toutes une série différente. Y-a-t-il plus d'entropie avec 64 digits qu'avec 3 pour seed ? Le bon sens dirait oui, mais...c'est pas mathématique le bon sens big_smile
juré, j'arrête là...
merci pour votre attention.

Hors ligne

#15 Le 11/02/2019, à 17:22

Nuliel

Re : crypto, masque jetable, python

Ca dépend pas forcément du nombre de digits l'entropie mais c'est le degré de désorganisation.

[HS]Lorsqu'on comprend bien une propriété mathématique, on peut l'expliquer soi même et mettre des mots sur une formule dégueu:
sin(x)= https://wikimedia.org/api/rest_v1/media … ae06b901e3 (flemme de recopier), ça veut simplement dire: la fonction sinus en 0 ressemble à une fonction polynôme (plus simple à étudier) plus un petit truc négligeable[/HS]

Dernière modification par Nuliel (Le 11/02/2019, à 17:24)

Hors ligne

#16 Le 25/02/2019, à 17:42

mandeb

Re : crypto, masque jetable, python

Malgré ce que j'ai pu écrire précédemment, je reprends ce fil juste pour faire part que quelques réflexions complémentaires qui pourraient être utiles à ceux que ça intéresse.

- Dans une étape précédente on évoquait le salage du mot de passe pour éviter une attaque par dictionnaire, c'est toujours vrai mais ne s'applique pas dans mon contexte : si un attaquant possède la valeur du seed, c'est mort pour le chiffré. Aucun intérêt pour lui de tenter "remonter" vers le mot de passe puisqu'il peut déchiffrer directement. Par contre si la transmission du mot de passe est compromise, le salage retrouve son intérêt puisque ignorant le sel il lui sera impossible de trouver la bonne valeur de seed. Protection complémentaire mais très faible car la méthode de salage figure en clair dans le script python, or il est admis que la solidité d'un système de chiffrage ne repose pas sur la technique utilisée mais sur les clés.

- En explorant (un peu) le domaine des générateurs pseudo-aléatoire je suis "tombé" sur le module numpy qui est mieux documenté sur le seed qu'il utilise. La valeur max de graine admise est un entier de 32 bits de valeur max 2**32-1. J'ignore si le module random de python (2.7 dans mon cas, car usage de wx en GUI) repose sur les même sources, mais il est presque certain qu'un sha256 est inutile, un md5 sera largement suffisant.

- En posant cette question de seed sur un autre forum de maths, un certain Yoshi (merci encore à lui), m'a aiguillé vers un wiki très intéressant sur la génération de séries pseudo-aléatoire en utilisant python.
voici le lien pour ceux qui voudraient creuser : http://python.jpvweb.com/python/mesrece … enalea_bbs
En passant j'y ai découvert que le protocole de transmission d'une valeur de seed avec un chiffré était connue depuis longtemps !....

Du coup, comme le printemps approche, je vais pouvoir retourner à mes carottes au jardin et ranger (provisoirement) mon chapeau melon et mes bottes de cuir  wink

[edit]
2**32-1 = 4,3 milliard de seeds possibles. Avec les puissances de calculs disponibles aujourd'hui une attaque en force brute avec tous les seeds possibles reste pensable, bref pas si sûr ce truc !
[edit]

Dernière modification par mandeb (Le 25/02/2019, à 18:35)

Hors ligne

#17 Le 25/02/2019, à 17:54

Nuliel

Re : crypto, masque jetable, python

Je ne connaissais pas cette méthode de génération de nombres pseudo aléatoires, merci pour le partage!

Hors ligne