ehmicky
Salut,
Effectivement, ce qui m'intéresserait, c'est l'algo lui-même. J'ai lu plusieurs textes sur le sujet, avec notamment surtout des méthodes modifiant les coefficients DCT, et puis des améiorations pour résister à une attaque stéganalystique. Il y a une dizaine d'outils sur ce principe et plusieurs travaux de recherche. C'est intéressant parce que ça résiste un peu aux recompression/recadrages, etc.
Merci, tu peux décrire l'algo ou c'est trop long ?
magestik
Ca va pas du tout chercher aussi.
Déjà c'est quelque chose que j'ai complétement inventé (ça devait peut-être déjà exister), et comme je l'ai dit ça tient en même pas 200 ligne ... tout les programme en 200 lignes : lecture du texte dans une image (ou on avait déjà écrit), écriture (dans une nouvelle image) et saisie du texte qu'on veut mettre dans l'image.
Le principe est très simple : en fait j'ouvrais l'image en hexadécimal, à la fin je rajoutais un header (hexadécimal) JPEG (c'est ça dont je me rappelle plus exactement la séquence, mais je sais même pas si on est obligé de mettre ça.). Et après ce deuxième header tu mettre tout ce que tu veux, pas de problème. Moi je mettais du texte en clair, mais rien ne t'empêche de mettre du texte crypté (avec le cryptage que tu veux) ou même le binaire d'une archive (j'avais essayé et ça avait marché). J'ai essayé d'ouvrir l'image avec plusieurs logiciels : aucun problème l'image s'ouvre comme si de rien n'était.
Bon je pense que tu pensais à des choses beaucoup plus compliqué, mais cette méthode permet d'avoir quelque chose simple assez rapidement. Et pour peu que tu crypte ton texte comme il faut, alors pas de problème il devrait être illisible. Je m'y connais pas trop en cryptage, mais en C++ il doit pas manquer de lib pour faire ça. Après à toi de voir ce que tu veux faire.
Petit hors-sujet pour ceux que ça intéresse : le format MPO c'est en fait une deuxième image JPEG après une deuxième. Donc on a notre première image avec son header JPEG et quand elle est finie on a notre deuxième header JPEG suivi de l'image en elle même.
Si tu veux plus d'infos hésite pas 😉
Airballman
Tu aurais pu mettre un lien vers les sources direct histoire de se faire une idée ^^ :p
Airballman
Après ehmicky, si j'ai bien compris, en fait ce que tu cherches à faire est de rassembler toutes ces différentes méthodes dans un seul et même endroit et de mettre un joli empaquetage graphique par dessus 🙂 . Je me trompe?
magestik
Airballman> j'aurais pu, si je les avais mise en ligne. Mais quand j'ai écrit le message j'étais pas chez moi donc pas accès à mes fichiers.
Mais maintenant c'est bon, j'ai accès à mes fichiers. Voilà le code en question, du moins ce que j'en ai retrouvé :
import binascii
image = raw_input()
separateur = binascii.unhexlify('FFD8FFE1')
f = open(image,'rw')
files = f.read()
f.write(files + separateur + "TEXTE")
f.close()
ehmicky
Ok, en fait il s'agit de stégo par injection, c'est intéressant, merci je regardais par là aussi 🙂
Pour la crypto, la bibliothèque utilisera Crypto++ je pense. Les data sont par défaut chiffrées (AES, Blowfish, etc. ou chiffrement asymétrique) mais aussi compressées (zpaq) avant stégo. Le but secondaire aussi, c'est qu'une bouillie binaire est moins détectable par une analyse statistique 🙂
@Airballman : bah en fait plus j'y pense, plus mon but premier semble être la bibliothèque, après le GUI sera rapide à créer et secondaire. Sinon oui mon but principal est de permettre de développer de nouvelles méthodes pour la bibliothèques simplement par tout le monde, un peu comme ce que fait Crypto++. Mais je vais peut-être ne garder que les "meilleurs" de chaque catégorie plutôt que de tout mettre. Sinon, y'a aussi d'autres idées qui m'intéressent dans le projet, comme la deniable encryption, ou le fait d'utiliser la stégo par ordinateur pour utiliser la stégo "dans la vie réelle", par exemple création de phrases à mémoriser et à prononcer à voix haute, et qui contiennent un message caché, etc.
Je rêverais d'implémenter avec OpenCV et une bibliothèque de reconnaissance de caractères un truc du genre : j'encode le message "Meet at 5pm tmrw at Hall square" dans un texte annodin en modifiant légèrement la police de certaines lettres. J'imprime sur papier le texte annodin et le passe à mon destinataire. Celui-ci utilise la caméra de son smartphone qui via une reconnaissance de caractères + stego temps réel sur le message lu affiche le message caché sur le principe de la "réalité augmentée". Bon ok je délire un peu, je pense que j'aurai jamais les capacités de faire ça 😃 Ne rêvez pas 😃
Edit : pour ceux que le sujet intéresse, jetez un oeil au bouquin Hiding in plain sight (.pdf dispo, 350 pages 🙂 ), excellente introduction à la stégo, écrit par un ancien geek de la CIA, avec des geekeries mais aussi une contextualisation de la stégo par rapport à l'actualité : utilisation par les terroristes et les pédopornographes (et j'imagine qu'un jour viendra où la stego sera interdite en France, ce qui pourrait rendre la bibliothèque illégale) , montée en flèche de l'utilisation par les entreprises pour protéger les secrets industriels (et création d'un marché de la stégo), mais aussi de la stéganalyse, utilisation d'ebay (un tiers des photos contenant un message dissimulé selon l'auteur), etc.
Nasman
Je ne crois pas que le principe de reconnaissance de caractères soit très judicieux pour extraire les informations "cachées" d'un texte, comme un changement de police. Ce sera à envisagé quand les programmes de ROC sous Linux feront un "sans faute" sur des textes normaux (lettres et polices) - et pour les multiples polices existantes.
Travailler à partir d'un texte imprimé rajoutera en plus les imperfections de l'impression.
Airballman
ehmicky a écrit Celui-ci utilise la caméra de son smartphone qui via une reconnaissance de caractères + stego temps réel sur le message lu affiche le message caché sur le principe de la "réalité augmentée". Bon ok je délire un peu, je pense que j'aurai jamais les capacités de faire ça 😃 Ne rêvez pas 😃
Justement, je voulais t'envoyer un mail hier mais j'ai manqué de temps. Tu touches là exactement à la partie qui m'intéresse dans ton projet.
Je pense qu'il peut-être vraiment intéressant, par exemple au travers d'un mms contenant une photo prise par un smartphone, de chiffrer des données dedans et de les extraire à la sortie de manière transparente pour 'lutilisateur.
Je réfléchis à ça depuis un bon moment, et ça tombe plutôt pas mal que tu aies l'air de connaître plutôt bien le sujet . 🙂
Pour info, je suis ingé en traitement d'images. Donc je sais (globalement) développer et je peux éventuellement apporter de l'aide pour ce qui est de l'insertion dans un média "graphique".
Je suis donc ton projet de pr 😉, tiens nous au courant. Et is tu as une idée précise en tête et que tu te lances, contacte moi (menfin si tu veux ^^).
Airballman
Quand à insérer des messages cachés en modifiant des lettres (ou autre), ça me parait possible puisque si c'est bien fait on a pas besoin de s'appuyer sur des chose de type ROC. . . 🙂
Il suffit par exemple de modifier certaines caractéristiques physiques des lettres (j'ai plein d'idées qui viennent rien que d'y penser 😃 ) .
Opencv serait d'une grande aide pour aller vite la dedans (en plus il est porté sur Android a ce que je crois).
ehmicky
Bah en fait, je donnais l'exemple du changement de police juste pour illustrer, ça peut être plein d'autres choses : par exemple utiliser un dictionnaire de synonymes : à chaque apparition de "on", cela code un 0, à chaque apparition de "nous", cela code un "1", etc. C'est très trivial, susceptible aux attaques et permet d'encoder très peu d'infos, je pense qu'en lisant des sujets dessus, il doit y avoir mieux, je me suis juste pas encore penché sur le sujet.
Donc en fait, je suis content que ça t'enthousiasme. En fait, moi mon but, c'est d'offrir une API prêt à l'emploi. Tu n'as même pas besoin de connaître l'API en détail, les gens qui veulent implémenter une nouvelle méthode ont juste deux choses à manipuler :
- Hider.get() leur donne un void* pointant vers les data à dissimuler (déjà compressées et chiffrées), sous forme d'array d'octets (il n'a pas à se soucier de leur signification)
- ils disposent du chemin du fichier final à créer/remplacer sous forme de std::string.
Donc c'est simple d'écrire un nouveau module pour faire de la stego sur paquet TCP, ou tout autre sujet qui intéresse. Et puis je vais mettre sur Github et bien documenter avec Doxygen pour favoriser la collaboration.
Donc avant d'implémenter tes idées, il faut déjà que je fasse ce "socle", et je veux pas me précipiter dans le code. Pour l'instant je me documente sur la stego, il y a vraiment beaucoup beaucoup de documentation, avec des travaux de recherches, etc. et puis environ une centaine d'applis open-source dont je peux lire le source. Donc, c'est pourquoi je précise qu'il y aura rien avant septembre. C'est surtout ça, après y'a aussi quelques biblio que j'ai pas encore appris, par exemple peut-être une biblio de manipulation d'images, type Magick++ ou libpng, et puis aussi une biblio d'internationalisation, et surtout les bibliothèques Boost prévues pour la création de bibliothèques. Je veux essayer de bien penser le truc avant de me ruer sur le code.
Même si ça a pas l'air, j'ai déjà bien avancé, appris beaucoup de bibliothèques pour le projet, et ait une centaine de pages de fiches sur la stego. Ca fait en gros depuis novembre que je suis dessus, et d'ailleurs en ce moment, c'est tous les jours.
Airballman
Cool alors.
Tiens nous juste au jus 😉
ehmicky
Une des raisons aussi pour laquelle je me rue pas sur le code : il existe des dizaines de brevets déposés sur des techniques de stego (et certaines qui n'ont rien d'inventive, et qu'on peut copier sans le savoir), et toutes les applis proprios même sans brevet, je pense qu'elles peuvent faire un procès pour utilisation de l'idée de l'algo, même fortuite et avec une implémentation différente, non ??
Dans ce cas, ça veut dire rechercher à fond les brevets, et puis faire une recherche poussée sur les applis proprios existantes, et étudier les modifications faites au carrier avec un éditeur hexa pour essayer de deviner l'algo afin juste de pas la copier... non ?
C'est pour ça, ça va prendre un peu de temps ça.
Airballman
Je ne pense pas que tu aies besoin de vérifier tout ça. Ton logiciel sera gratuit, et n'entrera à priori pas en concurrence avec les brevets déjà déposés.
Sinon il n'y aurait plus aucune recherche nulle part :s.
Après tout, Windows a bien déposé le sudo, et c'est pas pour autant qu'on a arrêté de l'utiliser :p.
Par contre il peut-être bon en efet de s'interroger sur ce qui a été déposé, afin de ne pas faire exactement la même chose (j'entends quand les idées sont un peu exotiques ou poussées). Dans ce cas le plaggia est flagrant.
Imagine sinon, je me serais rué pour déposer le filtre de sobel et la racine carrée 😃 .
ehmicky
Bah j'espère que tu as raison.
Mais je crois que même sous licence libre, on a pas le droit de violer un brevet ? Ces questions me "turlutent" un peu.
Les brevets sur la stego sont hyper-vagues, c'est des véritables mines anti-personnel. Pour l'instant j'essaie de comprendre l'idée des algorithmes et en proposer une implémentation et une variation différente, mais pour ça faut que je fasse le tour des solutions existantes. De ce que je vois pour l'instant, il y en a environ 200, j'en suis à peu près au 70ème, bien que d'après le SARC (centre d'étude de la stego), il y en ait 725 🙂
Et puis c'est assez répétitif donc ça me simplifie le boulot, en gros 80% des outils existants tombent dans l'une de ces 4 catégories : modification du/des bit faible (.bmp, .wav, etc.) (50% à lui tout seul) ; modification du coefficient DCT (.jpg) ; modification de la table des couleurs (.gif et certains .bmp et .png) ; injection, par concaténation à la fin ou après les headers, etc.
Airballman
Chez moi turlute ca veut pas dire ca 😃, on dirait plutôt turlupine dans ton cas (enfin j'espère :p ).
Je suis surpris de ce que tu dis sur les brevets. Justement, je pensais le contraire.
Etant développeur d'algorithmes, je sais qu'il y a de fortes restrictions en matière de protection (justement pour ne pas se retrouver bloqué). C'est en train de devenir n'importe quoi mais bon . . .
Si tu en as sous la main, j'aimerais bien en lire 😉
D'autre part, si tu réutilise des codes qui ont déjà été développés par le passé en licence libre, tu n'as que peu de risques non ?
ehmicky
Oui oui je parle juste des brevets proprio. D'ailleurs, c'est tant mieux, car 50% des outils sont libres. Bah écoute j'espère que tu as raison, ça m'arrangerais bien 🙂 Bon de toute manière, pour l'instant, ça m'empêche pas de continuer à bosser dessus.
Euh effectivement, ça me turlupine !! 😃
Chaussette
bonjour ehmicky,
t' es tu fait kidnappé par le MSS, le Mossad ou la CIA !?
Je viens de lire ton post de Mars, tu avais l' air toujours aussi motivé. J' espère que ton projet avance toujours.
cordialement
ehmicky
Salut,
Mon PC est mort depuis mars ! Je devrais résoudre ce problème dans le mois qui suit, mais ne pourrait pas recommencer à coder avant début août. Mais mon problème principal vient du fait que je me suis fait volé mon DD avec le code + surtout la grosse documentation que j'ai faite (plusieurs mois de boulot, même quand mon PC était down) sur la stégo et la crypto. Or, j'ai une clef USB qui avait une backup encore pas trop vieille, mais cette clef a été bousillée par une noob de ma classe qui a fait je ne sais quoi avec sous Windows. Je suis actuellement en train d'essayer de récupérer tout ce travail effectué 🙁. Si tu veux m'aider, j'ai un poste
ici sur ce problème.
temps
Bonjours,
Depuis le début, je regarde ce fil et hésite. Bon à force, je lance l'idée bien que cela n'est peut-être pas efficace.
Comme je le dis depuis quelque temps, les sons que l'on entends sont en fait constitués de bruits sans importances. L'idée est tout simplement de remplir ces bruits sans importance par des messages.
Voila le principe, mettre un texte sans importance en ligne en format wav, l'oreil entendra exactement la même chose, mais si nous utilisons mon format audio, celui-ci va transformer tout cela en mode texte, il suffit de filtrer la petite partie qui permet de créer ce que nous entendons et ce qui reste pourra contenir des livres entiers qui pourront même contenir un codage de deuxième niveau.
Ca à l'air compliqué et très mal dit, mais en fait c'est très simple à réaliser.
En exemple d'application simple, chaque lettre représente un caractère sur les 65536 positions de l'amplitude d'un format wav cela ne représente rien, et quand cela est près de la médiane totalement inaudible. L'idée en d'envoyé un premier texte contenant toutes les zones mémoires, effets qui sont inaudibles avec la médiane au repos, soit la valeur 32768 pour l'amplitude. Ensuite il suffit d'envoyer le même texte audio contenant les messages ou autres dans les zones mémoires. Un simple comparateur équipée d'une clé de lecture (cela dépend combien de d'octets nous accordons par caractère) pour retrouver le document. Et cela en ayant deux fichiers wav à l'aspect totalement identique pesant le même poids, donnant le même son même avec l'appareil audio le plus sophistiqué, mais bien différent quand au contenu.
Cordialement
ehmicky
Premier message mis à jour,
Juste pour signaler que le projet continue, je suis dessus tous les jours 🙂
Là en ce moment, je suis en train de me plonger dans des ouvrages formels de crypto. Je veux maîtriser le côté crypto à fond. Dans ce qu'il me reste encore à ce stade :
- me plonger dans la cryptanalyse et la stéganalyse de manière plus forte (avec tout le côté lourd mathématique :s)
- étudier les codes source des outils de stego existants
- apprendre quelques bibliothèques de plus nécessaires au projet
Tout ça va prendre du temps, d'autant que j'ai une vie assez chargée à côté, mais j'y consacre l'essentiel de mon temps libre chaque jour.
J'ai déjà une idée du design générale de la bibliothèque, mais ça risque de changer au fil des lectures, donc pour l'instant ce qui me semble stable c'est la séparation de classes / actions principales traitant de : extraction / écriture du payload / carrier ; compression du payload ; chiffrement du payload ; stéganographie sur le carrier avec le payload.
L'un de mes buts originels étant la modularité, je vais utiliser des classes interfaces ou des templates (pas encore décidé) pour que chacune des actions principales puissent implémenter un ensemble de méthodes : plusieurs méthodes de compression ; de chiffrement ; de stego ; plusieurs types d'input et d'output. Cet ensemble pouvant évolué/être révisé/étendu sans casser la bibliothèque et de manière presque transparente pour l'utilisateur. Et tout en essayant d'éviter de pondre une usine à gaz 😃