Compare commits
5 commits
a332ca2257
...
1af22a49f6
Author | SHA1 | Date | |
---|---|---|---|
1af22a49f6 | |||
7caee47c91 | |||
5319941786 | |||
01a9be0449 | |||
f4f007042e |
58 changed files with 420 additions and 923 deletions
12
Makefile.am
12
Makefile.am
|
@ -2,13 +2,13 @@
|
||||||
demodir = demo
|
demodir = demo
|
||||||
|
|
||||||
demo_DATA = \
|
demo_DATA = \
|
||||||
demo/vigenere.txt \
|
demo/vigenere.txt \
|
||||||
demo/afine.txt \
|
demo/affine.txt \
|
||||||
demo/plaintext.txt \
|
demo/plaintext.txt \
|
||||||
demo/vigenere.2.txt \
|
demo/vigenere.2.txt \
|
||||||
demo/vigenere.3.txt
|
demo/vigenere.3.txt
|
||||||
|
|
||||||
SUBDIRS = src data doc
|
SUBDIRS = src data
|
||||||
|
|
||||||
|
|
||||||
EXTRA_DIST = INSTALL README doxygen.conf autogen \
|
EXTRA_DIST = INSTALL README doxygen.conf autogen \
|
||||||
|
|
244
README
244
README
|
@ -1,244 +0,0 @@
|
||||||
# CryptAffinity
|
|
||||||
|
|
||||||
## 1. Description
|
|
||||||
|
|
||||||
CryptAffinity est un logiciel libre permettant de déchiffrer des texte
|
|
||||||
obfusqués par des systemes Afines ou l'algorithme de Vigenère. Il possède les
|
|
||||||
caractéristiques suivantes :
|
|
||||||
|
|
||||||
* Il est distribue sous la licence [GNU General Public License](http://www.gnu.org/copyleft/gpl.html)
|
|
||||||
* 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.
|
|
||||||
|
|
||||||
### 1.1. Auteurs
|
|
||||||
|
|
||||||
CryptAffinity a été concçu et realisé par Glenn ROLLAND
|
|
||||||
<[glenux@glenux.net](mailto:glenux@glenux.net)> et Roland LAURÈS
|
|
||||||
<[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
|
|
||||||
Internet.
|
|
||||||
|
|
||||||
|
|
||||||
## 2. Pre-requis
|
|
||||||
|
|
||||||
CryptAffinity nécessite les bibliothèques de fonctions suivantes (dans leur
|
|
||||||
version de développement si compilez le programme vous-même):
|
|
||||||
|
|
||||||
* glib-2.0
|
|
||||||
|
|
||||||
|
|
||||||
### 2.1. Sur un système Debian GNU/Linux
|
|
||||||
|
|
||||||
Il vous suffit de taper (en tant qu'administrateur) les commandes suivantes
|
|
||||||
pour installer le nécessaire:
|
|
||||||
|
|
||||||
# apt-get install libglib-2.0-dev
|
|
||||||
|
|
||||||
|
|
||||||
### 2.2. Sur un système Apple MacOS X (>= 10.3)
|
|
||||||
|
|
||||||
Il est nécessaire d'avoir installé les autotools (automake,
|
|
||||||
autoconf...) dans leur dernière version. À partir de là, il
|
|
||||||
suffit de taper les commandes suivantes dans un terminal :
|
|
||||||
|
|
||||||
# sudo fink install glib2-dev
|
|
||||||
|
|
||||||
|
|
||||||
### 2.3. Sur un système Microsoft Windows
|
|
||||||
|
|
||||||
Cela ne fut pas testé, mais il est probable que cela
|
|
||||||
fonctionne sous Cygwin ou équivalent.
|
|
||||||
|
|
||||||
|
|
||||||
## 3. Se procurer CryptAffinity
|
|
||||||
|
|
||||||
Vous pouvez télécharger la version la plus récente du projet sur le depôt Git du projet.
|
|
||||||
|
|
||||||
Afin d'obtenir les sources, il vous suffit d'avoir Git installé sur votre système et de taper la commande suivante :
|
|
||||||
|
|
||||||
$ git clone https://github.com/glenux/cryptaffinity.git
|
|
||||||
|
|
||||||
|
|
||||||
## 4. Utiliser CryptAffinity
|
|
||||||
|
|
||||||
|
|
||||||
### 4.1. Compilation
|
|
||||||
|
|
||||||
Si vous avez téléchargé une archive, commencez par la décompressez :
|
|
||||||
|
|
||||||
$ tar -xzvf CryptAffinity-0.2.tar.gz
|
|
||||||
|
|
||||||
Rendez vous ensuite dans le dossier qui vient d'etre crée lors de la
|
|
||||||
décompression.
|
|
||||||
|
|
||||||
$ cd CryptAffinity-0.2
|
|
||||||
|
|
||||||
Puis lancez l'auto-configuration du logiciel, puis la compilation.
|
|
||||||
|
|
||||||
$ ./autogen
|
|
||||||
$ ./configure
|
|
||||||
$ make
|
|
||||||
|
|
||||||
Le programme sous forme binaire se trouvera alors dans le sous-dossier
|
|
||||||
src/tools/, sous le nom break_affinity
|
|
||||||
|
|
||||||
|
|
||||||
### 4.2. Utilisation
|
|
||||||
|
|
||||||
CryptAffinity necessite de nombreux parametres, avec la syntaxe suivante:
|
|
||||||
|
|
||||||
Usage: break_affinity -a <fichier> -e <float> -f <float> -p <fichier> -t <fichier> -m
|
|
||||||
|
|
||||||
Ou les parametres sont les suivants: &nbs
|
|
||||||
p_place_holder;
|
|
||||||
|
|
||||||
**-a**, **--alphabet** _FILE_
|
|
||||||
: Fichier contenant les lettres de l'alphabet, dans l'ordre.
|
|
||||||
|
|
||||||
**-e**, **--epsilon** _FLOAT_
|
|
||||||
: Tolerance pour le test des clefs.
|
|
||||||
|
|
||||||
**-f**, **--frequencies** _FLOAT_
|
|
||||||
: Proportion moyenne que représentent les 9 lettres "prioritaires" dans le texte
|
|
||||||
clair.
|
|
||||||
|
|
||||||
**-k**, **--keylength** _UINT_
|
|
||||||
: Taille de la clef maximum (obsolète)
|
|
||||||
|
|
||||||
**-p**, **--priorities** _FILE_
|
|
||||||
: Lettres ordonnées par fréquence décroissante d'apparition dans le texte clair.
|
|
||||||
|
|
||||||
**-t**, **--text** _FILE_
|
|
||||||
: Fichier contenant le texte chiffre.
|
|
||||||
|
|
||||||
**-m**, **--mode** _MODE_
|
|
||||||
: Sélection du mode "Affine" (a) ou "Vigenère" (v)
|
|
||||||
|
|
||||||
|
|
||||||
### 4.3. Exemples
|
|
||||||
|
|
||||||
Pour utiliser le décodeur Affine :
|
|
||||||
|
|
||||||
break_affinity -a data/alphabet.txt -f 0.7 -m a -p data/priority.txt \
|
|
||||||
-t demo/afine.txt -e 0.1
|
|
||||||
|
|
||||||
Pour utiliser le décodeur Vigenère :
|
|
||||||
|
|
||||||
break_afinity -a data/alphabet.txt -f 0.7 -m v -p data/priority.txt \
|
|
||||||
-t demo/vigenere.txt -e 0.05
|
|
||||||
|
|
||||||
|
|
||||||
## 5. Documentation
|
|
||||||
|
|
||||||
### 5.1. Code
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
### 5.2. Principe du "décodeur Affine"
|
|
||||||
|
|
||||||
On génère l'espace des clefs possibles pour l'alphabet donne
|
|
||||||
en entrée:
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Puis on fait une attaque par analyse de frequence sur les textes obtenus par
|
|
||||||
"décodage" du texte chiffre avec les clefs essayees.
|
|
||||||
|
|
||||||
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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
### 5.3. Principe du "décodeur Vigenère"
|
|
||||||
|
|
||||||
On commence par détecter les groupes de carateres qui se repetent dans le
|
|
||||||
texte.
|
|
||||||
|
|
||||||
Une fois ces groupes repétes de lettres obtenus (dans l'ordre décroissant en
|
|
||||||
fonction de leur longueur), on calcule la distance separant les deux premiers
|
|
||||||
groupes (note d1) puis la distance entre les deux suivant (d2).
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
L'etape suivante consiste a faire une analyse de frequence en découpant le
|
|
||||||
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 génère ensuite un espace de X ^ K clefs a partir des combinaisons de ces
|
|
||||||
differents décalages obtenus sur chaque colonne.
|
|
||||||
|
|
||||||
|
|
||||||
Enfin, on décode ensuite le texte avec chacune des clef génerees, et en
|
|
||||||
fonction de donnees statistiques relative a notre connaissance prealable du
|
|
||||||
texte et d'une petite marge d'erreur, on filtre les texte déchiffres.
|
|
||||||
|
|
||||||
(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
|
|
||||||
déchiffres, parmi lesquels devrait se trouver le texte clair attendu.
|
|
||||||
|
|
244
README.md
Normal file
244
README.md
Normal file
|
@ -0,0 +1,244 @@
|
||||||
|
# CryptAffinity
|
||||||
|
|
||||||
|
## 1. Description
|
||||||
|
|
||||||
|
CryptAffinity est un logiciel libre permettant de déchiffrer des texte
|
||||||
|
obfusqués par des systemes Affines ou l'algorithme de Vigenère. Il possède les
|
||||||
|
caractéristiques suivantes :
|
||||||
|
|
||||||
|
* Il est distribue sous la licence [GNU General Public License](http://www.gnu.org/copyleft/gpl.html)
|
||||||
|
* 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.
|
||||||
|
|
||||||
|
### 1.1. Auteurs
|
||||||
|
|
||||||
|
CryptAffinity a été concçu et realisé par Glenn ROLLAND
|
||||||
|
<[glenux@glenux.net](mailto:glenux@glenux.net)> et Roland LAURÈS
|
||||||
|
<[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
|
||||||
|
Internet.
|
||||||
|
|
||||||
|
|
||||||
|
## 2. Pre-requis
|
||||||
|
|
||||||
|
CryptAffinity nécessite les bibliothèques de fonctions suivantes (dans leur
|
||||||
|
version de développement si compilez le programme vous-même):
|
||||||
|
|
||||||
|
* glib-2.0
|
||||||
|
|
||||||
|
|
||||||
|
### 2.1. Sur un système Debian GNU/Linux
|
||||||
|
|
||||||
|
Il vous suffit de taper (en tant qu'administrateur) les commandes suivantes
|
||||||
|
pour installer le nécessaire:
|
||||||
|
|
||||||
|
# apt-get install libglib-2.0-dev
|
||||||
|
|
||||||
|
|
||||||
|
### 2.2. Sur un système Apple MacOS X (>= 10.3)
|
||||||
|
|
||||||
|
Il est nécessaire d'avoir installé les autotools (automake,
|
||||||
|
autoconf...) dans leur dernière version. À partir de là, il
|
||||||
|
suffit de taper les commandes suivantes dans un terminal :
|
||||||
|
|
||||||
|
# sudo fink install glib2-dev
|
||||||
|
|
||||||
|
|
||||||
|
### 2.3. Sur un système Microsoft Windows
|
||||||
|
|
||||||
|
Cela ne fut pas testé, mais il est probable que cela
|
||||||
|
fonctionne sous Cygwin ou équivalent.
|
||||||
|
|
||||||
|
|
||||||
|
## 3. Se procurer CryptAffinity
|
||||||
|
|
||||||
|
Vous pouvez télécharger la version la plus récente du projet sur le depôt Git du projet.
|
||||||
|
|
||||||
|
Afin d'obtenir les sources, il vous suffit d'avoir Git installé sur votre système et de taper la commande suivante :
|
||||||
|
|
||||||
|
$ git clone https://github.com/glenux/cryptaffinity.git
|
||||||
|
|
||||||
|
|
||||||
|
## 4. Utiliser CryptAffinity
|
||||||
|
|
||||||
|
|
||||||
|
### 4.1. Compilation
|
||||||
|
|
||||||
|
Si vous avez téléchargé une archive, commencez par la décompressez :
|
||||||
|
|
||||||
|
$ tar -xzvf CryptAffinity-0.2.tar.gz
|
||||||
|
|
||||||
|
Rendez vous ensuite dans le dossier qui vient d'etre crée lors de la
|
||||||
|
décompression.
|
||||||
|
|
||||||
|
$ cd CryptAffinity-0.2
|
||||||
|
|
||||||
|
Puis lancez l'auto-configuration du logiciel, puis la compilation.
|
||||||
|
|
||||||
|
$ ./autogen
|
||||||
|
$ ./configure
|
||||||
|
$ make
|
||||||
|
|
||||||
|
Le programme sous forme binaire se trouvera alors dans le sous-dossier
|
||||||
|
src/tools/, sous le nom break_affinity
|
||||||
|
|
||||||
|
|
||||||
|
### 4.2. Utilisation
|
||||||
|
|
||||||
|
CryptAffinity necessite de nombreux parametres, avec la syntaxe suivante:
|
||||||
|
|
||||||
|
Usage: break_affinity -a <fichier> -e <float> -f <float> -p <fichier> -t <fichier> -m
|
||||||
|
|
||||||
|
Ou les parametres sont les suivants: &nbs
|
||||||
|
p_place_holder;
|
||||||
|
|
||||||
|
**-a**, **--alphabet** _FILE_
|
||||||
|
: Fichier contenant les lettres de l'alphabet, dans l'ordre.
|
||||||
|
|
||||||
|
**-e**, **--epsilon** _FLOAT_
|
||||||
|
: Tolerance pour le test des clefs.
|
||||||
|
|
||||||
|
**-f**, **--frequencies** _FLOAT_
|
||||||
|
: Proportion moyenne que représentent les 9 lettres "prioritaires" dans le texte
|
||||||
|
clair.
|
||||||
|
|
||||||
|
**-k**, **--keylength** _UINT_
|
||||||
|
: Taille de la clef maximum (obsolète)
|
||||||
|
|
||||||
|
**-p**, **--priorities** _FILE_
|
||||||
|
: Lettres ordonnées par fréquence décroissante d'apparition dans le texte clair.
|
||||||
|
|
||||||
|
**-t**, **--text** _FILE_
|
||||||
|
: Fichier contenant le texte chiffre.
|
||||||
|
|
||||||
|
**-m**, **--mode** _MODE_
|
||||||
|
: Sélection du mode "Affine" (a) ou "Vigenère" (v)
|
||||||
|
|
||||||
|
|
||||||
|
### 4.3. Exemples
|
||||||
|
|
||||||
|
Pour utiliser le décodeur Affine :
|
||||||
|
|
||||||
|
break_affinity -a data/alphabet.txt -f 0.7 -m a -p data/priority.txt \
|
||||||
|
-t demo/affine.txt -e 0.1
|
||||||
|
|
||||||
|
Pour utiliser le décodeur Vigenère :
|
||||||
|
|
||||||
|
break_afinity -a data/alphabet.txt -f 0.7 -m v -p data/priority.txt \
|
||||||
|
-t demo/vigenere.txt -e 0.05
|
||||||
|
|
||||||
|
|
||||||
|
## 5. Documentation
|
||||||
|
|
||||||
|
### 5.1. Code
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
### 5.2. Principe du "décodeur Affine"
|
||||||
|
|
||||||
|
On génère l'espace des clefs possibles pour l'alphabet donne
|
||||||
|
en entrée:
|
||||||
|
|
||||||
|
int alpha_size; //taille de l'alphabet
|
||||||
|
std::list<int> orb; // nombre premiers avec alpha_size
|
||||||
|
MathTools mt; // bibliotheque d'outils mathematiques
|
||||||
|
std::list<KeyAffine> 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++){
|
||||||
|
KeyAffine key;
|
||||||
|
key.setCoefA((*orbIt));
|
||||||
|
for (i=0; i<alpha_size; i++){
|
||||||
|
key.setCoefB(i);
|
||||||
|
keyList.push_back(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Puis on fait une attaque par analyse de frequence sur les textes obtenus par
|
||||||
|
"décodage" du texte chiffre avec les clefs essayees.
|
||||||
|
|
||||||
|
float frequencies; // frequence cumulee des 9 lettres les
|
||||||
|
plus presentes
|
||||||
|
float epsilon; // marge d'erreur
|
||||||
|
std::list<KeyAffine>::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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
### 5.3. Principe du "décodeur Vigenère"
|
||||||
|
|
||||||
|
On commence par détecter les groupes de carateres qui se repetent dans le
|
||||||
|
texte.
|
||||||
|
|
||||||
|
Une fois ces groupes repétes de lettres obtenus (dans l'ordre décroissant en
|
||||||
|
fonction de leur longueur), on calcule la distance separant les deux premiers
|
||||||
|
groupes (note d1) puis la distance entre les deux suivant (d2).
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
L'etape suivante consiste a faire une analyse de frequence en découpant le
|
||||||
|
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 génère ensuite un espace de X ^ K clefs a partir des combinaisons de ces
|
||||||
|
differents décalages obtenus sur chaque colonne.
|
||||||
|
|
||||||
|
|
||||||
|
Enfin, on décode ensuite le texte avec chacune des clef génerees, et en
|
||||||
|
fonction de donnees statistiques relative a notre connaissance prealable du
|
||||||
|
texte et d'une petite marge d'erreur, on filtre les texte déchiffres.
|
||||||
|
|
||||||
|
(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
|
||||||
|
déchiffres, parmi lesquels devrait se trouver le texte clair attendu.
|
||||||
|
|
|
@ -16,21 +16,21 @@ dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
dnl
|
dnl
|
||||||
|
|
||||||
## Autoconf requirements
|
## Autoconf requirements
|
||||||
AC_INIT([CryptAfinity], [0.2], [glenux@fr.st])
|
AC_INIT([CryptAffinity], [0.2], [glenux@glenux.net])
|
||||||
AC_PREREQ(2.50)
|
AC_PREREQ(2.50)
|
||||||
|
|
||||||
AC_CANONICAL_HOST
|
AC_CANONICAL_HOST
|
||||||
AC_CANONICAL_TARGET
|
AC_CANONICAL_TARGET
|
||||||
|
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE([CryptAfinity],[0.2])
|
AM_INIT_AUTOMAKE([CryptAffinity],[0.2])
|
||||||
|
|
||||||
#AC_CANONICAL_SYSTEM
|
#AC_CANONICAL_SYSTEM
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AM_CONFIG_HEADER(src/config.h)
|
AM_CONFIG_HEADER(src/config.h)
|
||||||
AC_CONFIG_SRCDIR([src/lib/cryptafinity.hh])
|
AC_CONFIG_SRCDIR([src/lib/cryptaffinity.hh])
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
|
|
||||||
## information on the package
|
## information on the package
|
||||||
|
@ -128,7 +128,6 @@ AC_SUBST(GLIB2_LIBS)
|
||||||
#AC_SUBST(TARGET_HAVE_READLINE)
|
#AC_SUBST(TARGET_HAVE_READLINE)
|
||||||
|
|
||||||
AC_CONFIG_FILES([Makefile
|
AC_CONFIG_FILES([Makefile
|
||||||
doc/Makefile
|
|
||||||
data/Makefile
|
data/Makefile
|
||||||
src/Makefile
|
src/Makefile
|
||||||
src/lib/Makefile
|
src/lib/Makefile
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
|
|
||||||
cryptafinityhtmldir = $(docdir)/cryptafinity/html
|
|
||||||
|
|
||||||
cryptafinityhtml_DATA = \
|
|
||||||
html/index.html \
|
|
||||||
html/cryptafinity.css
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
|
||||||
$(cryptafinityhtml_DATA)
|
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
|
|
||||||
/* Generated by CaScadeS, a stylesheet editor for Mozilla Composer */
|
|
||||||
|
|
||||||
p.code { border: 2px dashed rgb(153, 153, 153);
|
|
||||||
padding: 5px;
|
|
||||||
background: rgb(204, 204, 204) none repeat scroll 0% 50%;
|
|
||||||
-moz-background-clip: initial;
|
|
||||||
-moz-background-origin: initial;
|
|
||||||
-moz-background-inline-policy: initial;
|
|
||||||
font-family: monospace;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen {
|
|
||||||
div.page { border: 2px dashed rgb(153, 153, 153);
|
|
||||||
padding: 10px;
|
|
||||||
top: 10px;
|
|
||||||
left: 10px;
|
|
||||||
right: 10px;
|
|
||||||
bottom: 10px;
|
|
||||||
margin-right: auto;
|
|
||||||
margin-left: auto;
|
|
||||||
background-color: rgb(255, 255, 255);
|
|
||||||
opacity: 1;
|
|
||||||
width: 60%;
|
|
||||||
font-family: Arial,Helvetica,sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
body { background-color: rgb(51, 51, 51);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
span.code { border: 1px dashed rgb(153, 153, 153);
|
|
||||||
background-color: rgb(204, 204, 204);
|
|
||||||
font-family: monospace;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,456 +0,0 @@
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
||||||
<html lang="fr-fr"><head>
|
|
||||||
|
|
||||||
|
|
||||||
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<link rel="stylesheet" type="text/css" href="cryptafinity.css">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<title>CryptAfinity</title><meta content="Glenn ROLLAND" name="author"></head>
|
|
||||||
|
|
||||||
<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>
|
|
||||||
<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>
|
|
||||||
|
|
||||||
|
|
||||||
</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
|
|
||||||
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>>
|
|
||||||
à 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>
|
|
||||||
|
|
||||||
<h3><a name="5.1._Code"></a>5.1. Code</h3>
|
|
||||||
|
|
||||||
<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>
|
|
||||||
|
|
||||||
<h3><a name="5.2._Principe_du_décodeur_Afine"></a>5.2. Principe du "décodeur Afine"</h3>
|
|
||||||
|
|
||||||
<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>
|
|
||||||
|
|
||||||
|
|
||||||
<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;">
|
|
||||||
On commence par faire récupérer les groupes de caratères qui se répètent dans le texte.<br>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
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
|
|
||||||
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
|
|
||||||
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>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
L'étape suivante consiste à faire une analyse de
|
|
||||||
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>
|
|
||||||
<br>
|
|
||||||
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>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</body></html>
|
|
|
@ -1,37 +1,37 @@
|
||||||
SUBDIRS = .
|
SUBDIRS = .
|
||||||
|
|
||||||
lib_LTLIBRARIES = libcryptafinity.la
|
lib_LTLIBRARIES = libcryptaffinity.la
|
||||||
|
|
||||||
#bin_PROGRAMS = libulm.o
|
#bin_PROGRAMS = libulm.o
|
||||||
|
|
||||||
libcryptafinity_la_SOURCES = alphabet.cpp \
|
libcryptaffinity_la_SOURCES = alphabet.cpp \
|
||||||
key.cpp \
|
key.cpp \
|
||||||
text.cpp \
|
text.cpp \
|
||||||
codec.cpp \
|
codec.cpp \
|
||||||
letter.cpp \
|
letter.cpp \
|
||||||
codec_afine.cpp \
|
codec_affine.cpp \
|
||||||
codec_vigenere.cpp \
|
codec_vigenere.cpp \
|
||||||
key_afine.cpp \
|
key_affine.cpp \
|
||||||
key_vigenere.cpp \
|
key_vigenere.cpp \
|
||||||
word_list.cpp \
|
word_list.cpp \
|
||||||
math_tools.cpp \
|
math_tools.cpp \
|
||||||
freq_analyser.cpp
|
freq_analyser.cpp
|
||||||
|
|
||||||
#libcryptafinity_la_SOURCES += cryptafinity_errors.hh \
|
#libcryptaffinity_la_SOURCES += cryptaffinity_errors.hh \
|
||||||
# cryptafinity_global.hh \
|
# cryptaffinity_global.hh \
|
||||||
# cryptafinity.hh \
|
# cryptaffinity.hh \
|
||||||
# cryptafinity_iface.hh \
|
# cryptaffinity_iface.hh \
|
||||||
# cryptafinity_proto.hh \
|
# cryptaffinity_proto.hh \
|
||||||
# XSock.hh
|
# XSock.hh
|
||||||
|
|
||||||
libcryptafinity_la_CFLAGS = -DTRACE -static
|
libcryptaffinity_la_CFLAGS = -DTRACE -static
|
||||||
libcryptafinity_la_LDFLAGS = -version-info 3:12:1
|
libcryptaffinity_la_LDFLAGS = -version-info 3:12:1
|
||||||
|
|
||||||
#INCLUDES= SQLITE3_CFLAGS@ \
|
#INCLUDES= SQLITE3_CFLAGS@ \
|
||||||
# LIBXMLPP_CFLAGS@ \
|
# LIBXMLPP_CFLAGS@ \
|
||||||
# -I./
|
# -I./
|
||||||
|
|
||||||
#libcryptafinity_a_LDFLAGS= @LDFLAGS@
|
#libcryptaffinity_a_LDFLAGS= @LDFLAGS@
|
||||||
|
|
||||||
#SQLITE3_LIBS@ LIBPCRE_LIBS@
|
#SQLITE3_LIBS@ LIBPCRE_LIBS@
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
#include "alphabet.hh"
|
#include "alphabet.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
|
|
||||||
Alphabet::Alphabet() : std::vector<std::string>() { }
|
Alphabet::Alphabet() : std::vector<std::string>() { }
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
#ifndef _LIBCRYPAFINITY_ALPHABET_HH
|
#ifndef _LIBCRYPAFFINITY_ALPHABET_HH
|
||||||
#define _LIBCRYPAFINITY_ALPHABET_HH
|
#define _LIBCRYPAFFINITY_ALPHABET_HH
|
||||||
|
|
||||||
|
|
||||||
#include "cryptafinity_global.hh"
|
#include "cryptaffinity_global.hh"
|
||||||
#include "cryptafinity_iface.hh"
|
#include "cryptaffinity_iface.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
class ReverseAlphabet: public std::map<std::string, int> {
|
class ReverseAlphabet: public std::map<std::string, int> {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
#include "codec.hh"
|
#include "codec.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
Codec::Codec(){
|
Codec::Codec(){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
#ifndef _LIBCRYPAFINITY_CODEC_HH
|
#ifndef _LIBCRYPAFFINITY_CODEC_HH
|
||||||
#define _LIBCRYPAFINITY_CODEC_HH
|
#define _LIBCRYPAFFINITY_CODEC_HH
|
||||||
|
|
||||||
|
|
||||||
#include "text.hh"
|
#include "text.hh"
|
||||||
#include "key.hh"
|
#include "key.hh"
|
||||||
#include "cryptafinity_global.hh"
|
#include "cryptaffinity_global.hh"
|
||||||
#include "cryptafinity_iface.hh"
|
#include "cryptaffinity_iface.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
class Codec {
|
class Codec {
|
||||||
private:
|
private:
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
|
||||||
#include "codec_afine.hh"
|
#include "codec_affine.hh"
|
||||||
#include "math_tools.hh"
|
#include "math_tools.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
CodecAfine::CodecAfine() : Codec() {
|
CodecAfine::CodecAfine() : Codec() {
|
||||||
}
|
}
|
||||||
|
|
23
src/lib/codec_affine.hh
Normal file
23
src/lib/codec_affine.hh
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
#ifndef _LIBCRYPAFFINITY_CODEC_AFINE_HH
|
||||||
|
#define _LIBCRYPAFFINITY_CODEC_AFINE_HH
|
||||||
|
|
||||||
|
#include "codec.hh"
|
||||||
|
#include "key_affine.hh"
|
||||||
|
|
||||||
|
#include "cryptaffinity_global.hh"
|
||||||
|
#include "cryptaffinity_iface.hh"
|
||||||
|
|
||||||
|
|
||||||
|
namespace LibCryptAffinity {
|
||||||
|
class CodecAfine : public Codec {
|
||||||
|
private:
|
||||||
|
public:
|
||||||
|
CodecAfine();
|
||||||
|
|
||||||
|
Text encode(Text t, KeyAfine k);
|
||||||
|
Text decode(Text t, KeyAfine k);
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,23 +0,0 @@
|
||||||
#ifndef _LIBCRYPAFINITY_CODEC_AFINE_HH
|
|
||||||
#define _LIBCRYPAFINITY_CODEC_AFINE_HH
|
|
||||||
|
|
||||||
#include "codec.hh"
|
|
||||||
#include "key_afine.hh"
|
|
||||||
|
|
||||||
#include "cryptafinity_global.hh"
|
|
||||||
#include "cryptafinity_iface.hh"
|
|
||||||
|
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
|
||||||
class CodecAfine : public Codec {
|
|
||||||
private:
|
|
||||||
public:
|
|
||||||
CodecAfine();
|
|
||||||
|
|
||||||
Text encode(Text t, KeyAfine k);
|
|
||||||
Text decode(Text t, KeyAfine k);
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
#include "codec_vigenere.hh"
|
#include "codec_vigenere.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
CodecVigenere::CodecVigenere() : Codec() {
|
CodecVigenere::CodecVigenere() : Codec() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
#ifndef _LIBCRYPAFINITY_CODEC_VIGENERE_HH
|
#ifndef _LIBCRYPAFFINITY_CODEC_VIGENERE_HH
|
||||||
#define _LIBCRYPAFINITY_CODEC_VIGENERE_HH
|
#define _LIBCRYPAFFINITY_CODEC_VIGENERE_HH
|
||||||
|
|
||||||
#include "codec.hh"
|
#include "codec.hh"
|
||||||
#include "key_vigenere.hh"
|
#include "key_vigenere.hh"
|
||||||
|
|
||||||
#include "cryptafinity_global.hh"
|
#include "cryptaffinity_global.hh"
|
||||||
#include "cryptafinity_iface.hh"
|
#include "cryptaffinity_iface.hh"
|
||||||
|
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
class CodecVigenere : public Codec {
|
class CodecVigenere : public Codec {
|
||||||
private:
|
private:
|
||||||
public:
|
public:
|
||||||
|
|
8
src/lib/cryptaffinity.hh
Normal file
8
src/lib/cryptaffinity.hh
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#ifndef _CRYPTAFFINITY_HH
|
||||||
|
#define _CRYPTAFFINITY_HH
|
||||||
|
|
||||||
|
#include "cryptaffinity_global.hh"
|
||||||
|
#include "cryptaffinity_iface.hh"
|
||||||
|
#include "cryptaffinity_proto.hh"
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef _CRYPTAFINITY_GLOBAL_HH
|
#ifndef _CRYPTAFFINITY_GLOBAL_HH
|
||||||
#define _CRYPTAFINITY_GLOBAL_HH
|
#define _CRYPTAFFINITY_GLOBAL_HH
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
4
src/lib/cryptaffinity_iface.hh
Normal file
4
src/lib/cryptaffinity_iface.hh
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#ifndef _CRYPTAFFINITY_IFACE_HH
|
||||||
|
#define _CRYPTAFFINITY_IFACE_HH
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef _CRYPTAFINITY_PROTO_HH
|
#ifndef _CRYPTAFFINITY_PROTO_HH
|
||||||
#define _CRYPTAFINITY_PROTO_HH
|
#define _CRYPTAFFINITY_PROTO_HH
|
||||||
|
|
||||||
#include "math_tools.hh"
|
#include "math_tools.hh"
|
||||||
#include "alphabet.hh"
|
#include "alphabet.hh"
|
||||||
|
@ -9,6 +9,6 @@
|
||||||
#include "freq_analyser.hh"
|
#include "freq_analyser.hh"
|
||||||
#include "codec.hh"
|
#include "codec.hh"
|
||||||
#include "codec_vigenere.hh"
|
#include "codec_vigenere.hh"
|
||||||
#include "codec_afine.hh"
|
#include "codec_affine.hh"
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -1,8 +0,0 @@
|
||||||
#ifndef _CRYPTAFINITY_HH
|
|
||||||
#define _CRYPTAFINITY_HH
|
|
||||||
|
|
||||||
#include "cryptafinity_global.hh"
|
|
||||||
#include "cryptafinity_iface.hh"
|
|
||||||
#include "cryptafinity_proto.hh"
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,4 +0,0 @@
|
||||||
#ifndef _CRYPTAFINITY_IFACE_HH
|
|
||||||
#define _CRYPTAFINITY_IFACE_HH
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
std::list<TextCounter> FreqAnalyser::getPriorities(Text text, int keylen, int column){
|
std::list<TextCounter> FreqAnalyser::getPriorities(Text text, int keylen, int column){
|
||||||
std::list<TextCounter> result;
|
std::list<TextCounter> result;
|
||||||
std::map<Text, int> counter;
|
std::map<Text, int> counter;
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
#ifndef _LIBCRYPTAFINITY_FREQANALYSER_HH
|
#ifndef _LIBCRYPTAFFINITY_FREQANALYSER_HH
|
||||||
#define _LIBCRYPTAFINITY_FREQANALYSER_HH
|
#define _LIBCRYPTAFFINITY_FREQANALYSER_HH
|
||||||
|
|
||||||
#include "cryptafinity_global.hh"
|
#include "cryptaffinity_global.hh"
|
||||||
#include "cryptafinity_iface.hh"
|
#include "cryptaffinity_iface.hh"
|
||||||
|
|
||||||
#include "text.hh" // body
|
#include "text.hh" // body
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
|
|
||||||
class FreqAnalyser {
|
class FreqAnalyser {
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
#include "key.hh"
|
#include "key.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
Key::Key() { }
|
Key::Key() { }
|
||||||
|
|
||||||
// std::string Key::toString() { }
|
// std::string Key::toString() { }
|
||||||
|
|
|
@ -4,10 +4,10 @@
|
||||||
|
|
||||||
//#include "text.hh"
|
//#include "text.hh"
|
||||||
|
|
||||||
//#include "cryptafinity_global.hh"
|
//#include "cryptaffinity_global.hh"
|
||||||
//#include "cryptafinity_iface.hh"
|
//#include "cryptaffinity_iface.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
class Key {
|
class Key {
|
||||||
private:
|
private:
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
|
|
||||||
#include "key_afine.hh"
|
#include "key_affine.hh"
|
||||||
|
|
||||||
#include "cryptafinity_global.hh"
|
#include "cryptaffinity_global.hh"
|
||||||
#include "cryptafinity_iface.hh"
|
#include "cryptaffinity_iface.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
|
|
||||||
int KeyAfine::getCoefA(){
|
int KeyAfine::getCoefA(){
|
||||||
return this->_a;
|
return this->_a;
|
|
@ -1,13 +1,13 @@
|
||||||
#ifndef _CRYPTAFINIY_KEYAFINE_HH
|
#ifndef _CRYPTAFINIY_KEYAFINE_HH
|
||||||
#define _CRYPTAFINIY_KEYAFINE_HH
|
#define _CRYPTAFINIY_KEYAFINE_HH
|
||||||
|
|
||||||
#include "cryptafinity_global.hh"
|
#include "cryptaffinity_global.hh"
|
||||||
#include "cryptafinity_iface.hh"
|
#include "cryptaffinity_iface.hh"
|
||||||
|
|
||||||
#include "key.hh" // declaration
|
#include "key.hh" // declaration
|
||||||
#include "text.hh" // body
|
#include "text.hh" // body
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
class KeyAfine : public Key {
|
class KeyAfine : public Key {
|
||||||
private:
|
private:
|
||||||
int _a;
|
int _a;
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
#include "key_vigenere.hh"
|
#include "key_vigenere.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
KeyVigenere::KeyVigenere() : Key(), Text() { // Key()
|
KeyVigenere::KeyVigenere() : Key(), Text() { // Key()
|
||||||
int i;
|
int i;
|
||||||
i=0;
|
i=0;
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
#ifndef _CRYPTAFINIY_KEYVIGENERE_HH
|
#ifndef _CRYPTAFINIY_KEYVIGENERE_HH
|
||||||
#define _CRYPTAFINIY_KEYVIGENERE_HH
|
#define _CRYPTAFINIY_KEYVIGENERE_HH
|
||||||
|
|
||||||
#include "cryptafinity_global.hh"
|
#include "cryptaffinity_global.hh"
|
||||||
#include "cryptafinity_iface.hh"
|
#include "cryptaffinity_iface.hh"
|
||||||
|
|
||||||
#include "text.hh"
|
#include "text.hh"
|
||||||
#include "key.hh"
|
#include "key.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
class KeyVigenere : public Key, public Text {
|
class KeyVigenere : public Key, public Text {
|
||||||
private:
|
private:
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "letter.hh"
|
#include "letter.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
|
|
||||||
Letter::Letter(const Letter &orig){
|
Letter::Letter(const Letter &orig){
|
||||||
this->_alphabet = orig._alphabet;
|
this->_alphabet = orig._alphabet;
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
#ifndef _LIBCRYPTAFINITY_LETTER_HH
|
#ifndef _LIBCRYPTAFFINITY_LETTER_HH
|
||||||
#define _LIBCRYPTAFINITY_LETTER_HH
|
#define _LIBCRYPTAFFINITY_LETTER_HH
|
||||||
|
|
||||||
#include "cryptafinity_global.hh"
|
#include "cryptaffinity_global.hh"
|
||||||
#include "cryptafinity_iface.hh"
|
#include "cryptaffinity_iface.hh"
|
||||||
|
|
||||||
#include "alphabet.hh"
|
#include "alphabet.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
class Letter {
|
class Letter {
|
||||||
private:
|
private:
|
||||||
Alphabet _alphabet;
|
Alphabet _alphabet;
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
#define DEBUG 1
|
#define DEBUG 1
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
|
|
||||||
int MathTools::pgcd(int a, int b){
|
int MathTools::pgcd(int a, int b){
|
||||||
int fa = a;
|
int fa = a;
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
#ifndef _LIBCRYPTAFINITY_MATHTOOLS_HH
|
#ifndef _LIBCRYPTAFFINITY_MATHTOOLS_HH
|
||||||
#define _LIBCRYPTAFINITY_MATHTOOLS_HH
|
#define _LIBCRYPTAFFINITY_MATHTOOLS_HH
|
||||||
|
|
||||||
#include "cryptafinity_global.hh"
|
#include "cryptaffinity_global.hh"
|
||||||
#include "cryptafinity_iface.hh"
|
#include "cryptaffinity_iface.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
|
|
||||||
class MathTools {
|
class MathTools {
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include "text.hh"
|
#include "text.hh"
|
||||||
|
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
bool TextCounter::operator< (TextCounter b){
|
bool TextCounter::operator< (TextCounter b){
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
if (this->_text.size() < b.getText().size()){
|
if (this->_text.size() < b.getText().size()){
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
#ifndef _LIBCRYPAFINITY_TEXT_HH
|
#ifndef _LIBCRYPAFFINITY_TEXT_HH
|
||||||
#define _LIBCRYPAFINITY_TEXT_HH
|
#define _LIBCRYPAFFINITY_TEXT_HH
|
||||||
|
|
||||||
#include "cryptafinity_global.hh"
|
#include "cryptaffinity_global.hh"
|
||||||
#include "cryptafinity_iface.hh"
|
#include "cryptaffinity_iface.hh"
|
||||||
|
|
||||||
#include "alphabet.hh"
|
#include "alphabet.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
class TextCounter;
|
class TextCounter;
|
||||||
|
|
||||||
class Text : public std::vector<int> {
|
class Text : public std::vector<int> {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
#include "word_list.hh"
|
#include "word_list.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
std::map<Text,int> WordList::getWordsContaining(int value){
|
std::map<Text,int> WordList::getWordsContaining(int value){
|
||||||
std::map<Text,int> result;
|
std::map<Text,int> result;
|
||||||
std::map<int, TextCounter>::iterator foundVal;
|
std::map<int, TextCounter>::iterator foundVal;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
#include "text.hh"
|
#include "text.hh"
|
||||||
|
|
||||||
namespace LibCryptAfinity {
|
namespace LibCryptAffinity {
|
||||||
class WordList {
|
class WordList {
|
||||||
private:
|
private:
|
||||||
std::map<Text, int> _word2int; // existance du mot
|
std::map<Text, int> _word2int; // existance du mot
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
./tools/break_afinity -a tests/alphabet.txt -f 0.7 -m a -p tests/priority.txt -t tests/afine.txt -e 0.1
|
./tools/break_affinity -a data/alphabet.txt -f 0.7 -m a -p data/priority.txt -t demo/affine.txt -e 0.1
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
./tools/break_afinity -a tests/alphabet.txt -f 0.7 -m v -p tests/priority.txt -t tests/vigenere.txt -e 0.05
|
./tools/break_affinity -a data/alphabet.txt -f 0.7 -m v -p data/priority.txt -t demo/vigenere.txt -e 0.05
|
||||||
|
|
|
@ -2,10 +2,10 @@
|
||||||
|
|
||||||
SUBDIRS = .
|
SUBDIRS = .
|
||||||
|
|
||||||
bin_PROGRAMS = break_afinity
|
bin_PROGRAMS = break_affinity
|
||||||
|
|
||||||
|
|
||||||
break_afinity_SOURCES = main.cpp ba_cmd.cpp ba_config.cpp file_loader.cpp ba_vigenere.cpp ba_afine.cpp
|
break_affinity_SOURCES = main.cpp ba_cmd.cpp ba_config.cpp file_loader.cpp ba_vigenere.cpp ba_affine.cpp
|
||||||
|
|
||||||
# ftp_client.cpp \
|
# ftp_client.cpp \
|
||||||
# ftp_client_cmd.cpp \
|
# ftp_client_cmd.cpp \
|
||||||
|
@ -13,7 +13,7 @@ break_afinity_SOURCES = main.cpp ba_cmd.cpp ba_config.cpp file_loader.cpp ba_vi
|
||||||
# miniftp.cpp \
|
# miniftp.cpp \
|
||||||
# server_msg.cpp
|
# server_msg.cpp
|
||||||
|
|
||||||
break_afinity_SOURCES += ba_cmd.hh breakafinity.hh breakafinity_global.hh breakafinity_iface.hh breakafinity_proto.hh file_loader.hh
|
break_affinity_SOURCES += ba_cmd.hh breakaffinity.hh breakaffinity_global.hh breakaffinity_iface.hh breakaffinity_proto.hh file_loader.hh
|
||||||
|
|
||||||
# ftp_config.hh \
|
# ftp_config.hh \
|
||||||
# miniftp_global.hh \
|
# miniftp_global.hh \
|
||||||
|
@ -32,6 +32,6 @@ INCLUDES= -I../lib/ -I./ @GLIB2_CFLAGS@
|
||||||
# libyalag.la
|
# libyalag.la
|
||||||
# miniftpc_INCLUDE = a
|
# miniftpc_INCLUDE = a
|
||||||
|
|
||||||
break_afinity_LDADD = -lcryptafinity @GLIB2_LIBS@
|
break_affinity_LDADD = -lcryptaffinity @GLIB2_LIBS@
|
||||||
break_afinity_LDFLAGS = @LDFLAGS@ -L../lib -L../lib/.libs
|
break_affinity_LDFLAGS = @LDFLAGS@ -L../lib -L../lib/.libs
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
|
|
||||||
#define DEBUG 1
|
#define DEBUG 1
|
||||||
|
|
||||||
namespace BreakAfinity {
|
namespace BreakAffinity {
|
||||||
|
|
||||||
void BreakAfinity::runAfine(){
|
void BreakAffinity::runAfine(){
|
||||||
MathTools mt;
|
MathTools mt;
|
||||||
CodecAfine codec;
|
CodecAfine codec;
|
||||||
FreqAnalyser fa;
|
FreqAnalyser fa;
|
|
@ -4,20 +4,20 @@
|
||||||
|
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
|
|
||||||
namespace BreakAfinity {
|
namespace BreakAffinity {
|
||||||
BreakAfinity::BreakAfinity(){
|
BreakAffinity::BreakAffinity(){
|
||||||
// on fixe la config par defaut
|
// on fixe la config par defaut
|
||||||
int i;
|
int i;
|
||||||
i=i+1;
|
i=i+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BreakAfinity::loadFiles(){
|
void BreakAffinity::loadFiles(){
|
||||||
printf("ALIVE !!!\n");
|
printf("ALIVE !!!\n");
|
||||||
this->_config.loadFiles();
|
this->_config.loadFiles();
|
||||||
printf("ALIVE ???\n");
|
printf("ALIVE ???\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void BreakAfinity::init(int argc, char **argv) {
|
void BreakAffinity::init(int argc, char **argv) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 1; i + 1 < argc; i = i + 2){
|
for (i = 1; i + 1 < argc; i = i + 2){
|
||||||
|
@ -60,7 +60,7 @@ namespace BreakAfinity {
|
||||||
printf("-a, --alphabet <file> Letters ordered by decreasing frequency\n");
|
printf("-a, --alphabet <file> Letters ordered by decreasing frequency\n");
|
||||||
printf("-e, --epsilon <float> Tolerance for the final key test\n");
|
printf("-e, --epsilon <float> Tolerance for the final key test\n");
|
||||||
printf("-f, --frequencies <float> Average frequencies for the 9 first letters\n");
|
printf("-f, --frequencies <float> Average frequencies for the 9 first letters\n");
|
||||||
printf("-m, --mode ( v | a ) Choose the kind of cypher : vigenere or afine.\n");
|
printf("-m, --mode ( v | a ) Choose the kind of cypher : vigenere or affine.\n");
|
||||||
printf("-p, --priorities <file> Letters ordered by decreasing frequency\n");
|
printf("-p, --priorities <file> Letters ordered by decreasing frequency\n");
|
||||||
printf("-t, --text <file> Cipher text to decipher\n");
|
printf("-t, --text <file> Cipher text to decipher\n");
|
||||||
//printf("-s, --popsize <int> Population size in each generation\n");
|
//printf("-s, --popsize <int> Population size in each generation\n");
|
||||||
|
@ -71,7 +71,7 @@ namespace BreakAfinity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BreakAfinity::run(){
|
void BreakAffinity::run(){
|
||||||
// vigenere ou affine ?
|
// vigenere ou affine ?
|
||||||
MathTools mt;
|
MathTools mt;
|
||||||
CodecVigenere codec;
|
CodecVigenere codec;
|
||||||
|
|
|
@ -1,20 +1,20 @@
|
||||||
#ifndef _BREAKAFINITY_CMD_HH
|
#ifndef _BREAKAFFINITY_CMD_HH
|
||||||
#define _BREAKAFINITY_CMD_HH
|
#define _BREAKAFFINITY_CMD_HH
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
#include "breakafinity.hh"
|
#include "breakaffinity.hh"
|
||||||
#include "ba_config.hh"
|
#include "ba_config.hh"
|
||||||
|
|
||||||
|
|
||||||
namespace BreakAfinity {
|
namespace BreakAffinity {
|
||||||
|
|
||||||
class BreakAfinity {
|
class BreakAffinity {
|
||||||
private:
|
private:
|
||||||
BreakerConfig _config;
|
BreakerConfig _config;
|
||||||
public:
|
public:
|
||||||
BreakAfinity();
|
BreakAffinity();
|
||||||
void init(int argc, char ** argv);
|
void init(int argc, char ** argv);
|
||||||
void loadFiles();
|
void loadFiles();
|
||||||
void run();
|
void run();
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include "ba_config.hh"
|
#include "ba_config.hh"
|
||||||
#include "file_loader.hh"
|
#include "file_loader.hh"
|
||||||
|
|
||||||
namespace BreakAfinity {
|
namespace BreakAffinity {
|
||||||
void BreakerConfig::setMode(char * m){
|
void BreakerConfig::setMode(char * m){
|
||||||
switch(m[0]){
|
switch(m[0]){
|
||||||
case 'v':
|
case 'v':
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef _BREAKAFINITY_CONFIG_HH
|
#ifndef _BREAKAFFINITY_CONFIG_HH
|
||||||
#define _BREAKAFINITY_CONFIG_HH
|
#define _BREAKAFFINITY_CONFIG_HH
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
@ -8,9 +8,9 @@
|
||||||
#include "alphabet.hh"
|
#include "alphabet.hh"
|
||||||
#include "text.hh"
|
#include "text.hh"
|
||||||
|
|
||||||
using namespace LibCryptAfinity;
|
using namespace LibCryptAffinity;
|
||||||
|
|
||||||
namespace BreakAfinity {
|
namespace BreakAffinity {
|
||||||
class BreakerConfig {
|
class BreakerConfig {
|
||||||
private:
|
private:
|
||||||
bool _modeVigenere;
|
bool _modeVigenere;
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
|
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
|
|
||||||
namespace BreakAfinity {
|
namespace BreakAffinity {
|
||||||
|
|
||||||
void BreakAfinity::runVigenere(){
|
void BreakAffinity::runVigenere(){
|
||||||
MathTools mt;
|
MathTools mt;
|
||||||
CodecVigenere codec;
|
CodecVigenere codec;
|
||||||
FreqAnalyser fa;
|
FreqAnalyser fa;
|
||||||
|
@ -17,7 +17,7 @@ namespace BreakAfinity {
|
||||||
int alpha_size = this->_config.getAlphabet().size();
|
int alpha_size = this->_config.getAlphabet().size();
|
||||||
|
|
||||||
// 1 - repérer les mots qui se répentent
|
// 1 - repérer les mots qui se répentent
|
||||||
pDEBUG("BreakAfinity::run","analysing %s\n",cypherText.toString().c_str());
|
pDEBUG("BreakAffinity::run","analysing %s\n",cypherText.toString().c_str());
|
||||||
KeyVigenere key;
|
KeyVigenere key;
|
||||||
TextCounter fst;
|
TextCounter fst;
|
||||||
TextCounter sec;
|
TextCounter sec;
|
||||||
|
@ -49,7 +49,7 @@ namespace BreakAfinity {
|
||||||
|
|
||||||
// 2 - on en déduit la longueur de la clef
|
// 2 - on en déduit la longueur de la clef
|
||||||
key_len = mt.pgcd(dist1,dist2);
|
key_len = mt.pgcd(dist1,dist2);
|
||||||
pDEBUG("BreakAfinity::run","PGCD(%d, %d) = %d\n", dist1, dist2, key_len);
|
pDEBUG("BreakAffinity::run","PGCD(%d, %d) = %d\n", dist1, dist2, key_len);
|
||||||
|
|
||||||
// 3 - on calcule le décalage par colonne
|
// 3 - on calcule le décalage par colonne
|
||||||
std::list<TextCounter>::iterator pI;
|
std::list<TextCounter>::iterator pI;
|
||||||
|
|
8
src/tools/breakaffinity.hh
Normal file
8
src/tools/breakaffinity.hh
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#ifndef _BREAKAFFINITY_HH
|
||||||
|
#define _BREAKAFFINITY_HH
|
||||||
|
|
||||||
|
#include "breakaffinity_global.hh"
|
||||||
|
#include "breakaffinity_iface.hh"
|
||||||
|
#include "breakaffinity_proto.hh"
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,10 +1,10 @@
|
||||||
#ifndef _BREAKAFINITY_GLOBAL_HH
|
#ifndef _BREAKAFFINITY_GLOBAL_HH
|
||||||
#define _BREAKAFINITY_GLOBAL_HH
|
#define _BREAKAFFINITY_GLOBAL_HH
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "cryptafinity.hh"
|
#include "cryptaffinity.hh"
|
||||||
|
|
||||||
#define COLOR_GREEN "\x1B[33m"
|
#define COLOR_GREEN "\x1B[33m"
|
||||||
#define COLOR_NORMAL "\x1B[0m"
|
#define COLOR_NORMAL "\x1B[0m"
|
4
src/tools/breakaffinity_iface.hh
Normal file
4
src/tools/breakaffinity_iface.hh
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#ifndef _BREAKAFFINITY_IFACE_HH
|
||||||
|
#define _BREAKAFFINITY_IFACE_HH
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef _BREAKAFINITY_PROTO_HH
|
#ifndef _BREAKAFFINITY_PROTO_HH
|
||||||
#define _BREAKAFINITY_PROTO_HH
|
#define _BREAKAFFINITY_PROTO_HH
|
||||||
|
|
||||||
#include "ba_cmd.hh"
|
#include "ba_cmd.hh"
|
||||||
#include "ba_config.hh"
|
#include "ba_config.hh"
|
|
@ -1,8 +0,0 @@
|
||||||
#ifndef _BREAKAFINITY_HH
|
|
||||||
#define _BREAKAFINITY_HH
|
|
||||||
|
|
||||||
#include "breakafinity_global.hh"
|
|
||||||
#include "breakafinity_iface.hh"
|
|
||||||
#include "breakafinity_proto.hh"
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,4 +0,0 @@
|
||||||
#ifndef _BREAKAFINITY_IFACE_HH
|
|
||||||
#define _BREAKAFINITY_IFACE_HH
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,9 +1,9 @@
|
||||||
|
|
||||||
#include "file_loader.hh"
|
#include "file_loader.hh"
|
||||||
|
|
||||||
using namespace LibCryptAfinity;
|
using namespace LibCryptAffinity;
|
||||||
|
|
||||||
namespace BreakAfinity {
|
namespace BreakAffinity {
|
||||||
std::vector<int> FileLoader::loadPriorities(
|
std::vector<int> FileLoader::loadPriorities(
|
||||||
std::map<std::string, int> reverse_alpha,
|
std::map<std::string, int> reverse_alpha,
|
||||||
std::string filename){
|
std::string filename){
|
||||||
|
|
|
@ -10,9 +10,9 @@
|
||||||
#include "alphabet.hh"
|
#include "alphabet.hh"
|
||||||
#include "text.hh"
|
#include "text.hh"
|
||||||
|
|
||||||
using namespace LibCryptAfinity;
|
using namespace LibCryptAffinity;
|
||||||
|
|
||||||
namespace BreakAfinity{
|
namespace BreakAffinity{
|
||||||
class FileLoader {
|
class FileLoader {
|
||||||
private:
|
private:
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
|
|
||||||
#include "breakafinity.hh"
|
#include "breakaffinity.hh"
|
||||||
#include "ba_cmd.hh"
|
#include "ba_cmd.hh"
|
||||||
|
|
||||||
using namespace BreakAfinity;
|
using namespace BreakAffinity;
|
||||||
|
|
||||||
int main(int argc, char ** argv){
|
int main(int argc, char ** argv){
|
||||||
::BreakAfinity::BreakAfinity br_af;
|
::BreakAffinity::BreakAffinity br_af;
|
||||||
|
|
||||||
br_af.init(argc, argv);
|
br_af.init(argc, argv);
|
||||||
br_af.loadFiles();
|
br_af.loadFiles();
|
||||||
|
|
Loading…
Add table
Reference in a new issue