La stéganographie

Éric Wegrzynowski

FIL - IEEA - Univ. Lille1

Journée de l’Enseignement de l’Informatique et de l’Algorithmique / Journées académiques IREM de Lille

08-09-10 février 2017

Introduction

Objectifs

  • découvrir la stéganographie
  • pas de théorie
  • que de la pratique
    • avec un ordinateur
    • avec ou sans programmation

Aperçu historique

L’esclave grec

Esclave au crâne rasé
Esclave au crâne rasé

L’abbé Trithemius

Johannes Trithemius (1462-1516) Polygraphiae ()

  • A = dans les cieux
  • B = à tout jamais
  • C = un monde sans fin
  • D = en une infinité

Le message stéganographie est caché dans le message mystique :

Dans son règne, enfin dans son royaume,
A perpétuité, durable,
Dans les cieux en paradis,
Toujours, durable,
Dans la félicité et dans les cieux,
Dans la divinité, sans cesse,
Irrévocablement et à perpétuité.

Corneille grossier ?

S’attacher au combat contre un autre soi-même,
Attaquer un parti qui prend pour défenseur
Le frère d’une femme et l’amant d’une sœur,
Et rompant tous ces nœuds, s’armer pour la patrie
Contre un sang qu’on voudrait racheter de sa vie,
Une telle vertu n’appartenait qu’à nous,
L’éclat de son grand nom lui fait peu de jaloux,

Lettre d’amour

Je suis très émue de vous dire que j'ai
bien compris l'autre soir que vous aviez
toujours une envie folle de me faire
danser. Je garde le souvenir de votre
baiser et je voudrais bien que ce soit
là une preuve que je puisse être aimée
par vous. Je suis prête à vous montrer mon
affection toute désintéressée et sans cal-
cul, et si vous voulez me voir aussi
vous dévoiler sans artifice mon âme
toute nue, venez me faire une visite.
Nous causerons en amis, franchement.
Je vous prouverai que je suis la femme
sincère, capable de vous offrir l'affection
la plus profonde comme la plus étroite
en amitié, en un mot la meilleure preuve
dont vous puissiez rêver, puisque votre
âme est libre. Pensez que la solitude où j'ha-
bite est bien longue, bien dure et souvent
difficile. Ainsi en y songeant j'ai l'âme
grosse. Accourrez donc vite et venez me la
faire oublier par l'amour où je veux me
mettre.

Micropoints

  • Technique utilisée durant la seconde guerre mondiale
  • et encore aujourd’hui
  • billet suisse (recto) billet suisse (verso) billet suisse (détail)

Nombre premier illégal

Nombre de 1401 chiffres :

485650789657397829309841894694286137707
442087351357924019652073668698513401047
237446968797439926117510973777701027447
528049058831384037549709987909653955227
011712157025974666993240226834596619606
034851742497735846851885567457025712547
499964821941846557100841190862597169479
707991520048667099759235960613207259737
979936188606316914473588300245336972781
813914797955513399949394882899846917836
100182597890103160196183503434489568705
384520853804584241565482488933380474758
711283395989685223254460840897111977127
694120795862440547161321005006459820176
961771809478113622002723448272249323259
547234688002927776497906148129840428345
720146348968547169082354737835661972186
224969431622716663939055430241564732924
855248991225739466548627140482117138124
388217717602984125524464744505583462814
488335631902725319590439283873764073916
891257924055015620889787163375999107887
084908159097548019285768451988596305323
823490558092032999603234471140776019847
163531161713078576084862236370283570104
961259568184678596533310077017991614674
472549272833486916000647585917462781212
690073518309241530106302893295665843662
000800476778967984382090797619859493646
309380586336721469695975027968771205724
996666980561453382074120315933770309949
152746918356593762102220068126798273445
760938020304479122774980917955938387121
000588766689258448700470772552497060444
652127130404321182610103591186476662963
858495087448497373476861420880529443

Code un fichier de programme C pour controuner les proctections sur les DVD (DeCSS).

void CSSdescramble(unsigned char *sec,unsigned char *key)
{
        unsigned int t1,t2,t3,t4,t5,t6;
        unsigned char *end=sec+0x800;

        t1=key[0]^sec[0x54]|0x100;
        t2=key[1]^sec[0x55];
        t3=(*((unsigned int *)(key+2)))^(*((unsigned int *)(sec+0x56)));
        t4=t3&7;
        t3=t3*2+8-t4;
        sec+=0x80;
        t5=0;
        while(sec!=end)
        {
                t4=CSStab2[t2]^CSStab3[t1];
                t2=t1>>1;
                t1=((t1&1)<<8)^t4;
                t4=CSStab5[t4];
                t6=(((((((t3>>3)^t3)>>1)^t3)>>8)^t3)>>5)&0xff;
                t3=(t3<<8)|t6;
                t6=CSStab4[t6];
                t5+=t6+t4;
                *sec++=CSStab1[*sec]^(t5&0xff);
                t5>>=8;
        }
}

