Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
unicode_comme_canal_steganographique [2014/03/14 14:04] Spawn Ajout de la section «Unicode comme vecteur de transport» |
unicode_comme_canal_steganographique [2017/04/09 15:33] (Version actuelle) |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ⚠͏ cette page utilise beaucoup de caractères que vous ne voyez potentiellement pas, n'hésitez pas à copier&coller dans un terminal du texte ''echo -n 'texte' | hd '' pour constater la présence d'octets invisibles ⚠͏ | ||
+ | |||
===== Qu'est-ce qu'Unicode ? ===== | ===== Qu'est-ce qu'Unicode ? ===== | ||
Ligne 62: | Ligne 64: | ||
00000000 43 d0 a1 |C..| | 00000000 43 d0 a1 |C..| | ||
- | === Les espaces === | + | ==== Les espaces ==== |
Un autre vecteur que les homoglyphes, moins fiable : les espaces : | Un autre vecteur que les homoglyphes, moins fiable : les espaces : | ||
Ligne 94: | Ligne 96: | ||
Le souci avec les espaces, c'est qu'ils ont des tailles variables, et qu'à moins d'être affichés dans un terminal, ils sont carrément visibles. (Sauf le discret U+00A0 « »). | Le souci avec les espaces, c'est qu'ils ont des tailles variables, et qu'à moins d'être affichés dans un terminal, ils sont carrément visibles. (Sauf le discret U+00A0 « »). | ||
+ | ==== Les caractères invisibles de combinaison ==== | ||
+ | |||
+ | Si les espaces peuvent poser problème parce qu'ils se mesurent, il existe des caractères unicode qui ne se voient pas par nature : | ||
+ | |||
+ | |||
+ | $ python -c 'print "a".join([unichr(i) for i in [0x034f,0x200c,0x200d]+range(0xfe00,0xfe10)])' | ||
+ | aaa︀a︁a︂a︃a︄a︅a︆a︇a︈a︉a︊a︋a︌a︍a︎a️ | ||
+ | |||
+ | aaa︀a︁a︂a︃a︄a︅a︆a︇a︈a︉a︊a︋a︌a︍a︎a️ | ||
+ | |||
+ | Il s'agit des caractères suivants : | ||
+ | |||
+ | U+034F COMBINING GRAPHEME JOINER | ||
+ | U+200C ZERO WIDTH NON-JOINER | ||
+ | U+200D ZERO WIDTH JOINER | ||
+ | U+FE00 VARIATION SELECTOR-1 | ||
+ | ... | ||
+ | U+FE0F VARIATION SELECTOR-16 | ||
+ | |||
+ | Les 16 premiers sont plutôt invisibles, car présents dans Unicode depuis sa version 3.2. | ||
+ | |||
+ | |||
+ | Les suivants ne son présents que depuis la 4.0, et ils sont rangés bien plus loin, de 0xE0100 à 0xE01EF : | ||
+ | |||
+ | $ python -c 'print "a".join([unichr(i) for i in range(0xe0100,0xe01f0)])' | ||
+ | a󠄁a󠄂a󠄃a󠄄a󠄅a󠄆a󠄇a󠄈a󠄉a󠄊a󠄋a󠄌a󠄍a󠄎a󠄏a󠄐a󠄑a󠄒a󠄓a󠄔a󠄕a󠄖a󠄗a󠄘a󠄙a󠄚a󠄛a󠄜a󠄝a󠄞a󠄟a󠄠a󠄡a󠄢a󠄣a󠄤a󠄥a󠄦a󠄧a󠄨a󠄩a󠄪a󠄫a󠄬a󠄭a󠄮a󠄯a󠄰a󠄱a󠄲a󠄳a󠄴a󠄵a󠄶a󠄷a󠄸a󠄹a󠄺a󠄻a󠄼a󠄽a󠄾a󠄿a󠅀a󠅁a󠅂a󠅃a󠅄a󠅅a󠅆a󠅇a󠅈a󠅉a󠅊a󠅋a󠅌a󠅍a󠅎a󠅏a󠅐a󠅑a󠅒a󠅓a󠅔a󠅕a󠅖a󠅗a󠅘a󠅙a󠅚a󠅛a󠅜a󠅝a󠅞a󠅟a󠅠a󠅡a󠅢a󠅣a󠅤a󠅥a󠅦a󠅧a󠅨a󠅩a󠅪a󠅫a󠅬a󠅭a󠅮a󠅯a󠅰a󠅱a󠅲a󠅳a󠅴a󠅵a󠅶a󠅷a󠅸a󠅹a󠅺a󠅻a󠅼a󠅽a󠅾a󠅿a󠆀a󠆁a󠆂a󠆃a󠆄a󠆅a󠆆a󠆇a󠆈a󠆉a󠆊a󠆋a󠆌a󠆍a󠆎a󠆏a󠆐a󠆑a󠆒a󠆓a󠆔a󠆕a󠆖a󠆗a󠆘a󠆙a󠆚a󠆛a󠆜a󠆝a󠆞a󠆟a󠆠a󠆡a󠆢a󠆣a󠆤a󠆥a󠆦a󠆧a󠆨a󠆩a󠆪a󠆫a󠆬a󠆭a󠆮a󠆯a󠆰a󠆱a󠆲a󠆳a󠆴a󠆵a󠆶a󠆷a󠆸a󠆹a󠆺a󠆻a󠆼a󠆽a󠆾a󠆿a󠇀a󠇁a󠇂a󠇃a󠇄a󠇅a󠇆a󠇇a󠇈a󠇉a󠇊a󠇋a󠇌a󠇍a󠇎a󠇏a󠇐a󠇑a󠇒a󠇓a󠇔a󠇕a󠇖a󠇗a󠇘a󠇙a󠇚a󠇛a󠇜a󠇝a󠇞a󠇟a󠇠a󠇡a󠇢a󠇣a󠇤a󠇥a󠇦a󠇧a󠇨a󠇩a󠇪a󠇫a󠇬a󠇭a󠇮a󠇯 | ||
+ | |||
+ | a󠄁a󠄂a󠄃a󠄄a󠄅a󠄆a󠄇a󠄈a󠄉a󠄊a󠄋a󠄌a󠄍a󠄎a󠄏a󠄐a󠄑a󠄒a󠄓a󠄔a󠄕a󠄖a󠄗a󠄘a󠄙a󠄚a󠄛a󠄜a󠄝a󠄞a󠄟a󠄠a󠄡a󠄢a󠄣a󠄤a󠄥a󠄦a󠄧a󠄨a󠄩a󠄪a󠄫a󠄬a󠄭a󠄮a󠄯a󠄰a󠄱a󠄲a󠄳a󠄴a󠄵a󠄶a󠄷a󠄸a󠄹a󠄺a󠄻a󠄼a󠄽a󠄾a󠄿a󠅀a󠅁a󠅂a󠅃a󠅄a󠅅a󠅆a󠅇a󠅈a󠅉a󠅊a󠅋a󠅌a󠅍a󠅎a󠅏a󠅐a󠅑a󠅒a󠅓a󠅔a󠅕a󠅖a󠅗a󠅘a󠅙a󠅚a󠅛a󠅜a󠅝a󠅞a󠅟a󠅠a󠅡a󠅢a󠅣a󠅤a󠅥a󠅦a󠅧a󠅨a󠅩a󠅪a󠅫a󠅬a󠅭a󠅮a󠅯a󠅰a󠅱a󠅲a󠅳a󠅴a󠅵a󠅶a󠅷a󠅸a󠅹a󠅺a󠅻a󠅼a󠅽a󠅾a󠅿a󠆀a󠆁a󠆂a󠆃a󠆄a󠆅a󠆆a󠆇a󠆈a󠆉a󠆊a󠆋a󠆌a󠆍a󠆎a󠆏a󠆐a󠆑a󠆒a󠆓a󠆔a󠆕a󠆖a󠆗a󠆘a󠆙a󠆚a󠆛a󠆜a󠆝a󠆞a󠆟a󠆠a󠆡a󠆢a󠆣a󠆤a󠆥a󠆦a󠆧a󠆨a󠆩a󠆪a󠆫a󠆬a󠆭a󠆮a󠆯a󠆰a󠆱a󠆲a󠆳a󠆴a󠆵a󠆶a󠆷a󠆸a󠆹a󠆺a󠆻a󠆼a󠆽a󠆾a󠆿a󠇀a󠇁a󠇂a󠇃a󠇄a󠇅a󠇆a󠇇a󠇈a󠇉a󠇊a󠇋a󠇌a󠇍a󠇎a󠇏a󠇐a󠇑a󠇒a󠇓a󠇔a󠇕a󠇖a󠇗a󠇘a󠇙a󠇚a󠇛a󠇜a󠇝a󠇞a󠇟a󠇠a󠇡a󠇢a󠇣a󠇤a󠇥a󠇦a󠇧a󠇨a󠇩a󠇪a󠇫a󠇬a󠇭a󠇮a󠇯 | ||
+ | |||
+ | |||
+ | |||
+ | ==== Un autre vecteur, les tags unicode ==== | ||
- | === Encore un autre vecteur, les tags unicode === | ||
Comme le fait habilement remarquer la page : [[http://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder]], le bloc 0xE0000 - 0xE007F contient des «Tags», plutôt invisibles, voyez-vous même : | Comme le fait habilement remarquer la page : [[http://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder]], le bloc 0xE0000 - 0xE007F contient des «Tags», plutôt invisibles, voyez-vous même : | ||
Ligne 101: | Ligne 134: | ||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | ||
- | Enfin, ça dépend de la police, voyez vous même : | + | Enfin, ça dépend de la police, voyez vous même : |
- | python3 -c 'print("A".join([chr(i) for i in range(0xe0000,0xe0080)]))'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA. | + | |
+ | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA. | ||
Ceux-ci ne sont pas forcément affichés de la même manière en fonction des navigateurs. | Ceux-ci ne sont pas forcément affichés de la même manière en fonction des navigateurs. | ||
On peut stocker 6 bits par tag avec le range ''[ 0xE0040 : 0xE0080 ]''. | On peut stocker 6 bits par tag avec le range ''[ 0xE0040 : 0xE0080 ]''. | ||
+ | |||
+ | ==== Les caractères coréens Hangûl ==== | ||
+ | |||
+ | Vous l'aurez peut-être remarqué, les caractères Hangûl sont organisés par morceaux : 쟪푫폁킟쵑즩왚쌄쁳뷛몥뛇담깘. | ||
+ | Il existe des méthodes d'organisation des caractères élémentaires pour en faire des gros (décrites ici : [[ https://en.wikipedia.org/wiki/Hangul#Morpho-syllabic_blocks ]] ), et certains caractères invisibles permettent de «remplir» la place manquante : | ||
+ | |||
+ | U+115F HANGUL CHOSEONG FILLER | ||
+ | U+1160 HANGUL JUNGSEONG FILLER | ||
+ | U+3164 HANGUL FILLER | ||
+ | U+FFA0 HALFWIDTH HANGUL FILLER | ||
+ | |||
+ | |||
+ | Cela dit, l'utilisation de ceux-ci peut déclencher un affichage plus large que d'ordinaire des caractères, aussi ils ne sont pas très utiles. | ||
+ | |||
+ | |||
+ | ==== Les caractères invisibles ==== | ||
+ | |||
+ | Invisibles par nature : | ||
+ | |||
+ | $ unicode invisible | grep ^U+ | ||
+ | U+2062 INVISIBLE TIMES | ||
+ | U+2063 INVISIBLE SEPARATOR | ||
+ | U+2064 INVISIBLE PLUS | ||
+ | |||
+ | $ python -c 'print ">"+"a".join([unichr(i) for i in [0x2062,0x2063,0x2064]])+"<"' | ||
+ | >aa< | ||
+ | |||
+ | Dans une autre police : >aa< | ||
===== Unicode comme transport de données ===== | ===== Unicode comme transport de données ===== | ||
Ligne 113: | Ligne 175: | ||
Plus de détails ici : [[https://github.com/qolund/u.brony.fr]] | Plus de détails ici : [[https://github.com/qolund/u.brony.fr]] | ||
- | - Une implémentation en javascript est displonible ici : [[u.brony.fr]] | + | |
- | - Une implémentation limitée en python ici : [[https://github.com/qolund/derp/blob/master/pathbin/unipack.py]] | + | * Une implémentation en javascript est displonible ici : [[http://u.brony.fr]] |
+ | * Une implémentation limitée en python ici : [[https://github.com/qolund/derp/blob/master/pathbin/unipack.py]] | ||
$ python -c 'import sys;sys.stdout.write("".join([chr(i) for i in xrange(256)]))' | unipack.py | $ python -c 'import sys;sys.stdout.write("".join([chr(i) for i in xrange(256)]))' | unipack.py | ||
𐀁𐐅𐘇𐰍𑀑𑈓𑐕𑘗𑠙𑨛𑰝𒀡𒈣𒐥𓀱𓈳𔑅𖡩𖹯𗁱𗉳𗑵𗙷𗡹𗩻𗱽𗹿𘂁𘊃𘒅𘚇𘢉𘪋𘲍𛂱𛊳𝃑𝋓𝓕𝛗𝣙𞋣𞓥🃱📵🛷$ | 𐀁𐐅𐘇𐰍𑀑𑈓𑐕𑘗𑠙𑨛𑰝𒀡𒈣𒐥𓀱𓈳𔑅𖡩𖹯𗁱𗉳𗑵𗙷𗡹𗩻𗱽𗹿𘂁𘊃𘒅𘚇𘢉𘪋𘲍𛂱𛊳𝃑𝋓𝓕𝛗𝣙𞋣𞓥🃱📵🛷$ |