Compare commits

...

5 commits

58 changed files with 420 additions and 923 deletions

View file

@ -2,13 +2,13 @@
demodir = demo
demo_DATA = \
demo/vigenere.txt \
demo/afine.txt \
demo/plaintext.txt \
demo/vigenere.2.txt \
demo/vigenere.3.txt
demo/vigenere.txt \
demo/affine.txt \
demo/plaintext.txt \
demo/vigenere.2.txt \
demo/vigenere.3.txt
SUBDIRS = src data doc
SUBDIRS = src data
EXTRA_DIST = INSTALL README doxygen.conf autogen \

244
README
View file

@ -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
View 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.

View file

@ -16,21 +16,21 @@ dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
dnl
## Autoconf requirements
AC_INIT([CryptAfinity], [0.2], [glenux@fr.st])
AC_INIT([CryptAffinity], [0.2], [glenux@glenux.net])
AC_PREREQ(2.50)
AC_CANONICAL_HOST
AC_CANONICAL_TARGET
AM_INIT_AUTOMAKE([CryptAfinity],[0.2])
AM_INIT_AUTOMAKE([CryptAffinity],[0.2])
#AC_CANONICAL_SYSTEM
AM_CONFIG_HEADER(src/config.h)
AC_CONFIG_SRCDIR([src/lib/cryptafinity.hh])
AC_CONFIG_SRCDIR([src/lib/cryptaffinity.hh])
AC_PROG_INSTALL
## information on the package
@ -128,7 +128,6 @@ AC_SUBST(GLIB2_LIBS)
#AC_SUBST(TARGET_HAVE_READLINE)
AC_CONFIG_FILES([Makefile
doc/Makefile
data/Makefile
src/Makefile
src/lib/Makefile

View file

@ -1,10 +0,0 @@
cryptafinityhtmldir = $(docdir)/cryptafinity/html
cryptafinityhtml_DATA = \
html/index.html \
html/cryptafinity.css
EXTRA_DIST = \
$(cryptafinityhtml_DATA)

View file

@ -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;
}

View file

@ -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&eacute;-requis</a></li>
<ol>
<li><a href="#2.1._Sur_un_syst%E8me_Debian_GNULinux">Sur un
syst&egrave;me Debian GNU/Linux</a></li>
<li><a href="#2.2._Sur_un_syst%E8me_Apple_MacOS_X_">Sur un
syst&egrave;me Apple MacOSX (&ge;10.3)</a></li>
<li><a href="#2.3._Sur_un_syst%E8me_Microsoft_Windows">Sur
un syst&egrave;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&eacute;codeur "Afine"</a></li>
<li><a href="#5.3._Principe_du_d%E9codeur_Vigen%E8re">D&eacute;codeur "Vigen&egrave;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&eacute;chiffrer des texte
obfusqu&eacute;s par des syst&egrave;mes Afines ou l'algorithme
de Vigen&egrave;re. Il poss&egrave;de les
caract&eacute;ristiques
suivantes :</p>
<ul>
<li>Il est distribu&eacute;
sous la licence&nbsp;<a href="http://www.gnu.org/copyleft/gpl.html">GNU
General Public License</a></li>
<li>Il est
&eacute;crit en C++.</li>
<li>Il
impl&eacute;mente
pour l'instant uniquement une analyse par fr&eacute;quences,
&agrave; partir d'une liste de "priorit&eacute;s" de lettres
dans un texte clair, et de la proportion que repr&eacute;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
&eacute;t&eacute; enti&egrave;rement
r&eacute;alis&eacute; par Glenn ROLLAND &lt;<a href="mailto:glenux@fr.st">glenux@fr.st</a>&gt; et Roland LAUR&Egrave;S &lt;<a href="mailto:shamox@mac.com">shamox@mac.com</a>&gt;
&agrave; l'occasion de travaux pratiques du cours de syst&egrave;me du
Master 2 Ing&eacute;nierie Informatique -
Syst&egrave;mes, R&eacute;seaux et Internet.</p>
<h2><a name="2._Pr&eacute;-requis"></a>2.
Pr&eacute;-requis</h2>
<p>CryptAfinity
n&eacute;cessite les biblioth&egrave;ques de fonctions
suivantes (dans
leur version de d&eacute;veloppement si compilez le programme
vous-m&ecirc;me):</p>
<ul>
<li>glib-2.0</li>
</ul>
<h3><a name="2.1._Sur_un_syst&egrave;me_Debian_GNULinux"></a>2.1.
Sur un syst&egrave;me
Debian GNU/Linux</h3>
<p>Il vous suffit de taper (en
tant qu'administrateur) les
commandes suivantes pour installer le n&eacute;cessaire:&nbsp;</p>
<p class="code"># apt-get
install libglib-2.0-dev</p>
<h3><a name="2.2._Sur_un_syst&egrave;me_Apple_MacOS_X_"></a>2.2.
Sur un syst&egrave;me Apple MacOS X (&gt;= 10.3)</h3>
<p>
Il est n&eacute;cessaire d'avoir install&eacute; <span style="font-style: italic;"></span>les&nbsp;<span style="font-style: italic;">autotools</span>
(automake, autoconf...) dans leur derni&egrave;re
version.&nbsp;&Agrave; partir de l&agrave;, 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&egrave;me_Microsoft_Windows"></a>2.3.
Sur un syst&egrave;me Microsoft Windows</h3>
Cela ne fut pas (encore) test&eacute;, mais il est tr&egrave;s
probable que cela fonctionne&nbsp;sous Cygwin.<br>
<h2><a name="3._Se_procurer_MiniFTPc"></a>3.
Se procurer CryptAfinity</h2>
<p>
Vous
pouvez t&eacute;l&eacute;charger la derni&egrave;re archive
des
sources, ou bien directement la version la plus r&eacute;cente du
projet sur le d&eacute;p&ocirc;t Subversion du projet.</p>
<h3>3.1. L'archive des sources</h3>
<p>
Elle est disponible &agrave; 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&eacute;p&ocirc;t Subversion</h3>
<p>Afin d'obtenir les sources les
plus &agrave; jour, vous pouvez utiliser le logiciel de
contr&ocirc;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&eacute;e" pour l'utilisateur "anonymous", si ce dernier vous
est
demand&eacute;.</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&eacute;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'&ecirc;tre cr&eacute;&eacute; lors de
la d&eacute;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&eacute;cessite de nombreux param&egrave;tres, avec la
syntaxe suivante:</p>
<p class="code">Usage:
break_afinity -a &lt;fichier&gt; -e &lt;float&gt; -f
&lt;float&gt; -p &lt;fichier&gt; -t
&lt;fichier&gt; -m <br>
</p>
<p>
O&ugrave; les param&egrave;tres sont les
suivants:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
<tbody>
<tr>
<td>-a, --alphabet
&lt;file&gt;&nbsp;</td>
<td>Fichier contenant les
lettres de l'alphabet, dans l'ordre.</td>
</tr>
<tr>
<td><br>
-e, --epsilon &lt;float&gt;</td>
<td>Tolerance pour le test
des clefs.</td>
</tr>
<tr>
<td>-f, --frequencies
&lt;float&gt;</td>
<td>Proportion moyenne que
repr&eacute;sentent les 9 lettres "prioritaires" dans le texte
clair.</td>
</tr>
<tr>
<td>-k, --keylength
&lt;int&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
<td>Taille de la clef
maximul (obsol&egrave;te)</td>
</tr>
<tr>
<td>-p, --priorities
&lt;file&gt;</td>
<td>Lettres
ordonn&eacute;es par fr&eacute;quence d&eacute;croissante
d'apparition dans le texte clair.</td>
</tr>
<tr>
<td>-t, --text
&lt;file&gt;</td>
<td>Fichier contenant le
texte chiffr&eacute;.</td>
</tr>
<tr>
<td>-m, --mode &lt;a|v&gt;</td>
<td>Selection du mode "Afine" ou "Vigen&egrave;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&eacute;codeur_Afine"></a>5.2. Principe du "d&eacute;codeur Afine"</h3>
<p>On g&eacute;n&egrave;re l'espace des&nbsp;clefs possibles pour l'alphabet donn&eacute; en entr&eacute;e:</p>
<p class="code">int alpha_size; //taille de l'alphabet<br>
std::list&lt;int&gt; orb; // nombre premiers avec alpha_size<br>
MathTools mt; // bibliotheque d'outils math&eacute;matiques<br>
std::list&lt;KeyAfine&gt; keyList;<br>
std::list&lt;int&gt;::iterator orbIt;</p>
<p class="code">for (i=1; i&lt;alpha_size; i++){<br>
&nbsp;&nbsp;&nbsp; if (mt.pgcd(i, alpha_size) == 1) {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; orb.push_back(i);<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
// 1 - g&eacute;n&eacute;rer l'espace des 312 clefs<br>
for (orbIt = orb.begin(); orbIt != orb.end(); orbIt++){<br>
&nbsp;&nbsp;&nbsp; KeyAfine key;<br>
&nbsp;&nbsp;&nbsp; key.setCoefA((*orbIt));<br>
&nbsp;&nbsp;&nbsp; for (i=0; i&lt;alpha_size; i++){<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; key.setCoefB(i);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; keyList.push_back(key);<br>
&nbsp;&nbsp;&nbsp; }<br>
}</p>
<p>Puis on fait une attaque par analyse de fr&eacute;quence sur les textes
obtenus par "d&eacute;codage" du texte chiffr&eacute; avec les clefs essay&eacute;es.</p>
<p class="code">float frequencies; // fr&eacute;quence cumul&eacute;e des&nbsp;9 lettres les plus pr&eacute;sentes<br>
float epsilon; // marge d'erreur</p>
<p style="text-align: left;" class="code">std::list&lt;KeyAfine&gt;::iterator kLIt;<br>
for (kLIt = keyList.begin(); kLIt != keyList.end(); kLIt++){<br>
&nbsp;&nbsp;&nbsp; float score = 0;<br>
&nbsp;&nbsp;&nbsp; printf("Trying key %s\n", (*kLIt).toString().c_str());<br>
<br>
&nbsp;&nbsp;&nbsp; plainText = codec.decode(cypherText, *kLIt);&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; plainText.setAlphabet(this-&gt;_config.getAlphabet());<br>
&nbsp;&nbsp;&nbsp; for (int i=0; i&lt;9; i++){<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; score += plainText.getCountOf(prio_conf[i]);<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; score = score / plainText.size();<br>
&nbsp;&nbsp;&nbsp; if (fabs(score - frequencies) &lt; epsilon){<br>
&nbsp; &nbsp; &nbsp; printf("KEY = %s\n",(*kLIt).toString().c_str());<br>
&nbsp; &nbsp; &nbsp;&nbsp;printf("PLAIN TEXT(%f) = %s\n", fabs(score-frequencies),<br>
&nbsp; &nbsp; &nbsp; &nbsp; plainText.toAlphabet().c_str());<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
}</p>
<h3><a name="5.3._Principe_du_d&eacute;codeur_Vigen&egrave;re"></a>5.3. Principe du "d&eacute;codeur Vigen&egrave;re"</h3>
<div style="text-align: justify;">
On commence par faire r&eacute;cup&eacute;rer les groupes de carat&egrave;res qui se r&eacute;p&egrave;tent dans le texte.<br>
<br>
Une fois les groupes r&eacute;p&eacute;t&eacute;s de lettres de plus
grande longueur obtenus (dans l'ordre d&eacute;croissant en fonction de
la longueur), on calcule la distance
s&eacute;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&egrave;se sous-jacente est
que ces groupes de lettres sont issue du chiffrement des m&ecirc;mes
bouts de mots avec les m&ecirc;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&eacute;p&eacute;titions.<br>
<br>
L'&eacute;tape suivante consiste &agrave; faire une analyse de
fr&eacute;quence en d&eacute;coupant le texte en K&nbsp;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&eacute;quemment que l'ordre de lettre soit
l&eacute;g&egrave;rement chang&eacute; par rapport au r&eacute;sultat
attendu. Dans le programme, on calcule donc pour chaque colonne les
distances entre les X lettres les plus fr&eacute;quentes dans la
colonne et la lettre la plus fr&eacute;quente dans le langage.<br>
On g&eacute;n&egrave;re ensuite un espace de X ^ K clefs a partir des
combinaisons de ces diff&eacute;rents d&eacute;calages obtenus sur
chaque colonne.<br>
<br>
Enfin, on d&eacute;code ensuite le texte avec chacune des clef
g&eacute;n&eacute;r&eacute;es, et en fonction de donn&eacute;es
statistiques
relative &agrave; notre connaissance pr&eacute;alable du texte et d'une
petite marge d'erreur, on filtre les texte d&eacute;chiffr&eacute;s.<br>
(Exemple: les 9 lettres les plus fr&eacute;quentes repr&eacute;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&eacute;chiffr&eacute;s, parmi lesquels devrait se trouver le
texte clair attendu.<br>
</div>
</div>
</body></html>

View file

@ -1,37 +1,37 @@
SUBDIRS = .
lib_LTLIBRARIES = libcryptafinity.la
lib_LTLIBRARIES = libcryptaffinity.la
#bin_PROGRAMS = libulm.o
libcryptafinity_la_SOURCES = alphabet.cpp \
libcryptaffinity_la_SOURCES = alphabet.cpp \
key.cpp \
text.cpp \
codec.cpp \
letter.cpp \
codec_afine.cpp \
codec_affine.cpp \
codec_vigenere.cpp \
key_afine.cpp \
key_affine.cpp \
key_vigenere.cpp \
word_list.cpp \
math_tools.cpp \
freq_analyser.cpp
#libcryptafinity_la_SOURCES += cryptafinity_errors.hh \
# cryptafinity_global.hh \
# cryptafinity.hh \
# cryptafinity_iface.hh \
# cryptafinity_proto.hh \
#libcryptaffinity_la_SOURCES += cryptaffinity_errors.hh \
# cryptaffinity_global.hh \
# cryptaffinity.hh \
# cryptaffinity_iface.hh \
# cryptaffinity_proto.hh \
# XSock.hh
libcryptafinity_la_CFLAGS = -DTRACE -static
libcryptafinity_la_LDFLAGS = -version-info 3:12:1
libcryptaffinity_la_CFLAGS = -DTRACE -static
libcryptaffinity_la_LDFLAGS = -version-info 3:12:1
#INCLUDES= SQLITE3_CFLAGS@ \
# LIBXMLPP_CFLAGS@ \
# -I./
#libcryptafinity_a_LDFLAGS= @LDFLAGS@
#libcryptaffinity_a_LDFLAGS= @LDFLAGS@
#SQLITE3_LIBS@ LIBPCRE_LIBS@

View file

@ -1,7 +1,7 @@
#include "alphabet.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
Alphabet::Alphabet() : std::vector<std::string>() { }

View file

@ -1,11 +1,11 @@
#ifndef _LIBCRYPAFINITY_ALPHABET_HH
#define _LIBCRYPAFINITY_ALPHABET_HH
#ifndef _LIBCRYPAFFINITY_ALPHABET_HH
#define _LIBCRYPAFFINITY_ALPHABET_HH
#include "cryptafinity_global.hh"
#include "cryptafinity_iface.hh"
#include "cryptaffinity_global.hh"
#include "cryptaffinity_iface.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
class ReverseAlphabet: public std::map<std::string, int> {
};

View file

@ -1,7 +1,7 @@
#include "codec.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
Codec::Codec(){
}

View file

@ -1,13 +1,13 @@
#ifndef _LIBCRYPAFINITY_CODEC_HH
#define _LIBCRYPAFINITY_CODEC_HH
#ifndef _LIBCRYPAFFINITY_CODEC_HH
#define _LIBCRYPAFFINITY_CODEC_HH
#include "text.hh"
#include "key.hh"
#include "cryptafinity_global.hh"
#include "cryptafinity_iface.hh"
#include "cryptaffinity_global.hh"
#include "cryptaffinity_iface.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
class Codec {
private:
public:

View file

@ -1,8 +1,8 @@
#include "codec_afine.hh"
#include "codec_affine.hh"
#include "math_tools.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
CodecAfine::CodecAfine() : Codec() {
}

23
src/lib/codec_affine.hh Normal file
View 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

View file

@ -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

View file

@ -1,7 +1,7 @@
#include "codec_vigenere.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
CodecVigenere::CodecVigenere() : Codec() {
}

View file

@ -1,14 +1,14 @@
#ifndef _LIBCRYPAFINITY_CODEC_VIGENERE_HH
#define _LIBCRYPAFINITY_CODEC_VIGENERE_HH
#ifndef _LIBCRYPAFFINITY_CODEC_VIGENERE_HH
#define _LIBCRYPAFFINITY_CODEC_VIGENERE_HH
#include "codec.hh"
#include "key_vigenere.hh"
#include "cryptafinity_global.hh"
#include "cryptafinity_iface.hh"
#include "cryptaffinity_global.hh"
#include "cryptaffinity_iface.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
class CodecVigenere : public Codec {
private:
public:

8
src/lib/cryptaffinity.hh Normal file
View file

@ -0,0 +1,8 @@
#ifndef _CRYPTAFFINITY_HH
#define _CRYPTAFFINITY_HH
#include "cryptaffinity_global.hh"
#include "cryptaffinity_iface.hh"
#include "cryptaffinity_proto.hh"
#endif

View file

@ -1,5 +1,5 @@
#ifndef _CRYPTAFINITY_GLOBAL_HH
#define _CRYPTAFINITY_GLOBAL_HH
#ifndef _CRYPTAFFINITY_GLOBAL_HH
#define _CRYPTAFFINITY_GLOBAL_HH
#include <stdlib.h>
#include <stdio.h>

View file

@ -0,0 +1,4 @@
#ifndef _CRYPTAFFINITY_IFACE_HH
#define _CRYPTAFFINITY_IFACE_HH
#endif

View file

@ -1,5 +1,5 @@
#ifndef _CRYPTAFINITY_PROTO_HH
#define _CRYPTAFINITY_PROTO_HH
#ifndef _CRYPTAFFINITY_PROTO_HH
#define _CRYPTAFFINITY_PROTO_HH
#include "math_tools.hh"
#include "alphabet.hh"
@ -9,6 +9,6 @@
#include "freq_analyser.hh"
#include "codec.hh"
#include "codec_vigenere.hh"
#include "codec_afine.hh"
#include "codec_affine.hh"
#endif

View file

@ -1,8 +0,0 @@
#ifndef _CRYPTAFINITY_HH
#define _CRYPTAFINITY_HH
#include "cryptafinity_global.hh"
#include "cryptafinity_iface.hh"
#include "cryptafinity_proto.hh"
#endif

View file

@ -1,4 +0,0 @@
#ifndef _CRYPTAFINITY_IFACE_HH
#define _CRYPTAFINITY_IFACE_HH
#endif

View file

@ -4,7 +4,7 @@
#define DEBUG 0
namespace LibCryptAfinity {
namespace LibCryptAffinity {
std::list<TextCounter> FreqAnalyser::getPriorities(Text text, int keylen, int column){
std::list<TextCounter> result;
std::map<Text, int> counter;

View file

@ -1,12 +1,12 @@
#ifndef _LIBCRYPTAFINITY_FREQANALYSER_HH
#define _LIBCRYPTAFINITY_FREQANALYSER_HH
#ifndef _LIBCRYPTAFFINITY_FREQANALYSER_HH
#define _LIBCRYPTAFFINITY_FREQANALYSER_HH
#include "cryptafinity_global.hh"
#include "cryptafinity_iface.hh"
#include "cryptaffinity_global.hh"
#include "cryptaffinity_iface.hh"
#include "text.hh" // body
namespace LibCryptAfinity {
namespace LibCryptAffinity {
class FreqAnalyser {
private:

View file

@ -1,7 +1,7 @@
#include "key.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
Key::Key() { }
// std::string Key::toString() { }

View file

@ -4,10 +4,10 @@
//#include "text.hh"
//#include "cryptafinity_global.hh"
//#include "cryptafinity_iface.hh"
//#include "cryptaffinity_global.hh"
//#include "cryptaffinity_iface.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
class Key {
private:
public:

View file

@ -1,10 +1,10 @@
#include "key_afine.hh"
#include "key_affine.hh"
#include "cryptafinity_global.hh"
#include "cryptafinity_iface.hh"
#include "cryptaffinity_global.hh"
#include "cryptaffinity_iface.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
int KeyAfine::getCoefA(){
return this->_a;

View file

@ -1,13 +1,13 @@
#ifndef _CRYPTAFINIY_KEYAFINE_HH
#define _CRYPTAFINIY_KEYAFINE_HH
#include "cryptafinity_global.hh"
#include "cryptafinity_iface.hh"
#include "cryptaffinity_global.hh"
#include "cryptaffinity_iface.hh"
#include "key.hh" // declaration
#include "text.hh" // body
namespace LibCryptAfinity {
namespace LibCryptAffinity {
class KeyAfine : public Key {
private:
int _a;

View file

@ -1,7 +1,7 @@
#include "key_vigenere.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
KeyVigenere::KeyVigenere() : Key(), Text() { // Key()
int i;
i=0;

View file

@ -1,13 +1,13 @@
#ifndef _CRYPTAFINIY_KEYVIGENERE_HH
#define _CRYPTAFINIY_KEYVIGENERE_HH
#include "cryptafinity_global.hh"
#include "cryptafinity_iface.hh"
#include "cryptaffinity_global.hh"
#include "cryptaffinity_iface.hh"
#include "text.hh"
#include "key.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
class KeyVigenere : public Key, public Text {
private:
public:

View file

@ -1,6 +1,6 @@
#include "letter.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
Letter::Letter(const Letter &orig){
this->_alphabet = orig._alphabet;

View file

@ -1,12 +1,12 @@
#ifndef _LIBCRYPTAFINITY_LETTER_HH
#define _LIBCRYPTAFINITY_LETTER_HH
#ifndef _LIBCRYPTAFFINITY_LETTER_HH
#define _LIBCRYPTAFFINITY_LETTER_HH
#include "cryptafinity_global.hh"
#include "cryptafinity_iface.hh"
#include "cryptaffinity_global.hh"
#include "cryptaffinity_iface.hh"
#include "alphabet.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
class Letter {
private:
Alphabet _alphabet;

View file

@ -3,7 +3,7 @@
#define DEBUG 1
namespace LibCryptAfinity {
namespace LibCryptAffinity {
int MathTools::pgcd(int a, int b){
int fa = a;

View file

@ -1,10 +1,10 @@
#ifndef _LIBCRYPTAFINITY_MATHTOOLS_HH
#define _LIBCRYPTAFINITY_MATHTOOLS_HH
#ifndef _LIBCRYPTAFFINITY_MATHTOOLS_HH
#define _LIBCRYPTAFFINITY_MATHTOOLS_HH
#include "cryptafinity_global.hh"
#include "cryptafinity_iface.hh"
#include "cryptaffinity_global.hh"
#include "cryptaffinity_iface.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
class MathTools {
private:

View file

@ -2,7 +2,7 @@
#include "text.hh"
#define DEBUG 0
namespace LibCryptAfinity {
namespace LibCryptAffinity {
bool TextCounter::operator< (TextCounter b){
fflush(stdout);
if (this->_text.size() < b.getText().size()){

View file

@ -1,12 +1,12 @@
#ifndef _LIBCRYPAFINITY_TEXT_HH
#define _LIBCRYPAFINITY_TEXT_HH
#ifndef _LIBCRYPAFFINITY_TEXT_HH
#define _LIBCRYPAFFINITY_TEXT_HH
#include "cryptafinity_global.hh"
#include "cryptafinity_iface.hh"
#include "cryptaffinity_global.hh"
#include "cryptaffinity_iface.hh"
#include "alphabet.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
class TextCounter;
class Text : public std::vector<int> {

View file

@ -1,7 +1,7 @@
#include "word_list.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
std::map<Text,int> WordList::getWordsContaining(int value){
std::map<Text,int> result;
std::map<int, TextCounter>::iterator foundVal;

View file

@ -4,7 +4,7 @@
#include <map>
#include "text.hh"
namespace LibCryptAfinity {
namespace LibCryptAffinity {
class WordList {
private:
std::map<Text, int> _word2int; // existance du mot

View file

@ -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

View file

@ -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

View file

@ -2,10 +2,10 @@
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_cmd.cpp \
@ -13,7 +13,7 @@ break_afinity_SOURCES = main.cpp ba_cmd.cpp ba_config.cpp file_loader.cpp ba_vi
# miniftp.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 \
# miniftp_global.hh \
@ -32,6 +32,6 @@ INCLUDES= -I../lib/ -I./ @GLIB2_CFLAGS@
# libyalag.la
# miniftpc_INCLUDE = a
break_afinity_LDADD = -lcryptafinity @GLIB2_LIBS@
break_afinity_LDFLAGS = @LDFLAGS@ -L../lib -L../lib/.libs
break_affinity_LDADD = -lcryptaffinity @GLIB2_LIBS@
break_affinity_LDFLAGS = @LDFLAGS@ -L../lib -L../lib/.libs

View file

@ -4,9 +4,9 @@
#define DEBUG 1
namespace BreakAfinity {
namespace BreakAffinity {
void BreakAfinity::runAfine(){
void BreakAffinity::runAfine(){
MathTools mt;
CodecAfine codec;
FreqAnalyser fa;

View file

@ -4,20 +4,20 @@
#define DEBUG 0
namespace BreakAfinity {
BreakAfinity::BreakAfinity(){
namespace BreakAffinity {
BreakAffinity::BreakAffinity(){
// on fixe la config par defaut
int i;
i=i+1;
}
void BreakAfinity::loadFiles(){
void BreakAffinity::loadFiles(){
printf("ALIVE !!!\n");
this->_config.loadFiles();
printf("ALIVE ???\n");
}
void BreakAfinity::init(int argc, char **argv) {
void BreakAffinity::init(int argc, char **argv) {
int i;
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("-e, --epsilon <float> Tolerance for the final key test\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("-t, --text <file> Cipher text to decipher\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 ?
MathTools mt;
CodecVigenere codec;

View file

@ -1,20 +1,20 @@
#ifndef _BREAKAFINITY_CMD_HH
#define _BREAKAFINITY_CMD_HH
#ifndef _BREAKAFFINITY_CMD_HH
#define _BREAKAFFINITY_CMD_HH
#include <string.h>
#include <list>
#include "breakafinity.hh"
#include "breakaffinity.hh"
#include "ba_config.hh"
namespace BreakAfinity {
namespace BreakAffinity {
class BreakAfinity {
class BreakAffinity {
private:
BreakerConfig _config;
public:
BreakAfinity();
BreakAffinity();
void init(int argc, char ** argv);
void loadFiles();
void run();

View file

@ -2,7 +2,7 @@
#include "ba_config.hh"
#include "file_loader.hh"
namespace BreakAfinity {
namespace BreakAffinity {
void BreakerConfig::setMode(char * m){
switch(m[0]){
case 'v':

View file

@ -1,5 +1,5 @@
#ifndef _BREAKAFINITY_CONFIG_HH
#define _BREAKAFINITY_CONFIG_HH
#ifndef _BREAKAFFINITY_CONFIG_HH
#define _BREAKAFFINITY_CONFIG_HH
#include <string>
#include <vector>
@ -8,9 +8,9 @@
#include "alphabet.hh"
#include "text.hh"
using namespace LibCryptAfinity;
using namespace LibCryptAffinity;
namespace BreakAfinity {
namespace BreakAffinity {
class BreakerConfig {
private:
bool _modeVigenere;

View file

@ -4,9 +4,9 @@
#define DEBUG 0
namespace BreakAfinity {
namespace BreakAffinity {
void BreakAfinity::runVigenere(){
void BreakAffinity::runVigenere(){
MathTools mt;
CodecVigenere codec;
FreqAnalyser fa;
@ -17,7 +17,7 @@ namespace BreakAfinity {
int alpha_size = this->_config.getAlphabet().size();
// 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;
TextCounter fst;
TextCounter sec;
@ -49,7 +49,7 @@ namespace BreakAfinity {
// 2 - on en déduit la longueur de la clef
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
std::list<TextCounter>::iterator pI;

View file

@ -0,0 +1,8 @@
#ifndef _BREAKAFFINITY_HH
#define _BREAKAFFINITY_HH
#include "breakaffinity_global.hh"
#include "breakaffinity_iface.hh"
#include "breakaffinity_proto.hh"
#endif

View file

@ -1,10 +1,10 @@
#ifndef _BREAKAFINITY_GLOBAL_HH
#define _BREAKAFINITY_GLOBAL_HH
#ifndef _BREAKAFFINITY_GLOBAL_HH
#define _BREAKAFFINITY_GLOBAL_HH
#include <stdio.h>
#include <stdlib.h>
#include "cryptafinity.hh"
#include "cryptaffinity.hh"
#define COLOR_GREEN "\x1B[33m"
#define COLOR_NORMAL "\x1B[0m"

View file

@ -0,0 +1,4 @@
#ifndef _BREAKAFFINITY_IFACE_HH
#define _BREAKAFFINITY_IFACE_HH
#endif

View file

@ -1,5 +1,5 @@
#ifndef _BREAKAFINITY_PROTO_HH
#define _BREAKAFINITY_PROTO_HH
#ifndef _BREAKAFFINITY_PROTO_HH
#define _BREAKAFFINITY_PROTO_HH
#include "ba_cmd.hh"
#include "ba_config.hh"

View file

@ -1,8 +0,0 @@
#ifndef _BREAKAFINITY_HH
#define _BREAKAFINITY_HH
#include "breakafinity_global.hh"
#include "breakafinity_iface.hh"
#include "breakafinity_proto.hh"
#endif

View file

@ -1,4 +0,0 @@
#ifndef _BREAKAFINITY_IFACE_HH
#define _BREAKAFINITY_IFACE_HH
#endif

View file

@ -1,9 +1,9 @@
#include "file_loader.hh"
using namespace LibCryptAfinity;
using namespace LibCryptAffinity;
namespace BreakAfinity {
namespace BreakAffinity {
std::vector<int> FileLoader::loadPriorities(
std::map<std::string, int> reverse_alpha,
std::string filename){

View file

@ -10,9 +10,9 @@
#include "alphabet.hh"
#include "text.hh"
using namespace LibCryptAfinity;
using namespace LibCryptAffinity;
namespace BreakAfinity{
namespace BreakAffinity{
class FileLoader {
private:
public:

View file

@ -1,11 +1,11 @@
#include "breakafinity.hh"
#include "breakaffinity.hh"
#include "ba_cmd.hh"
using namespace BreakAfinity;
using namespace BreakAffinity;
int main(int argc, char ** argv){
::BreakAfinity::BreakAfinity br_af;
::BreakAffinity::BreakAffinity br_af;
br_af.init(argc, argv);
br_af.loadFiles();