2012-08-14 22:39:57 +00:00
# CryptAffinity
2012-08-14 22:21:34 +00:00
## 1. Description
2012-08-14 22:39:57 +00:00
CryptAffinity est un logiciel libre permettant de déchiffrer des texte
obfusqués par des systemes Afines ou l'algorithme de Vigenere. Il possède les
caractéristiques suivantes :
2012-08-14 22:21:34 +00:00
* Il est distribue sous la licence [GNU General Public License ](http://www.gnu.org/copyleft/gpl.html )
2012-08-14 22:39:57 +00:00
* Il est écrit en C++.
* 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 premières lettres "prioritaires" dans le texte.
2012-08-14 22:21:34 +00:00
### 1.1. Auteurs
2012-08-14 22:39:57 +00:00
CryptAffinity a été concçu et realisé par Glenn ROLLAND
2012-08-14 22:21:34 +00:00
< [glenux@glenux.net](mailto:glenux@glenux.net)> et Roland LAURÈS
2012-08-14 22:39:57 +00:00
< [shamox@mac.com](mailto:shamox@mac.com)> à l'occasion de travaux pratiques du
cours de système du Master 2 Ingenierie Informatique - Systèmes, Reseaux et
2012-08-14 22:21:34 +00:00
Internet.
2012-08-14 22:39:57 +00:00
2012-08-14 22:21:34 +00:00
## 2. Pre-requis
2012-08-14 22:39:57 +00:00
CryptAffinity nécessite les bibliothèques de fonctions suivantes (dans leur
version de développement si compilez le programme vous-même):
2012-08-14 22:21:34 +00:00
* glib-2.0
2012-08-14 22:31:30 +00:00
2012-08-14 22:39:57 +00:00
### 2.1. Sur un système Debian GNU/Linux
2012-08-14 22:21:34 +00:00
Il vous suffit de taper (en tant qu'administrateur) les commandes suivantes
2012-08-14 22:39:57 +00:00
pour installer le nécessaire:
2012-08-14 22:21:34 +00:00
2012-08-14 22:44:06 +00:00
# apt-get install libglib-2.0-dev
2012-08-14 22:31:30 +00:00
2012-08-14 22:21:34 +00:00
2012-08-14 22:39:57 +00:00
### 2.2. Sur un système Apple MacOS X (>= 10.3)
2012-08-14 22:21:34 +00:00
2012-08-14 22:39:57 +00:00
Il est nécessaire d'avoir installé les autotools (automake,
autoconf...) dans leur dernière version. À partir de là, il
2012-08-14 22:21:34 +00:00
suffit de taper les commandes suivantes dans un terminal :
2012-08-14 22:44:06 +00:00
# sudo fink install glib2-dev
2012-08-14 22:31:30 +00:00
2012-08-14 22:21:34 +00:00
2012-08-14 22:39:57 +00:00
### 2.3. Sur un système Microsoft Windows
2012-08-14 22:21:34 +00:00
2012-08-14 22:39:57 +00:00
Cela ne fut pas testé, mais il est probable que cela
fonctionne sous Cygwin ou équivalent.
2012-08-14 22:21:34 +00:00
2012-08-14 22:39:57 +00:00
## 3. Se procurer CryptAffinity
2012-08-14 22:31:30 +00:00
2012-08-14 22:39:57 +00:00
Vous pouvez télécharger la version la plus récente du projet sur le depôt Git du projet.
2012-08-14 22:21:34 +00:00
2012-08-14 22:39:57 +00:00
Afin d'obtenir les sources, il vous suffit d'avoir Git installé sur votre système et de taper la commande suivante :
2012-08-14 22:21:34 +00:00
2012-08-14 22:44:06 +00:00
$ git clone https://github.com/glenux/cryptaffinity.git
2012-08-14 22:21:34 +00:00
2012-08-14 22:39:57 +00:00
## 4. Utiliser CryptAffinity
2012-08-14 22:21:34 +00:00
2012-08-14 22:31:30 +00:00
2012-08-14 22:21:34 +00:00
### 4.1. Compilation
2012-08-14 22:52:41 +00:00
Si vous avez téléchargé une archive, commencez par la décompressez :
2012-08-14 22:21:34 +00:00
2012-08-14 22:44:06 +00:00
$ tar -xzvf CryptAffinity-0.2.tar.gz
2012-08-14 22:21:34 +00:00
2012-08-14 22:31:30 +00:00
Rendez vous ensuite dans le dossier qui vient d'etre crée lors de la
2012-08-14 22:52:41 +00:00
décompression.
2012-08-14 22:21:34 +00:00
2012-08-14 22:44:06 +00:00
$ cd CryptAffinity-0.2
2012-08-14 22:21:34 +00:00
Puis lancez l'auto-configuration du logiciel, puis la compilation.
2012-08-14 22:44:06 +00:00
$ ./autogen
$ ./configure
$ make
2012-08-14 22:21:34 +00:00
Le programme sous forme binaire se trouvera alors dans le sous-dossier
2012-08-14 22:39:57 +00:00
src/tools/, sous le nom break_affinity
2012-08-14 22:21:34 +00:00
2012-08-14 22:31:30 +00:00
2012-08-14 22:21:34 +00:00
### 4.2. Utilisation
2012-08-14 22:39:57 +00:00
CryptAffinity necessite de nombreux parametres, avec la syntaxe suivante:
2012-08-14 22:21:34 +00:00
2012-08-14 22:47:13 +00:00
Usage: break_affinity -a < fichier > -e < float > -f < float > -p < fichier > -t < fichier > -m
2012-08-14 22:21:34 +00:00
Ou les parametres sont les suivants: & nbs
p_place_holder;
2012-08-14 22:45:56 +00:00
**-a**, ** --alphabet** _FILE_
2012-08-14 22:31:30 +00:00
: Fichier contenant les lettres de l'alphabet, dans l'ordre.
2012-08-14 22:21:34 +00:00
2012-08-14 22:45:56 +00:00
**-e**, ** --epsilon** _FLOAT_
2012-08-14 22:31:30 +00:00
: Tolerance pour le test des clefs.
2012-08-14 22:21:34 +00:00
2012-08-14 22:45:56 +00:00
**-f**, ** --frequencies** _FLOAT_
2012-08-14 22:39:57 +00:00
: Proportion moyenne que représentent les 9 lettres "prioritaires" dans le texte
2012-08-14 22:21:34 +00:00
clair.
2012-08-14 22:45:56 +00:00
**-k**, ** --keylength** _UINT_
2012-08-14 22:39:57 +00:00
: Taille de la clef maximum (obsolète)
2012-08-14 22:21:34 +00:00
2012-08-14 22:45:56 +00:00
**-p**, ** --priorities** _FILE_
2012-08-14 22:39:57 +00:00
: Lettres ordonnées par fréquence décroissante d'apparition dans le texte clair.
2012-08-14 22:21:34 +00:00
2012-08-14 22:45:56 +00:00
**-t**, ** --text** _FILE_
2012-08-14 22:31:30 +00:00
: Fichier contenant le texte chiffre.
2012-08-14 22:21:34 +00:00
2012-08-14 22:45:56 +00:00
**-m**, ** --mode** _MODE_
: Sélection du mode "Affine" (a) ou "Vigenere" (v)
2012-08-14 22:31:30 +00:00
2012-08-14 22:21:34 +00:00
## 5. Documentation
### 5.1. Code
2012-08-14 22:51:29 +00:00
Vous pouvez générer la documentation du code de CryptAffinity avec doxygen
et la consulter dans le dossier doc/html de l'application.
Pour ce faire, tapez :
$ doxygen doxygen.conf
2012-08-14 22:21:34 +00:00
2012-08-14 22:52:41 +00:00
### 5.2. Principe du "décodeur Affine"
2012-08-14 22:21:34 +00:00
2012-08-14 22:39:57 +00:00
On génère l'espace des clefs possibles pour l'alphabet donne
en entrée:
2012-08-14 22:21:34 +00:00
2012-08-14 22:44:06 +00:00
int alpha_size; //taille de l'alphabet
std::list< int > orb; // nombre premiers avec alpha_size
MathTools mt; // bibliotheque d'outils mathematiques
std::list< KeyAfine > keyList;
std::list< int > ::iterator orbIt;
for (i=1; i< alpha_size ; i + + ) {
if (mt.pgcd(i, alpha_size) == 1) {
orb.push_back(i);
}
}
// 1 - generer l'espace des 312 clefs
for (orbIt = orb.begin(); orbIt != orb.end(); orbIt++){
KeyAfine key;
key.setCoefA((*orbIt));
for (i=0; i< alpha_size ; i + + ) {
key.setCoefB(i);
keyList.push_back(key);
2012-08-14 22:31:30 +00:00
}
2012-08-14 22:44:06 +00:00
}
2012-08-14 22:21:34 +00:00
Puis on fait une attaque par analyse de frequence sur les textes obtenus par
2012-08-14 22:52:41 +00:00
"décodage" du texte chiffre avec les clefs essayees.
2012-08-14 22:21:34 +00:00
2012-08-14 22:44:06 +00:00
float frequencies; // frequence cumulee des 9 lettres les
plus presentes
float epsilon; // marge d'erreur
std::list< KeyAfine > ::iterator kLIt;
for (kLIt = keyList.begin(); kLIt != keyList.end(); kLIt++){
float score = 0;
printf("Trying key %s\n", (*kLIt).toString().c_str());
plainText = codec.decode(cypherText, *kLIt);
plainText.setAlphabet(this->_config.getAlphabet());
for (int i=0; i< 9 ; i + + ) {
score += plainText.getCountOf(prio_conf[i]);
}
score = score / plainText.size();
if (fabs(score - frequencies) < epsilon ) {
printf("KEY = %s\n",(*kLIt).toString().c_str());
printf("PLAIN TEXT(%f) = %s\n", fabs(score-frequencies),
plainText.toAlphabet().c_str());
}
}
2012-08-14 22:21:34 +00:00
2012-08-14 22:52:41 +00:00
### 5.3. Principe du "décodeur Vigenere"
2012-08-14 22:21:34 +00:00
2012-08-14 22:31:30 +00:00
On commence par détecter les groupes de carateres qui se repetent dans le
texte.
2012-08-14 22:21:34 +00:00
2012-08-14 22:52:41 +00:00
Une fois ces groupes repétes de lettres obtenus (dans l'ordre décroissant en
2012-08-14 22:31:30 +00:00
fonction de leur longueur), on calcule la distance separant les deux premiers
groupes (note d1) puis la distance entre les deux suivant (d2).
2012-08-14 22:21:34 +00:00
On pose K = PGCD(d1, d2). Il est fortement probable que K soit un multiple de
la longueur de la clef. L'hypothese sous-jacente est que ces groupes de
lettres sont issue du chiffrement des memes bouts de mots avec les memes 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 repetitions.
2012-08-14 22:31:30 +00:00
2012-08-14 22:52:41 +00:00
L'etape suivante consiste a faire une analyse de frequence en découpant le
2012-08-14 22:21:34 +00:00
texte en K colonnes. On classe ensuite les lettres
apparaissant dans les colonnes en fonction de leur nombre d'apparitions.
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).
Cependant il arrive frequemment que l'ordre de lettre soit legerement change
par rapport au resultat attendu. Dans le programme, on calcule donc pour
chaque colonne les distances entre les X lettres les plus frequentes dans la
colonne et la lettre la plus frequente dans le langage.
On genere ensuite un espace de X ^ K clefs a partir des combinaisons de ces
2012-08-14 22:52:41 +00:00
differents décalages obtenus sur chaque colonne.
2012-08-14 22:21:34 +00:00
2012-08-14 22:52:41 +00:00
Enfin, on décode ensuite le texte avec chacune des clef generees, et en
2012-08-14 22:21:34 +00:00
fonction de donnees statistiques relative a notre connaissance prealable du
2012-08-14 22:52:41 +00:00
texte et d'une petite marge d'erreur, on filtre les texte déchiffres.
2012-08-14 22:21:34 +00:00
(Exemple: les 9 lettres les plus frequentes representent 70% du texte, et on
une marge de +/- 4%).
En jouant sur la marge d'erreur, on laisse passer plus ou moins de textes
2012-08-14 22:52:41 +00:00
déchiffres, parmi lesquels devrait se trouver le texte clair attendu.
2012-08-14 22:21:34 +00:00