void CSStitlekey1(unsigned char *key,unsigned char *im)
{
        unsigned int t1,t2,t3,t4,t5,t6;
        unsigned char k[5];
        int i;

        t1=im[0]|0x100;
        t2=im[1];
        t3=*((unsigned int *)(im+2));
        t4=t3&7;
        t3=t3*2+8-t4;
        t5=0;
        for(i=0;i<5;i++)
        {
                t4=CSStab2[t2]^CSStab3[t1];
                t2=t1>>1;
                t1=((t1&1)<<8)^t4;
                t4=CSStab4[t4];
                t6=(((((((t3>>3)^t3)>>1)^t3)>>8)^t3)>>5)&0xff;
                t3=(t3<<8)|t6;
                t6=CSStab4[t6];
                t5+=t6+t4;
                k[i]=t5&0xff;
                t5>>=8;
        }
        for(i=9;i>=0;i--)
                key[CSStab0[i+1]]=k[CSStab0[i+1]]^CSStab1[key[CSStab0[i+1]]]^key[CSStab0[i]];
}

void CSStitlekey2(unsigned char *key,unsigned char *im)
{
        unsigned int t1,t2,t3,t4,t5,t6;
        unsigned char k[5];
        int i;

        t1=im[0]|0x100;
        t2=im[1];
        t3=*((unsigned int *)(im+2));
        t4=t3&7;
        t3=t3*2+8-t4;
        t5=0;
        for(i=0;i<5;i++)
        {
                t4=CSStab2[t2]^CSStab3[t1];
                t2=t1>>1;
                t1=((t1&1)<<8)^t4;
                t4=CSStab4[t4];
                t6=(((((((t3>>3)^t3)>>1)^t3)>>8)^t3)>>5)&0xff;
                t3=(t3<<8)|t6;
                t6=CSStab5[t6];
                t5+=t6+t4;
                k[i]=t5&0xff;
                t5>>=8;
        }
        for(i=9;i>=0;i--)
                key[CSStab0[i+1]]=k[CSStab0[i+1]]^CSStab1[key[CSStab0[i+1]]]^key[CSStab0[i]];
}

void CSSdecrypttitlekey(unsigned char *tkey,unsigned char *dkey)
{
        int i;
        unsigned char im1[6];
        unsigned char im2[6]={0x51,0x67,0x67,0xc5,0xe0,0x00};
        
        for(i=0;i<6;i++)
                im1[i]=dkey[i];

        CSStitlekey1(im1,im2);
        CSStitlekey2(tkey,im1);
}

Challenge ANSSI

Logo de l’ANSSI
Logo de l’ANSSI
message caché
message caché

Définition de la stéganographie

  • Stéganographie = art de la dissimulation d’information.
  • composé de deux racines grecques στεγανός / steganós (« étanche ») et γραφή / graphế (« écriture »).

Applications de la stéganographie

  • recruter des gens (ANSSI) 😃
  • tatouage de documents (watermarking)

Cacher de l’information dans les textes

Sans encodage

  • Acrostiches (Corneille)
  • Une ligne sur deux du texte couverture (Sand)
  • Deuxième lettre de chaque mot du texte couverture
Pierre arrive de Smyrne
il vise Elise, alangui, seul 

En HTML

  • Très facile

  • mais pas robuste

La preuve !

Avec encodage binaire

  • En utilisant les espaces entre les mots
  • En exploitant les fins de ligne

Le codage binaire

Codage ASCII
Codage ASCII

Avec fins de ligne

  • existence de plusieurs marqueurs de fin de ligne
    • \n caractère de numéro 10 (Line Feed) : Unix, Mac OS X
    • \r\n caractères de numéro 13 (Carriage return) et 10 : Windows
  • \(\Rightarrow\) possibilité de coder un bit par ligne

Cacher dans certains fichiers

Concaténation de fichiers délimités

  • Certains fichiers sont délimités
  • \(\Rightarrow\) possibilité de cacher après le marqueur de fin

Insertion dans des zones

Le cas des PDF

  • Certains lecteurs de PDF tolérant
  • \(\Rightarrow\) possibilité de les utiliser pour lire des PDF cachés dans d’autres fichiers

Cacher dans des images

Codage des couleurs

  • Système RGB : un octet par couleur : Rouge Vert Bleu
  • \(256^3 = 16777216\) couleurs

Utilisation bits de poids faibles

Changements sur bits de poids faibles imperceptibles


\(\Rightarrow\) possibilité d’inclure bit(s) d’information par composante de couleur


  1. les probabilistes s’accordent à penser que, compte-tenu de la très faible probabilité de cet acrostiche, ce ne puisse être le fruit du hasard.

  2. l’authenticité de cette lettre est mise en doute : impossible par exemple de la retrouver dans la correspondance entre Sand et Musset publiée en 1904 et qu’on peut lire ici.