2009-01-18 20:48:28 +00:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2009-04-30 08:34:14 +00:00
< html lang = "fr-fr" > < head >
2009-01-18 20:48:28 +00:00
< meta content = "text/html;charset=ISO-8859-1" http-equiv = "Content-Type" >
< link rel = "stylesheet" type = "text/css" href = "cryptafinity.css" >
2009-04-30 08:34:14 +00:00
< title > CryptAfinity< / title > < meta content = "Glenn ROLLAND" name = "author" > < / head >
2009-01-18 20:48:28 +00:00
< body style = "direction: ltr;" >
< div style = "text-align: justify;" class = "page code" >
< h1 > CryptAfinity< / h1 >
< ol >
< li > < a href = "#1._Description" > Description< / a > < / li >
< ol >
< li > < a href = "#1.1._Auteurs" > Auteurs< / a > < / li >
< / ol >
< li > < a href = "#2._Pr%E9-requis" > Pré -requis< / a > < / li >
< ol >
< li > < a href = "#2.1._Sur_un_syst%E8me_Debian_GNULinux" > Sur un
systè me Debian GNU/Linux< / a > < / li >
< li > < a href = "#2.2._Sur_un_syst%E8me_Apple_MacOS_X_" > Sur un
systè me Apple MacOSX (≥ 10.3)< / a > < / li >
< li > < a href = "#2.3._Sur_un_syst%E8me_Microsoft_Windows" > Sur
un systè me Microsoft Windows< / a > < / li >
< / ol >
< li > < a href = "#3._Se_procurer_MiniFTPc" > Se procurer
CryptAfinity< / a > < / li >
< li > < a href = "#4._Utiliser_MiniFTPc" > Utiliser CryptAfinity< / a > < / li >
< ol >
< li > < a href = "#4.1._Compilation" > Compilation< / a > < / li >
< li > < a href = "#4.2._Utilisation" > Utilisation< / a > < / li >
< / ol >
< li > < a href = "#5._Documentation" > Documentation< / a > < / li >
2009-04-30 08:34:14 +00:00
< ol >
< li > < a href = "#5.1._Code" > Code< / a > < / li >
< li > < a href = "#5.2._Principe_du_d%E9codeur_Afine" > Dé codeur "Afine"< / a > < / li >
< li > < a href = "#5.3._Principe_du_d%E9codeur_Vigen%E8re" > Dé codeur "Vigenè re"< / a > < / li >
< / ol >
2009-01-18 20:48:28 +00:00
< / ol >
< h2 > < a name = "1._Description" > < / a > 1.
< a name = "Description" > < / a > Description< / h2 >
< p > CryptAfinity est un logiciel
libre permettant de dé chiffrer des texte
obfusqué s par des systè mes Afines ou l'algorithme
de Vigenè re. Il possè de les
caracté ristiques
suivantes :< / p >
< ul >
< li > Il est distribué
sous la licence < a href = "http://www.gnu.org/copyleft/gpl.html" > GNU
General Public License< / a > < / li >
< li > Il est
é crit en C++.< / li >
< li > Il
implé mente
pour l'instant uniquement une analyse par fré quences,
à partir d'une liste de "priorité s" de lettres
dans un texte clair, et de la proportion que repré sentent
les X premieres lettres "prioritaires" dans le texte.< / li >
< / ul >
< h3 > < span style = "font-weight: bold;" > < / span > 1.1.
Auteurs< / h3 >
< p > CryptAfinity a
é té entiè rement
2009-04-30 08:34:14 +00:00
ré alisé par Glenn ROLLAND < < a href = "mailto:glenux@fr.st" > glenux@fr.st< / a > > et Roland LAURÈ S < < a href = "mailto:shamox@mac.com" > shamox@mac.com< / a > >
2009-01-18 20:48:28 +00:00
à l'occasion de travaux pratiques du cours de systè me du
Master 2 Ingé nierie Informatique -
Systè mes, Ré seaux et Internet.< / p >
< h2 > < a name = "2._Pré-requis" > < / a > 2.
Pré -requis< / h2 >
< p > CryptAfinity
né cessite les bibliothè ques de fonctions
suivantes (dans
leur version de dé veloppement si compilez le programme
vous-mê me):< / p >
< ul >
< li > glib-2.0< / li >
< / ul >
< h3 > < a name = "2.1._Sur_un_système_Debian_GNULinux" > < / a > 2.1.
Sur un systè me
Debian GNU/Linux< / h3 >
< p > Il vous suffit de taper (en
tant qu'administrateur) les
commandes suivantes pour installer le né cessaire: < / p >
< p class = "code" > # apt-get
install libglib-2.0-dev< / p >
< h3 > < a name = "2.2._Sur_un_système_Apple_MacOS_X_" > < / a > 2.2.
Sur un systè me Apple MacOS X (> = 10.3)< / h3 >
< p >
Il est né cessaire d'avoir installé < span style = "font-style: italic;" > < / span > les < span style = "font-style: italic;" > autotools< / span >
(automake, autoconf...) dans leur derniè re
version. À partir de là , il suffit de
taper les commandes suivantes dans un terminal :< / p >
< p class = "code" > # sudo fink
install glib2-dev< / p >
< h3 > < a name = "2.3._Sur_un_système_Microsoft_Windows" > < / a > 2.3.
Sur un systè me Microsoft Windows< / h3 >
Cela ne fut pas (encore) testé , mais il est trè s
probable que cela fonctionne sous Cygwin.< br >
< h2 > < a name = "3._Se_procurer_MiniFTPc" > < / a > 3.
Se procurer CryptAfinity< / h2 >
< p >
Vous
pouvez té lé charger la derniè re archive
des
sources, ou bien directement la version la plus ré cente du
projet sur le dé pô t Subversion du projet.< / p >
< h3 > 3.1. L'archive des sources< / h3 >
< p >
Elle est disponible à l'adresse : < / p >
< a href = "http://glenux2.free.fr/pub/projets/CryptAfinity/archives/" > http://glenux2.free.fr/pub/projets/CryptAfinity/archives/< / a > < br >
< h3 > 3.2. Le
dé pô t Subversion< / h3 >
< p > Afin d'obtenir les sources les
plus à jour, vous pouvez utiliser le logiciel de
contrô le de sources Subversion < / p >
< p class = "code" > $ svn
checkout http://repository.glenux.ath.cx/svn/CryptAfinity/< / p >
< p > Il n'y a pas de mot de passe,
il suffit donc de presser la touche
"Entré e" pour l'utilisateur "anonymous", si ce dernier vous
est
demandé .< / p >
< h2 > < a name = "4._Utiliser_MiniFTPc" > < / a > 4.
Utiliser CryptAfinity< / h2 >
< h3 > < a name = "4.1._Compilation" > < / a > 4.1.
Compilation< / h3 >
< p > Commencez par
dé compressez l'archive.< / p >
< p class = "code" > $ tar -xzvf
CryptAfinity-0.1.tar.gz< / p >
< p > Rendez vous ensuite dans le
dossier qui vient d'ê tre cré é lors de
la dé compression.< / p >
< p class = "code" > $ cd
CryptAfinity-0.2< / p >
< p > Puis lancez
l'auto-configuration du logiciel, puis la compilation.< / p >
< p class = "code" > $ ./autogen< br >
$ ./configure< br >
$ make< / p >
< p > Le programme sous forme binaire
se trouvera alors dans le sous-dossier < span class = "code" > src/tools/< / span > ,
sous le nom < span class = "code" > break_afinity< / span > < / p >
< h3 > < a name = "4.2._Utilisation" > < / a > 4.2.
Utilisation< / h3 >
< p >
CryptAfinity né cessite de nombreux paramè tres, avec la
syntaxe suivante:< / p >
< p class = "code" > Usage:
break_afinity -a < fichier> -e < float> -f
< float> -p < fichier> -t
< fichier> -m < br >
< / p >
< p >
Où les paramè tres sont les
suivants: < / p >
< table style = "text-align: left; width: 100%;" border = "0" cellpadding = "2" cellspacing = "2" >
< tbody >
< tr >
< td > -a, --alphabet
< file> < / td >
< td > Fichier contenant les
lettres de l'alphabet, dans l'ordre.< / td >
< / tr >
< tr >
< td > < br >
-e, --epsilon < float> < / td >
< td > Tolerance pour le test
des clefs.< / td >
< / tr >
< tr >
< td > -f, --frequencies
< float> < / td >
< td > Proportion moyenne que
repré sentent les 9 lettres "prioritaires" dans le texte
clair.< / td >
< / tr >
< tr >
< td > -k, --keylength
< int> < / td >
< td > Taille de la clef
maximul (obsolè te)< / td >
< / tr >
< tr >
< td > -p, --priorities
< file> < / td >
< td > Lettres
ordonné es par fré quence dé croissante
d'apparition dans le texte clair.< / td >
< / tr >
< tr >
< td > -t, --text
< file> < / td >
< td > Fichier contenant le
texte chiffré .< / td >
< / tr >
< tr >
< td > -m, --mode < a|v> < / td >
< td > Selection du mode "Afine" ou "Vigenè re"< / td >
< / tr >
< / tbody >
< / table >
< h2 > < a name = "5._Documentation" > < / a > 5.
Documentation< / h2 >
2009-04-30 08:34:14 +00:00
< h3 > < a name = "5.1._Code" > < / a > 5.1. Code< / h3 >
2009-01-18 20:48:28 +00:00
< p > Vous pouvez trouver la documentation du code de CryptAfinity dans le
dossier < span class = "code" > doc/html< / span >
de l'application, ou en suivant < a href = "html/index.html" > ce lien< / a > .< / p >
2009-04-30 08:34:14 +00:00
< h3 > < a name = "5.2._Principe_du_décodeur_Afine" > < / a > 5.2. Principe du "dé codeur Afine"< / h3 >
2009-01-18 20:48:28 +00:00
< p > On gé nè re l'espace des clefs possibles pour l'alphabet donné en entré e:< / p >
< p class = "code" > int alpha_size; //taille de l'alphabet< br >
std::list< int> orb; // nombre premiers avec alpha_size< br >
MathTools mt; // bibliotheque d'outils mathé matiques< br >
std::list< KeyAfine> keyList;< br >
std::list< int> ::iterator orbIt;< / p >
< p class = "code" > for (i=1; i< alpha_size; i++){< br >
if (mt.pgcd(i, alpha_size) == 1) {< br >
orb.push_back(i);< br >
}< br >
}< br >
// 1 - gé né rer l'espace des 312 clefs< br >
for (orbIt = orb.begin(); orbIt != orb.end(); orbIt++){< br >
KeyAfine key;< br >
key.setCoefA((*orbIt));< br >
for (i=0; i< alpha_size; i++){< br >
key.setCoefB(i);< br >
keyList.push_back(key);< br >
}< br >
}< / p >
< p > Puis on fait une attaque par analyse de fré quence sur les textes
obtenus par "dé codage" du texte chiffré avec les clefs essayé es.< / p >
< p class = "code" > float frequencies; // fré quence cumulé e des 9 lettres les plus pré sentes< br >
float epsilon; // marge d'erreur< / p >
< p style = "text-align: left;" class = "code" > std::list< KeyAfine> ::iterator kLIt;< br >
for (kLIt = keyList.begin(); kLIt != keyList.end(); kLIt++){< br >
float score = 0;< br >
printf("Trying key %s\n", (*kLIt).toString().c_str());< br >
< br >
plainText = codec.decode(cypherText, *kLIt); < br >
plainText.setAlphabet(this-> _config.getAlphabet());< br >
for (int i=0; i< 9; i++){< br >
score += plainText.getCountOf(prio_conf[i]);< br >
}< br >
score = score / plainText.size();< br >
if (fabs(score - frequencies) < epsilon){< br >
printf("KEY = %s\n",(*kLIt).toString().c_str());< br >
printf("PLAIN TEXT(%f) = %s\n", fabs(score-frequencies),< br >
plainText.toAlphabet().c_str());< br >
}< br >
< br >
}< / p >
2009-04-30 08:34:14 +00:00
< h3 > < a name = "5.3._Principe_du_décodeur_Vigenère" > < / a > 5.3. Principe du "dé codeur Vigenè re"< / h3 >
< div style = "text-align: justify;" >
2009-01-18 20:48:28 +00:00
On commence par faire ré cupé rer les groupes de caratè res qui se ré pè tent dans le texte.< br >
2009-04-30 08:34:14 +00:00
2009-01-18 20:48:28 +00:00
< br >
2009-04-30 08:34:14 +00:00
Une fois les groupes ré pé té s de lettres de plus
grande longueur obtenus (dans l'ordre dé croissant en fonction de
la longueur), on calcule la distance
sé parant les deux premiers groupes (note d1) puis la distance
entre les deux suivant (d2). < br >
On pose K = PGCD(d1, d2). Il est fortement probable que K soit un
2009-01-18 20:48:28 +00:00
multiple de la longueur de la clef. L'hypothè se sous-jacente est
que ces groupes de lettres sont issue du chiffrement des mê mes
2009-04-30 08:34:14 +00:00
bouts de mots avec les mê mes bouts de la clef. Si le K = 1 on
peut raisonnablement supposer que ce n'est pas le cas, et qu'il n'y a pas de ré pé titions.< br >
2009-01-18 20:48:28 +00:00
< br >
L'é tape suivante consiste à faire une analyse de
2009-04-30 08:34:14 +00:00
fré quence en dé coupant le texte en K colonnes. On
classe ensuite les lettres apparaissant dans les colonnes en fonction
de leur nombre d'apparitions. < br >
Dans un monde utopique, il suffirait de calculer la distance entre la
lettre apparaissant le plus souvent dans la colonne, et celle
apparaissant le plus souvent dans le langage attendu pour le texte
clair (l'anglais en l'occurrence). < br >
Cependant il arrive fré quemment que l'ordre de lettre soit
lé gè rement changé par rapport au ré sultat
attendu. Dans le programme, on calcule donc pour chaque colonne les
distances entre les X lettres les plus fré quentes dans la
colonne et la lettre la plus fré quente dans le langage.< br >
On gé nè re ensuite un espace de X ^ K clefs a partir des
combinaisons de ces diffé rents dé calages obtenus sur
chaque colonne.< br >
2009-01-18 20:48:28 +00:00
< br >
2009-04-30 08:34:14 +00:00
Enfin, on dé code ensuite le texte avec chacune des clef
gé né ré es, et en fonction de donné es
statistiques
relative à notre connaissance pré alable du texte et d'une
petite marge d'erreur, on filtre les texte dé chiffré s.< br >
(Exemple: les 9 lettres les plus fré quentes repré sentent 70% du texte, et on une marge de +/- 4%). < br >
En jouant sur la marge d'erreur, on laisse passer plus ou moins de
textes dé chiffré s, parmi lesquels devrait se trouver le
texte clair attendu.< br >
2009-01-18 20:48:28 +00:00
2009-04-30 08:34:14 +00:00
< / div >
2009-01-18 20:48:28 +00:00
< / div >
2009-04-30 08:34:14 +00:00
< / body > < / html >