Updated README (git repo & text typos).
This commit is contained in:
parent
a1eb0c69f1
commit
238d2d19aa
1 changed files with 74 additions and 132 deletions
180
README.md
180
README.md
|
@ -1,20 +1,5 @@
|
||||||
# CryptAfinity
|
# CryptAfinity
|
||||||
|
|
||||||
1. Description
|
|
||||||
1. Auteurs
|
|
||||||
2. Pre-requis
|
|
||||||
1. Sur un systeme Debian GNU/Linux
|
|
||||||
2. Sur un systeme Apple MacOSX (≥10.3)
|
|
||||||
3. Sur un systeme Microsoft Windows
|
|
||||||
3. Se procurer CryptAfinity
|
|
||||||
4. Utiliser CryptAfinity
|
|
||||||
1. Compilation
|
|
||||||
2. Utilisation
|
|
||||||
5. Documentation
|
|
||||||
1. Code
|
|
||||||
2. Decodeur "Afine"
|
|
||||||
3. Decodeur "Vigenere"
|
|
||||||
|
|
||||||
## 1. Description
|
## 1. Description
|
||||||
|
|
||||||
CryptAfinity est un logiciel libre permettant de dechiffrer des texte
|
CryptAfinity est un logiciel libre permettant de dechiffrer des texte
|
||||||
|
@ -40,12 +25,14 @@ version de developpement si compilez le programme vous-meme):
|
||||||
|
|
||||||
* glib-2.0
|
* glib-2.0
|
||||||
|
|
||||||
|
|
||||||
### 2.1. Sur un systeme Debian GNU/Linux
|
### 2.1. Sur un systeme Debian GNU/Linux
|
||||||
|
|
||||||
Il vous suffit de taper (en tant qu'administrateur) les commandes suivantes
|
Il vous suffit de taper (en tant qu'administrateur) les commandes suivantes
|
||||||
pour installer le necessaire:
|
pour installer le necessaire:
|
||||||
|
|
||||||
# apt-get install libglib-2.0-dev
|
# apt-get install libglib-2.0-dev
|
||||||
|
|
||||||
|
|
||||||
### 2.2. Sur un systeme Apple MacOS X (>= 10.3)
|
### 2.2. Sur un systeme Apple MacOS X (>= 10.3)
|
||||||
|
|
||||||
|
@ -53,18 +40,21 @@ Il est necessaire d'avoir installe les autotools (automake,
|
||||||
autoconf...) dans leur derniere version. À partir de la, il
|
autoconf...) dans leur derniere version. À partir de la, il
|
||||||
suffit de taper les commandes suivantes dans un terminal :
|
suffit de taper les commandes suivantes dans un terminal :
|
||||||
|
|
||||||
# sudo fink install glib2-dev
|
# sudo fink install glib2-dev
|
||||||
|
|
||||||
|
|
||||||
### 2.3. Sur un systeme Microsoft Windows
|
### 2.3. Sur un systeme Microsoft Windows
|
||||||
|
|
||||||
Cela ne fut pas (encore) teste, mais il est tres probable que cela
|
Cela ne fut pas (encore) teste, mais il est tres probable que cela
|
||||||
fonctionne sous Cygwin.
|
fonctionne sous Cygwin.
|
||||||
|
|
||||||
|
|
||||||
## 3. Se procurer CryptAfinity
|
## 3. Se procurer CryptAfinity
|
||||||
|
|
||||||
Vous pouvez telecharger la derniere archive des sources, ou bien directement
|
Vous pouvez telecharger la derniere archive des sources, ou bien directement
|
||||||
la version la plus recente du projet sur le depot Subversion du projet.
|
la version la plus recente du projet sur le depot Subversion du projet.
|
||||||
|
|
||||||
|
|
||||||
### 3.1. L'archive des sources
|
### 3.1. L'archive des sources
|
||||||
|
|
||||||
Elle est disponible a l'adresse :
|
Elle est disponible a l'adresse :
|
||||||
|
@ -72,40 +62,39 @@ Elle est disponible a l'adresse :
|
||||||
[http://glenux2.free.fr/pub/projets/CryptAfinity/archives/](http://glenux2.fre
|
[http://glenux2.free.fr/pub/projets/CryptAfinity/archives/](http://glenux2.fre
|
||||||
e.fr/pub/projets/CryptAfinity/archives/)
|
e.fr/pub/projets/CryptAfinity/archives/)
|
||||||
|
|
||||||
|
|
||||||
### 3.2. Le depot Subversion
|
### 3.2. Le depot Subversion
|
||||||
|
|
||||||
Afin d'obtenir les sources les plus a jour, vous pouvez utiliser le logiciel
|
Afin d'obtenir les sources les plus a jour, vous pouvez utiliser le logiciel
|
||||||
de controle de sources Subversion
|
de controle de sources Git :
|
||||||
|
|
||||||
$ svn checkout http://repository.glenux.ath.cx/svn/CryptAfinity/
|
$ git clone https://github.com/glenux/cryptaffinity.git
|
||||||
|
|
||||||
Il n'y a pas de mot de passe, il suffit donc de presser la touche "Entree"
|
|
||||||
pour l'utilisateur "anonymous", si ce dernier vous est demande.
|
|
||||||
|
|
||||||
## 4. Utiliser CryptAfinity
|
## 4. Utiliser CryptAfinity
|
||||||
|
|
||||||
|
|
||||||
### 4.1. Compilation
|
### 4.1. Compilation
|
||||||
|
|
||||||
Commencez par decompressez l'archive.
|
Si vous avez téléchargé une archive, commencez par la decompressez :
|
||||||
|
|
||||||
$ tar -xzvf CryptAfinity-0.1.tar.gz
|
$ tar -xzvf CryptAfinity-0.2.tar.gz
|
||||||
|
|
||||||
Rendez vous ensuite dans le dossier qui vient d'etre cree lors de la
|
Rendez vous ensuite dans le dossier qui vient d'etre crée lors de la
|
||||||
decompression.
|
decompression.
|
||||||
|
|
||||||
$ cd CryptAfinity-0.2
|
$ cd CryptAfinity-0.2
|
||||||
|
|
||||||
Puis lancez l'auto-configuration du logiciel, puis la compilation.
|
Puis lancez l'auto-configuration du logiciel, puis la compilation.
|
||||||
|
|
||||||
$ ./autogen
|
$ ./autogen
|
||||||
|
$ ./configure
|
||||||
$ ./configure
|
$ make
|
||||||
|
|
||||||
$ make
|
|
||||||
|
|
||||||
Le programme sous forme binaire se trouvera alors dans le sous-dossier
|
Le programme sous forme binaire se trouvera alors dans le sous-dossier
|
||||||
src/tools/, sous le nom break_afinity
|
src/tools/, sous le nom break_afinity
|
||||||
|
|
||||||
|
|
||||||
### 4.2. Utilisation
|
### 4.2. Utilisation
|
||||||
|
|
||||||
CryptAfinity necessite de nombreux parametres, avec la syntaxe suivante:
|
CryptAfinity necessite de nombreux parametres, avec la syntaxe suivante:
|
||||||
|
@ -117,27 +106,27 @@ Ou les parametres sont les suivants: &nbs
|
||||||
p_place_holder;
|
p_place_holder;
|
||||||
|
|
||||||
-a, --alphabet <file>
|
-a, --alphabet <file>
|
||||||
Fichier contenant les lettres de l'alphabet, dans l'ordre.
|
: Fichier contenant les lettres de l'alphabet, dans l'ordre.
|
||||||
|
|
||||||
|
|
||||||
-e, --epsilon <float>
|
-e, --epsilon <float>
|
||||||
Tolerance pour le test des clefs.
|
: Tolerance pour le test des clefs.
|
||||||
|
|
||||||
-f, --frequencies <float>
|
-f, --frequencies <float>
|
||||||
Proportion moyenne que representent les 9 lettres "prioritaires" dans le texte
|
: Proportion moyenne que representent les 9 lettres "prioritaires" dans le texte
|
||||||
clair.
|
clair.
|
||||||
|
|
||||||
-k, --keylength <int>
|
-k, --keylength <int>
|
||||||
Taille de la clef maximul (obsolete)
|
: Taille de la clef maximul (obsolete)
|
||||||
|
|
||||||
-p, --priorities <file>
|
-p, --priorities <file>
|
||||||
Lettres ordonnees par frequence decroissante d'apparition dans le texte clair.
|
: Lettres ordonnees par frequence decroissante d'apparition dans le texte clair.
|
||||||
|
|
||||||
-t, --text <file>
|
-t, --text <file>
|
||||||
Fichier contenant le texte chiffre.
|
: Fichier contenant le texte chiffre.
|
||||||
|
|
||||||
-m, --mode <a|v>
|
-m, --mode <a|v>
|
||||||
Selection du mode "Afine" ou "Vigenere"
|
: Selection du mode "Afine" ou "Vigenere"
|
||||||
|
|
||||||
|
|
||||||
## 5. Documentation
|
## 5. Documentation
|
||||||
|
|
||||||
|
@ -151,116 +140,69 @@ doc/html de l'application, ou en suivant [ce lien](html/index.html).
|
||||||
On genere l'espace des clefs possibles pour l'alphabet donne
|
On genere l'espace des clefs possibles pour l'alphabet donne
|
||||||
en entree:
|
en entree:
|
||||||
|
|
||||||
int alpha_size; //taille de l'alphabet
|
int alpha_size; //taille de l'alphabet
|
||||||
|
std::list<int> orb; // nombre premiers avec alpha_size
|
||||||
std::list<int> orb; // nombre premiers avec alpha_size
|
MathTools mt; // bibliotheque d'outils mathematiques
|
||||||
|
std::list<KeyAfine> keyList;
|
||||||
MathTools mt; // bibliotheque d'outils mathematiques
|
std::list<int>::iterator orbIt;
|
||||||
|
|
||||||
std::list<KeyAfine> keyList;
|
|
||||||
|
|
||||||
std::list<int>::iterator orbIt;
|
|
||||||
|
|
||||||
for (i=1; i<alpha_size; i++){
|
|
||||||
|
|
||||||
if (mt.pgcd(i,
|
|
||||||
alpha_size) == 1) {
|
|
||||||
|
|
||||||
|
|
||||||
|
for (i=1; i<alpha_size; i++){
|
||||||
|
if (mt.pgcd(i, alpha_size) == 1) {
|
||||||
orb.push_back(i);
|
orb.push_back(i);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
// 1 - generer l'espace des 312 clefs
|
||||||
|
for (orbIt = orb.begin(); orbIt != orb.end(); orbIt++){
|
||||||
// 1 - generer l'espace des 312 clefs
|
|
||||||
|
|
||||||
for (orbIt = orb.begin(); orbIt != orb.end(); orbIt++){
|
|
||||||
|
|
||||||
KeyAfine key;
|
KeyAfine key;
|
||||||
|
key.setCoefA((*orbIt));
|
||||||
|
for (i=0; i<alpha_size; i++){
|
||||||
key.setCoefA((*orbIt));
|
|
||||||
|
|
||||||
for (i=0;
|
|
||||||
i<alpha_size; i++){
|
|
||||||
|
|
||||||
|
|
||||||
key.setCoefB(i);
|
key.setCoefB(i);
|
||||||
|
keyList.push_back(key);
|
||||||
|
}
|
||||||
|
|
||||||
keyList.push_back(key);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
Puis on fait une attaque par analyse de frequence sur les textes obtenus par
|
Puis on fait une attaque par analyse de frequence sur les textes obtenus par
|
||||||
"decodage" du texte chiffre avec les clefs essayees.
|
"decodage" du texte chiffre avec les clefs essayees.
|
||||||
|
|
||||||
float frequencies; // frequence cumulee des 9 lettres les
|
float frequencies; // frequence cumulee des 9 lettres les
|
||||||
plus presentes
|
plus presentes
|
||||||
|
float epsilon; // marge d'erreur
|
||||||
float epsilon; // marge d'erreur
|
std::list<KeyAfine>::iterator kLIt;
|
||||||
|
|
||||||
std::list<KeyAfine>::iterator kLIt;
|
|
||||||
|
|
||||||
for (kLIt = keyList.begin(); kLIt != keyList.end(); kLIt++){
|
|
||||||
|
|
||||||
|
for (kLIt = keyList.begin(); kLIt != keyList.end(); kLIt++){
|
||||||
float score = 0;
|
float score = 0;
|
||||||
|
printf("Trying key %s\n", (*kLIt).toString().c_str());
|
||||||
|
|
||||||
printf("Trying key
|
plainText = codec.decode(cypherText, *kLIt);
|
||||||
%s\n", (*kLIt).toString().c_str());
|
plainText.setAlphabet(this->_config.getAlphabet());
|
||||||
|
|
||||||
|
|
||||||
plainText =
|
|
||||||
codec.decode(cypherText,
|
|
||||||
*kLIt);
|
|
||||||
|
|
||||||
|
|
||||||
plainText.setAlphabet(this->_config.getAlphabet());
|
|
||||||
|
|
||||||
for (int i=0; i<9;
|
|
||||||
i++){
|
|
||||||
|
|
||||||
|
|
||||||
score +=
|
|
||||||
plainText.getCountOf(prio_conf[i]);
|
|
||||||
|
|
||||||
|
for (int i=0; i<9; i++){
|
||||||
|
score += plainText.getCountOf(prio_conf[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
score = score /
|
score = score / plainText.size();
|
||||||
plainText.size();
|
|
||||||
|
|
||||||
if (fabs(score -
|
|
||||||
frequencies) < epsilon){
|
|
||||||
|
|
||||||
|
if (fabs(score - frequencies) < epsilon){
|
||||||
printf("KEY =
|
printf("KEY =
|
||||||
%s\n",(*kLIt).toString().c_str());
|
%s\n",(*kLIt).toString().c_str());
|
||||||
|
|
||||||
|
|
||||||
printf("PLAIN TEXT(%f) = %s\n", fabs
|
printf("PLAIN TEXT(%f) = %s\n", fabs
|
||||||
(score-frequencies),
|
(score-frequencies),
|
||||||
|
|
||||||
|
|
||||||
plainText.toAlphabet().c_str());
|
plainText.toAlphabet().c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
### 5.3. Principe du "decodeur Vigenere"
|
### 5.3. Principe du "decodeur Vigenere"
|
||||||
|
|
||||||
On commence par faire recuperer les groupes de carateres qui se repetent dans
|
On commence par détecter les groupes de carateres qui se repetent dans le
|
||||||
le texte.
|
texte.
|
||||||
|
|
||||||
|
Une fois ces groupes repétes de lettres obtenus (dans l'ordre decroissant en
|
||||||
Une fois les groupes repetes de lettres de plus grande longueur obtenus (dans
|
fonction de leur longueur), on calcule la distance separant les deux premiers
|
||||||
l'ordre decroissant en fonction de la longueur), on calcule la distance
|
groupes (note d1) puis la distance entre les deux suivant (d2).
|
||||||
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
|
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
|
la longueur de la clef. L'hypothese sous-jacente est que ces groupes de
|
||||||
|
|
Loading…
Reference in a new issue