commit 8522e371bf2ac1b61ea803b6bfc1e51e9b4119d0 Author: glenux Date: Sun Jan 18 20:48:28 2009 +0000 Renamed CryptAffinity to cryptaffinity. git-svn-id: https://websvn.glenux.net/svn/Upoc/cryptaffinity/trunk@1175 eaee96b3-f302-0410-b096-c6cfd47f7835 diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..e69de29 diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..b7b5f53 --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..e69de29 diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..e69de29 diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..f488cde --- /dev/null +++ b/Makefile.am @@ -0,0 +1,3 @@ +SUBDIRS = src + +EXTRA_DIST = doc INSTALL README doxygen.conf autogen diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/README b/README new file mode 100644 index 0000000..e69de29 diff --git a/autogen b/autogen new file mode 100755 index 0000000..b6037f1 --- /dev/null +++ b/autogen @@ -0,0 +1,11 @@ +echo "libtoolize..." +libtoolize +echo "aclocal..." +aclocal +echo "autoheader..." +autoheader +echo "autoconf..." +autoconf +echo "automake..." +automake -a +echo "ok." diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..e69de29 diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..8bd0576 --- /dev/null +++ b/configure.in @@ -0,0 +1,172 @@ +dnl Copyright (C) 2004-2005 Glenn ROLLAND. +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +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_PREREQ(2.50) + +AC_CANONICAL_HOST +AC_CANONICAL_TARGET + + +AM_INIT_AUTOMAKE([CryptAfinity],[0.2]) + +#AC_CANONICAL_SYSTEM + + + +AM_CONFIG_HEADER(src/config.h) +AC_CONFIG_SRCDIR([src/lib/cryptafinity.hh]) +AC_PROG_INSTALL + +## information on the package +## ## checks for programs +## checks for libraries +## checks for header files +## checks for types +## checks for structures +## checks for compiler characteristics +## checks for library functions +## checks for system services + +AM_CONFIG_HEADER(config.h) +## required for c sources + +AC_ISC_POSIX +AC_PROG_CC +## required for c++ sources +AC_PROG_CXX +AC_PROG_CPP +# AC_PROG_RANLIB obsoleted bu LIBTOOL + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + +# AC_PROG_YACC +# AC_PROG_LEX +# AM_PROG_LEX + +dnl Checks for library functions. +AC_HEADER_STDC([]) + +#TODO: uncomment +AC_CHECK_HEADERS([vector set map iostream sstream string algorithm list memory iterator exception utility],, + AC_MSG_ERROR([You need to have the libstdc++ headers installed])) + + + +dnl *************************************************************************** +dnl Gettext stuff. +dnl *************************************************************************** + +#GETTEXT_PACKAGE=yalag-0.1 +#AC_SUBST(GETTEXT_PACKAGE) +#AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Gettext package.]) + +#ALL_LINGUAS="fr" +#AM_GLIB_GNU_GETTEXT + + +dnl Check for programs + +dnl Check for build configuration. +#AC_PROG_INTLTOOL + +AM_PROG_LIBTOOL + +dnl Checks for header files. + +#AC_MSG_NOTICE([checking presence of SQLite]) +#AC_CHECK_HEADERS([sqlite.h],[], +# [ +# AC_MSG_NOTICE([*** Please install/upgrade SQLite before proceeding]) +# AC_MSG_NOTICE([*** with Unlost Memories installation.]) +# AC_MSG_ERROR([cannot find sqlite.h]) +# ]) + +#sqlite_deps="sqlite3 >= 3.0" +#PKG_CHECK_MODULES(SQLITE3,$sqlite_deps,build_sqlite=yes,build_sqlite=no) +#AC_SUBST(SQLITE3_CFLAGS) +#AC_SUBST(SQLITE3_LIBS) + +glib_deps="glib-2.0 >= 2.0" +PKG_CHECK_MODULES(GLIB2,$glib_deps, build_glib=yes, build_glib=no) +AC_SUBST(GLIB2_CFLAGS) +AC_SUBST(GLIB2_LIBS) + +########## +# Figure out where to get the READLINE header files. +# +AC_MSG_CHECKING([readline header files]) +found=no +if test "$config_TARGET_READLINE_INC" != ""; then + TARGET_READLINE_INC=$config_TARGET_READLINE_INC + found=yes +fi +if test "$found" = "yes"; then + AC_MSG_RESULT($TARGET_READLINE_INC) +else + AC_MSG_RESULT(not specified: still searching...) + AC_CHECK_HEADER(readline.h, [found=yes]) +fi +if test "$found" = "no"; then + for dir in /usr /usr/local /usr/local/readline /usr/contrib /mingw; do + AC_CHECK_FILE($dir/include/readline.h, found=yes) + if test "$found" = "yes"; then + TARGET_READLINE_INC="-I$dir/include" + break + fi + AC_CHECK_FILE($dir/include/readline/readline.h, found=yes) + if test "$found" = "yes"; then + TARGET_READLINE_INC="-I$dir/include/readline" + break + fi + done +fi +if test "$found" = "yes"; then + if test "$TARGET_READLINE_LIBS" = ""; then + TARGET_HAVE_READLINE=0 + else + TARGET_HAVE_READLINE=1 + fi +else + TARGET_HAVE_READLINE=0 +fi +AC_SUBST(TARGET_READLINE_INC) +AC_SUBST(TARGET_HAVE_READLINE) + +#libxml2_deps="libxml-2.0 >= 2.4.1" +#PKG_CHECK_MODULES(LIBXML2,$libxml2_deps, build_libxml2=yes, build_libxml2=no) +#AC_SUBST(LIBXML2_CFLAGS) +#AC_SUBST(LIBXML2_LIBS) + +#if test $build_libxml2 == yes ; then +# AC_DEFINE(HAVE_LIBXML2_H,1,[Vaut 1 lorsque l'on utilise LIBXML2.]) +#else +# AC_DEFINE(HAVE_LIBXML2_H,0,[Vaut 1 lorsque l'on utilise LIBXML2.]) +#fi + +#libxmlpp_deps="libxml++-2.6 >= 2.8" +#PKG_CHECK_MODULES(LIBXMLPP,$libxmlpp_deps, build_libxmlpp=yes, build_libxmlpp=no) +#AC_SUBST(LIBXMLPP_CFLAGS) +#AC_SUBST(LIBXMLPP_LIBS) + + +AC_CONFIG_FILES([Makefile src/Makefile src/lib/Makefile src/tools/Makefile ]) +AC_OUTPUT + +dnl configure.in ends here diff --git a/doc/cryptafinity.css b/doc/cryptafinity.css new file mode 100644 index 0000000..62bfb2f --- /dev/null +++ b/doc/cryptafinity.css @@ -0,0 +1,33 @@ +/* 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; + } + + 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; + } + diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..6bc99e6 --- /dev/null +++ b/doc/index.html @@ -0,0 +1,430 @@ + + + + + + + + + + + + + + + MiniFTPc + + + + + +
+

CryptAfinity

+ +
    + +
  1. Description
  2. + +
      + +
    1. Auteurs
    2. + +
    + +
  3. Pré-requis
  4. + +
      + +
    1. Sur un +système Debian GNU/Linux
    2. + +
    3. Sur un +système Apple MacOSX (≥10.3)
    4. + +
    5. Sur +un système Microsoft Windows
    6. + +
    + +
  5. Se procurer +CryptAfinity
  6. + +
  7. Utiliser CryptAfinity
  8. + +
      + +
    1. Compilation
    2. + +
    3. Utilisation
    4. + +
    + +
  9. Documentation
  10. + +
+ +

1. +Description

+ +

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 :

+ +
    + +
  • Il est distribué +sous la licence GNU +General Public License
  • + +
  • 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 premieres lettres "prioritaires" dans le texte.
  • + +
+ +

1.1. +Auteurs

+ +

CryptAfinity a +été entièrement +réalisé par Glenn ROLLAND <glenux@fr.st> +à l'occasion de travaux pratiques du cours de système du +Master 2 Ingénierie Informatique - +Systèmes, Réseaux et Internet.

+ +

2. +Pré-requis

+ +

CryptAfinity +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 (encore) testé, mais il est très +probable que cela fonctionne sous Cygwin.
+ +

3. +Se procurer CryptAfinity

+ +

+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.

+ +

3.1. L'archive des sources

+ +

+Elle est disponible à l'adresse :

+ +http://glenux2.free.fr/pub/projets/CryptAfinity/archives/
+ +

3.2. Le +dépôt Subversion

+ +

Afin d'obtenir les sources les +plus à jour, vous pouvez utiliser le logiciel de +contrôle de sources Subversion

+ +

$ svn +checkout http://repository.glenux.ath.cx/svn/CryptAfinity/

+ +

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é.

+ +

4. +Utiliser CryptAfinity

+ +

4.1. +Compilation

+ +

Commencez par +décompressez l'archive.

+ +

$ tar -xzvf +CryptAfinity-0.1.tar.gz

+ +

Rendez vous ensuite dans le +dossier qui vient d'être créé lors de +la décompression.

+ +

$ cd +CryptAfinity-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_afinity

+ +

4.2. +Utilisation

+ +

+CryptAfinity nécessite de nombreux paramètres, avec la +syntaxe suivante:

+ +

Usage: +break_afinity -a <fichier> -e <float> -f +<float> -p <fichier> -t +<fichier> -m
+ +

+ +

+Où les paramètres sont les +suivants:      

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
-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 +<int>      Taille de la clef +maximul (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 chiffré.
-m, --mode <a|v>Selection du mode "Afine" ou "Vigenère"
+ +

5. +Documentation

+ +

5.1. Code

+ +

Vous pouvez trouver la documentation du code de CryptAfinity dans le +dossier doc/html +de l'application, ou en suivant ce lien.

+ +

5.2. Principe du "décodeur Afine"

+ +

On génère l'espace des clefs possibles pour l'alphabet donné en entrée:

+ +

int alpha_size; //taille de l'alphabet
+ +std::list<int> orb; // nombre premiers avec alpha_size
+ +MathTools mt; // bibliotheque d'outils mathématiques
+ +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 - générer 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 fréquence sur les textes +obtenus par "décodage" du texte chiffré avec les clefs essayées.

+ +

float frequencies; // fréquence cumulée des 9 lettres les plus présentes
+ +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 faire récupérer les groupes de caratères qui se répètent dans le texte.
+
+Une fois obtenue plusieurs groupes de lettres, on regarde la distance +séparrant les deux premiers groupes (note d1) puis la distance +entre les deux suivant (d2). Le PGCD de d1 et d2, doit donner 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 PGCD = 1 on +peut raisonnablement supposer que ce n'est pas le cas.
+
+L'étape suivante consiste à faire une analyse de +fréquence en découpant le texte en un nombre de colonne +correspondant au pgcd précédemment calculé. On +tire de cette analyse de fréquence, un ordre de lettre par +importance. Puis en fonction de données statistiques +préalables correspondant au contexte connu à prioris du +texte clair que l'on veut décrypter, on essaie de faire +correspondre les lettres les plus souvent vu dans le texte avec le +modèle de fréquence.
+
+Ceci nous donne un ensemble de clef (réduit à un ou pas), dans lequel se trouve normalement la bonne clef.
+ +
+ + + + diff --git a/doxygen.conf b/doxygen.conf new file mode 100644 index 0000000..ec0233d --- /dev/null +++ b/doxygen.conf @@ -0,0 +1,1117 @@ +# Doxyfile 1.3.6-20040222 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = CryptAfinity + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/ + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, +# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en +# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, +# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = French + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = src/ + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm + +FILE_PATTERNS = *.cpp *.hh + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = YES + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = YES + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = YES + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..16f2e66 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,2 @@ +SUBDIRS = lib tools + diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am new file mode 100644 index 0000000..58c356a --- /dev/null +++ b/src/lib/Makefile.am @@ -0,0 +1,38 @@ +SUBDIRS = . + +lib_LTLIBRARIES = libcryptafinity.la + +#bin_PROGRAMS = libulm.o + +libcryptafinity_la_SOURCES = alphabet.cpp \ + key.cpp \ + text.cpp \ + codec.cpp \ + letter.cpp \ + codec_afine.cpp \ + codec_vigenere.cpp \ + key_afine.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 \ +# XSock.hh + +libcryptafinity_la_CFLAGS = -DTRACE -static +libcryptafinity_la_LDFLAGS = -version-info 3:12:1 + +#INCLUDES= SQLITE3_CFLAGS@ \ +# LIBXMLPP_CFLAGS@ \ +# -I./ + +#libcryptafinity_a_LDFLAGS= @LDFLAGS@ + +#SQLITE3_LIBS@ LIBPCRE_LIBS@ + + diff --git a/src/lib/alphabet.cpp b/src/lib/alphabet.cpp new file mode 100644 index 0000000..16df967 --- /dev/null +++ b/src/lib/alphabet.cpp @@ -0,0 +1,31 @@ + +#include "alphabet.hh" + +namespace LibCryptAfinity { + + Alphabet::Alphabet() : std::vector() { } + + Alphabet::Alphabet(std::string alphaString) : std::vector() { + int i; + std::string e; + for (i = 0; i < alphaString.length(); i++){ + e.erase(); + e+=alphaString[i]; + this->push_back(e); + } + } + + ReverseAlphabet Alphabet::getReverse() { + ReverseAlphabet ra; + int i; + std::string c; + for (i=0; i< this->size(); i++){ + c = (*this)[i]; + ra[c] = i; + //printf("%d->%s ",i,this->_alphabet[i].c_str()); + } + //printf("\n"); + return ra; + } + +} diff --git a/src/lib/alphabet.hh b/src/lib/alphabet.hh new file mode 100644 index 0000000..6e01161 --- /dev/null +++ b/src/lib/alphabet.hh @@ -0,0 +1,21 @@ +#ifndef _LIBCRYPAFINITY_ALPHABET_HH +#define _LIBCRYPAFINITY_ALPHABET_HH + + +#include "cryptafinity_global.hh" +#include "cryptafinity_iface.hh" + +namespace LibCryptAfinity { + class ReverseAlphabet: public std::map { + }; + + class Alphabet : public std::vector { + public: + Alphabet(); + Alphabet(std::string alphaString); + ReverseAlphabet getReverse(); + }; + +} + +#endif diff --git a/src/lib/codec.cpp b/src/lib/codec.cpp new file mode 100644 index 0000000..05aa2a1 --- /dev/null +++ b/src/lib/codec.cpp @@ -0,0 +1,12 @@ + +#include "codec.hh" + +namespace LibCryptAfinity { + Codec::Codec(){ + } + + Text Codec::encode(Text t, Key k) { } + + Text Codec::decode(Text t, Key k) { } + +} diff --git a/src/lib/codec.hh b/src/lib/codec.hh new file mode 100644 index 0000000..dde9e3f --- /dev/null +++ b/src/lib/codec.hh @@ -0,0 +1,22 @@ +#ifndef _LIBCRYPAFINITY_CODEC_HH +#define _LIBCRYPAFINITY_CODEC_HH + + +#include "text.hh" +#include "key.hh" +#include "cryptafinity_global.hh" +#include "cryptafinity_iface.hh" + +namespace LibCryptAfinity { + class Codec { + private: + public: + Codec(); + + virtual Text encode(Text plaintext, Key key); + virtual Text decode(Text plaintext, Key key); + + }; +} + +#endif diff --git a/src/lib/codec_afine.cpp b/src/lib/codec_afine.cpp new file mode 100644 index 0000000..3949788 --- /dev/null +++ b/src/lib/codec_afine.cpp @@ -0,0 +1,29 @@ + +#include "codec_afine.hh" +#include "math_tools.hh" + +namespace LibCryptAfinity { + CodecAfine::CodecAfine() : Codec() { + } + + Text CodecAfine::decode(Text cypher, KeyAfine key){ + Text result = cypher; + MathTools mt; + int i; + for (i=0; i +#include +#include +#include +#include + +#define COLOR_GREEN "\x1B[33m" +#define COLOR_NORMAL "\x1B[0m" + +#ifndef pDEBUG +#define pDEBUG(x,...) if (DEBUG){ \ + printf("%s:%d/ %s",x,__LINE__,COLOR_GREEN); \ + printf(__VA_ARGS__); \ + printf("%s",COLOR_NORMAL); \ + } +#endif + +#endif diff --git a/src/lib/cryptafinity_iface.hh b/src/lib/cryptafinity_iface.hh new file mode 100644 index 0000000..b4093bb --- /dev/null +++ b/src/lib/cryptafinity_iface.hh @@ -0,0 +1,4 @@ +#ifndef _CRYPTAFINITY_IFACE_HH +#define _CRYPTAFINITY_IFACE_HH + +#endif diff --git a/src/lib/cryptafinity_proto.hh b/src/lib/cryptafinity_proto.hh new file mode 100644 index 0000000..a09450f --- /dev/null +++ b/src/lib/cryptafinity_proto.hh @@ -0,0 +1,14 @@ +#ifndef _CRYPTAFINITY_PROTO_HH +#define _CRYPTAFINITY_PROTO_HH + +#include "math_tools.hh" +#include "alphabet.hh" +#include "text.hh" +#include "key.hh" +#include "key_vigenere.hh" +#include "freq_analyser.hh" +#include "codec.hh" +#include "codec_vigenere.hh" +#include "codec_afine.hh" + +#endif diff --git a/src/lib/freq_analyser.cpp b/src/lib/freq_analyser.cpp new file mode 100644 index 0000000..dbd3c76 --- /dev/null +++ b/src/lib/freq_analyser.cpp @@ -0,0 +1,36 @@ + + +#include "freq_analyser.hh" + +#define DEBUG 0 + +namespace LibCryptAfinity { + std::list FreqAnalyser::getPriorities(Text text, int keylen, int column){ + std::list result; + std::map counter; + std::map::iterator countIt; + int i; + for (i=0; ifirst); + tc.setCount(countIt->second); + pDEBUG("FreqAnalyser"," Letter %s found %d times\n",tc.getText().toString().c_str(), tc.getCount()); + result.push_back(tc); + } + result.sort(); + result.reverse(); + return result; + } +} diff --git a/src/lib/freq_analyser.hh b/src/lib/freq_analyser.hh new file mode 100644 index 0000000..73fae65 --- /dev/null +++ b/src/lib/freq_analyser.hh @@ -0,0 +1,19 @@ +#ifndef _LIBCRYPTAFINITY_FREQANALYSER_HH +#define _LIBCRYPTAFINITY_FREQANALYSER_HH + +#include "cryptafinity_global.hh" +#include "cryptafinity_iface.hh" + +#include "text.hh" // body + +namespace LibCryptAfinity { + + class FreqAnalyser { + private: + + public: + std::list getPriorities(Text t, int keylen, int column); + }; + +} +#endif diff --git a/src/lib/key.cpp b/src/lib/key.cpp new file mode 100644 index 0000000..29e595e --- /dev/null +++ b/src/lib/key.cpp @@ -0,0 +1,8 @@ + +#include "key.hh" + +namespace LibCryptAfinity { + Key::Key() { } + +// std::string Key::toString() { } +} diff --git a/src/lib/key.hh b/src/lib/key.hh new file mode 100644 index 0000000..7b15a66 --- /dev/null +++ b/src/lib/key.hh @@ -0,0 +1,20 @@ +#ifndef _CRYPTAFINIY_KEY_HH +#define _CRYPTAFINIY_KEY_HH + + +//#include "text.hh" + +//#include "cryptafinity_global.hh" +//#include "cryptafinity_iface.hh" + +namespace LibCryptAfinity { + class Key { + private: + public: + Key(); + + //std::string toString(); + }; +} + +#endif diff --git a/src/lib/key_afine.cpp b/src/lib/key_afine.cpp new file mode 100644 index 0000000..cf52deb --- /dev/null +++ b/src/lib/key_afine.cpp @@ -0,0 +1,38 @@ + +#include "key_afine.hh" + +#include "cryptafinity_global.hh" +#include "cryptafinity_iface.hh" + +namespace LibCryptAfinity { + + int KeyAfine::getCoefA(){ + return this->_a; + } + int KeyAfine::getCoefB(){ + return this->_b; + } + + void KeyAfine::setCoefA(int i){ + this->_a = i; + } + + void KeyAfine::setCoefB(int i){ + this->_b = i; + } + + std::string KeyAfine::toString(){ + std::string s; + s="( "; + char * c= new char[200]; + sprintf(c,"%d",this->_a); + s+=c; + s+=", "; + sprintf(c,"%d",this->_b); + s+=c; + s+=")"; + + return s; + } +} + diff --git a/src/lib/key_afine.hh b/src/lib/key_afine.hh new file mode 100644 index 0000000..8c193bc --- /dev/null +++ b/src/lib/key_afine.hh @@ -0,0 +1,27 @@ +#ifndef _CRYPTAFINIY_KEYAFINE_HH +#define _CRYPTAFINIY_KEYAFINE_HH + +#include "cryptafinity_global.hh" +#include "cryptafinity_iface.hh" + +#include "key.hh" // declaration +#include "text.hh" // body + +namespace LibCryptAfinity { + class KeyAfine : public Key { + private: + int _a; + int _b; + + public: + void setCoefA(int i); + void setCoefB(int i); + + int getCoefA(); + int getCoefB(); + + std::string toString(); + }; +} + +#endif diff --git a/src/lib/key_vigenere.cpp b/src/lib/key_vigenere.cpp new file mode 100644 index 0000000..5bf1a6e --- /dev/null +++ b/src/lib/key_vigenere.cpp @@ -0,0 +1,14 @@ + +#include "key_vigenere.hh" + +namespace LibCryptAfinity { + KeyVigenere::KeyVigenere() : Key(), Text() { // Key() + int i; + i=0; + } + +/* KeyVigenere::toString() { + Text *t = this; + this->toString(); + } */ +} diff --git a/src/lib/key_vigenere.hh b/src/lib/key_vigenere.hh new file mode 100644 index 0000000..1c02812 --- /dev/null +++ b/src/lib/key_vigenere.hh @@ -0,0 +1,19 @@ +#ifndef _CRYPTAFINIY_KEYVIGENERE_HH +#define _CRYPTAFINIY_KEYVIGENERE_HH + +#include "cryptafinity_global.hh" +#include "cryptafinity_iface.hh" + +#include "text.hh" +#include "key.hh" + +namespace LibCryptAfinity { + class KeyVigenere : public Key, public Text { + private: + public: + KeyVigenere(); + + }; +} + +#endif diff --git a/src/lib/letter.cpp b/src/lib/letter.cpp new file mode 100644 index 0000000..549007c --- /dev/null +++ b/src/lib/letter.cpp @@ -0,0 +1,17 @@ +#include "letter.hh" + +namespace LibCryptAfinity { + + Letter::Letter(const Letter &orig){ + this->_alphabet = orig._alphabet; + } + + Alphabet Letter::getAlphabet() { + return this->_alphabet; + } + + void Letter::setAlphabet(Alphabet alpha) { + this->_alphabet = alpha; + } +} + diff --git a/src/lib/letter.hh b/src/lib/letter.hh new file mode 100644 index 0000000..c25c227 --- /dev/null +++ b/src/lib/letter.hh @@ -0,0 +1,22 @@ +#ifndef _LIBCRYPTAFINITY_LETTER_HH +#define _LIBCRYPTAFINITY_LETTER_HH + +#include "cryptafinity_global.hh" +#include "cryptafinity_iface.hh" + +#include "alphabet.hh" + +namespace LibCryptAfinity { + class Letter { + private: + Alphabet _alphabet; + int _value; + + public: + Letter(const Letter &orig); + Alphabet getAlphabet(); + void setAlphabet(Alphabet alpha); + }; +} + +#endif diff --git a/src/lib/math_tools.cpp b/src/lib/math_tools.cpp new file mode 100644 index 0000000..bcc60c2 --- /dev/null +++ b/src/lib/math_tools.cpp @@ -0,0 +1,114 @@ + +#include "math_tools.hh" + +#define DEBUG 1 + +namespace LibCryptAfinity { + + int MathTools::pgcd(int a, int b){ + int fa = a; + int fb = b; + int pgcd; + int rest; + int tmp; + + while(b > 0){ + if (a %d\n", a,b,rest); + a = b; + b = rest; + } + pDEBUG("MathTools::pgcd","%d - %d -> %d\n", fa,fb,a); + return a; + } + + int MathTools::ppcm(int a, int b){ + } + + + std::vector MathTools::pgcd_real(int * reste, int * quotient, int * coef_first, int * coef_second, int pas){ + std::vector result; + int nreste = reste[0] % reste[1]; + int nquotient; + int ncf, ncs; // coef first , coef sec + + if (nreste == 0){ + result.push_back(reste[1]); + if (pas % 2 == 0) { + result.push_back(coef_first[1]); + result.push_back(-coef_second[1]); + } else { + result.push_back(-coef_first[1]); + result.push_back(coef_second[1]); + } + return result; + } else { + nquotient = reste[1] / nreste; + ncf = quotient[1] * coef_first[1] + coef_first[0]; + ncs = quotient[1] * coef_second[1] + coef_second[0]; + + reste[0] = reste[1]; + reste[1] = nreste; + + quotient[0] = quotient[1]; + quotient[1] = nquotient; + + coef_first[0] = coef_first[1]; + coef_first[1] = ncf; + + coef_second[0] = coef_second[1]; + coef_second[1] = ncs; + + return pgcd_real(reste, quotient, coef_first, coef_second, pas+1); + } + } + + std::vector MathTools::pgcd_mod(int a, int b){ + int reste[2]; + int quotient[2]; + int coef_first[2]; + int coef_second[2]; + int i; + + //init + reste[0] = a; + reste[1] = b; + + quotient[0] = 0; + quotient[1] = a / b; + + coef_first[0] = 1; + coef_first[1] = 0; + + coef_second[0] = 0; + coef_second[1] = 1; + + return this->pgcd_real(reste, quotient, coef_first, coef_second, 1); + } + + int MathTools::inverse(int a, int modulo){ + std::vector pgcd_vec; + int ca, cm, cpgcd; + pgcd_vec = this->pgcd_mod(a, modulo); + + ca = pgcd_vec[1]; + cm = pgcd_vec[2]; + cpgcd = pgcd_vec[0]; + + if (cpgcd != 1) { + // crash + pDEBUG("MathTools::inverse","CRASHHHHHH"); + } else { + while (ca < 0){ + ca = (ca + modulo); + } + // ca est positif; + ca = ca % modulo; + } + return ca; + } +} + +#undef DEBUG diff --git a/src/lib/math_tools.hh b/src/lib/math_tools.hh new file mode 100644 index 0000000..1a74f1e --- /dev/null +++ b/src/lib/math_tools.hh @@ -0,0 +1,23 @@ +#ifndef _LIBCRYPTAFINITY_MATHTOOLS_HH +#define _LIBCRYPTAFINITY_MATHTOOLS_HH + +#include "cryptafinity_global.hh" +#include "cryptafinity_iface.hh" + +namespace LibCryptAfinity { + class MathTools { + private: + std::vector MathTools::pgcd_real(int * reste, int * quotient, int * coef_first, int * coef_second, int pas); + + public: + int pgcd(int a, int b); + int ppcm(int a, int b); + + std::vector MathTools::pgcd_mod(int a, int b); + + int MathTools::inverse(int a, int modulo); + + }; +} + +#endif diff --git a/src/lib/text.cpp b/src/lib/text.cpp new file mode 100644 index 0000000..de97936 --- /dev/null +++ b/src/lib/text.cpp @@ -0,0 +1,186 @@ + +#include "text.hh" + +#define DEBUG 0 +namespace LibCryptAfinity { + bool TextCounter::operator< (TextCounter b){ + fflush(stdout); + if (this->_text.size() < b.getText().size()){ + return true; + } else if (this->_text.size() == b.getText().size()) { + // cas de l'egalité des tailles + if (this->_count < b.getCount()){ + return true; + } else { + return false; + } + } else { + // cas du suppérieur + return false; + } + } + void TextCounter::setText(Text t){ + this->_text = t; + } + + int Text::getCountOf(int c){ + int counter =0; + int i; + for (i=0; isize(); i++){ + if ((*this)[i] == c) { + counter++; + } + } + return counter; + } + + Text TextCounter::getText(){ + return this->_text; + } + + void TextCounter::setCount(int i){ + this->_count = i; + } + + int TextCounter::getCount(){ + return this->_count; + } + + void TextCounter::setParam(std::list param){ + this->_param = param; + } + + std::list TextCounter::getParam(){ + return this->_param; + } + + Text::Text(Alphabet alphabet) : std::vector() , _alphabet(alphabet) { + // vide au début + } + + Text::Text() : std::vector() { + // vide au début + } + + void Text::setAlphabet(Alphabet alpha) { + this->_alphabet = alpha; + } + + Alphabet Text::getAlphabet() { return this->_alphabet; } + + void Text::append(std::string str){ + } + + std::list Text::getRepeatedPatterns(){ + // on découpe en patterns de 2 à texte / 3 + std::list result; + int patternsize; + int txt_idx; + int pat_idx; + bool pattern_active; + bool * active = new bool[this->size()]; + for (txt_idx=0; txt_idx < this->size(); txt_idx++){ + active[txt_idx] = true; + } + + pDEBUG("Text::getRepeatedPatterns","getRepeatedPatterns\n"); + int max_patternsize = (this->size() / 3); + for (patternsize=max_patternsize; patternsize>1; patternsize--){ + std::map counter; + std::map > referencer; + for (txt_idx = 0; txt_idx < this->size()-patternsize; txt_idx++){ + pattern_active = true; + Text currentword; + for (pat_idx = 0; pat_idx refs = referencer[currentword]; + std::list::iterator refsIt; + for(refsIt=refs.begin(); refsIt!=refs.end(); refsIt++){ + for (pat_idx=0; pat_idx::iterator counterIt; + for (counterIt=counter.begin(); + counterIt!=counter.end(); + counterIt++){ + // si la freq est > 1; on l'ajoute a la liste des + // mots doublons, avec la freq... + if (counterIt->second > 1) { + TextCounter tc; + tc.setText(counterIt->first); + tc.setCount(counterIt->second); + tc.setParam(referencer[counterIt->first]); + result.push_back(tc); + } + } + } + printf("out\n"); + result.sort(); + result.reverse(); + return result; + } + + Text Text::substr(int index, int len){ + Text result; + int i; + for (i=index; isize(); i++){ + s+=this->_alphabet[(*this)[i]]; + } + free(c); + s+=">>"; + return s; + } + + std::string Text::toString(){ + int i; + std::string s; + s+="[ "; + char * c = new char[1024]; + for (i=0; isize(); i++){ + sprintf(c, "%d ", (*this)[i]); + s+=c; + } + free(c); + s+="]"; + return s; + } +} + +#undef DEBUG diff --git a/src/lib/text.hh b/src/lib/text.hh new file mode 100644 index 0000000..4f7fa4f --- /dev/null +++ b/src/lib/text.hh @@ -0,0 +1,56 @@ +#ifndef _LIBCRYPAFINITY_TEXT_HH +#define _LIBCRYPAFINITY_TEXT_HH + +#include "cryptafinity_global.hh" +#include "cryptafinity_iface.hh" + +#include "alphabet.hh" + +namespace LibCryptAfinity { + class TextCounter; + + class Text : public std::vector { + private: + Alphabet _alphabet; + ReverseAlphabet _reverse_alphabet; + + public: + Text(); + Text(Alphabet alphabet); + + void setAlphabet(Alphabet alpha); + Alphabet getAlphabet(); + + // on considere le texte comme + void append(std::string str); + Text substr(int start, int len); + std::string toString(); + std::string toAlphabet(); + + int getCountOf(int c); + std::list getRepeatedPatterns(); + }; + + class TextCounter { + private: + Text _text; + int _count; + std::list _param; + + public: + void setText(Text t); + Text getText(); + + void setCount(int c); + int getCount(); + + void setParam(std::list param); + std::list getParam(); + + bool operator< (TextCounter b); + }; + +} + +#endif + diff --git a/src/lib/word_list.cpp b/src/lib/word_list.cpp new file mode 100644 index 0000000..9318887 --- /dev/null +++ b/src/lib/word_list.cpp @@ -0,0 +1,42 @@ + +#include "word_list.hh" + +namespace LibCryptAfinity { + std::map WordList::getWordsContaining(int value){ + std::map result; + std::map::iterator foundVal; + while ((foundVal = this->_letter2wordnref.find(value)) + != this->_letter2wordnref.end()) { + printf("Ajouter mot/ref aux result\n"); + } + return result; + } + + void WordList::addWord(Text t, int ref, int len){ + int i; + printf("addWord %s : %d : %d -> ", t.toString().c_str(), ref, len); + fflush(stdout); + std::map::iterator foundVal; + foundVal = this->_word2int.find(t); + // 1- verifier que le mot n'existe pas déja + // s'il existe, abandonner + if (foundVal != this->_word2int.end()){ + printf("old\n"); + // le mot existe déja, on laisse tomber alors; + } else { + printf("new\n"); + // le mot n'existe pas, on l'ajoute alors... + this->_word2int[t]=1; + + // 2- pour toute lettre du mot, créer l'association + // lettre => (mot, position_dans_le_mot); + for (i=0; i (%s, %d)\n", t[i], t.toString().c_str(), i); + this->_letter2wordnref[t[i]]=tc; + } + } + } +} diff --git a/src/lib/word_list.hh b/src/lib/word_list.hh new file mode 100644 index 0000000..8debf30 --- /dev/null +++ b/src/lib/word_list.hh @@ -0,0 +1,21 @@ +#ifndef _CRYPTAFINIY_WORDLIST_HH +#define _CRYPTAFINIY_WORDLIST_HH + +#include +#include "text.hh" + +namespace LibCryptAfinity { + class WordList { + private: + std::map _word2int; // existance du mot + std::map _letter2wordnref; + + public: + // texte, reference dans le texte global, longueur + void addWord(Text t, int ref, int len); + + // retourne les mots qui contiennent le caractere choisi + std::map getWordsContaining(int val); + }; +} +#endif diff --git a/src/runAfine.sh b/src/runAfine.sh new file mode 100755 index 0000000..1281c13 --- /dev/null +++ b/src/runAfine.sh @@ -0,0 +1 @@ +./tools/break_afinity -a tests/alphabet.txt -f 0.7 -m a -p tests/priority.txt -t tests/afine.txt -e 0.1 diff --git a/src/runVigenere.sh b/src/runVigenere.sh new file mode 100755 index 0000000..564cd30 --- /dev/null +++ b/src/runVigenere.sh @@ -0,0 +1 @@ +./tools/break_afinity -a tests/alphabet.txt -f 0.7 -m v -p tests/priority.txt -t tests/vigenere.txt -e 0.05 diff --git a/src/tools/Makefile.am b/src/tools/Makefile.am new file mode 100644 index 0000000..0e62905 --- /dev/null +++ b/src/tools/Makefile.am @@ -0,0 +1,36 @@ +#AM_YFLAGS = -d -v + +SUBDIRS = . + +bin_PROGRAMS = break_afinity + + +break_afinity_SOURCES = main.cpp ba_cmd.cpp ba_config.cpp file_loader.cpp ba_vigenere.cpp ba_afine.cpp + +# ftp_client.cpp \ +# ftp_client_cmd.cpp \ +# ftp_client_data.cpp \ +# 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 + +# ftp_config.hh \ +# miniftp_global.hh \ +# miniftp.hh \ +# miniftp_iface.hh \ +# miniftp_proto.hh \ +# server_msg.hh + +INCLUDES= -I../lib/ -I./ @GLIB2_CFLAGS@ @TARGET_READLINE_INC@ + +#BUILT_SOURCES = source_parser.h source_lexer.cc + + +# LEXLIB@ +# libyalag.la +# miniftpc_INCLUDE = a + +break_afinity_LDADD = -lcryptafinity @GLIB2_LIBS@ +break_afinity_LDFLAGS = @LDFLAGS@ -L../lib -L../lib/.libs + diff --git a/src/tools/ba_afine.cpp b/src/tools/ba_afine.cpp new file mode 100644 index 0000000..95de2f2 --- /dev/null +++ b/src/tools/ba_afine.cpp @@ -0,0 +1,66 @@ + +#include +#include "ba_cmd.hh" + +#define DEBUG 1 + +namespace BreakAfinity { + + void BreakAfinity::runAfine(){ + MathTools mt; + CodecAfine codec; + FreqAnalyser fa; + Text cypherText = this->_config.getText(); + Text plainText; + int i; + std::list tc; + cypherText.setAlphabet(this->_config.getAlphabet()); + int alpha_size = this->_config.getAlphabet().size(); + std::vector prio_conf = this->_config.getPriorities(); + + // générer l'orbite de 26 + std::list orb; + for (i=1; i keyList; + std::list::iterator orbIt; + + for (orbIt = orb.begin(); orbIt != orb.end(); orbIt++){ + KeyAfine key; + key.setCoefA((*orbIt)); + for (i=0; i::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 - this->_config.getFrequencies()) < this->_config.getEpsilon()){ + printf(" KEY = %s\n",(*kLIt).toString().c_str()); + printf(" PLAIN TEXT(%f) = %s\n",fabs(score-0.7),plainText.toAlphabet().c_str()); + } + + } + + return ; + } +} + +#undef DEBUG diff --git a/src/tools/ba_cmd.cpp b/src/tools/ba_cmd.cpp new file mode 100644 index 0000000..1fbf0ad --- /dev/null +++ b/src/tools/ba_cmd.cpp @@ -0,0 +1,95 @@ + +#include +#include "ba_cmd.hh" + +#define DEBUG 0 + +namespace BreakAfinity { + BreakAfinity::BreakAfinity(){ + // on fixe la config par defaut + int i; + i=i+1; + } + + void BreakAfinity::loadFiles(){ + printf("ALIVE !!!\n"); + this->_config.loadFiles(); + printf("ALIVE ???\n"); + } + + void BreakAfinity::init(int argc, char **argv) { + int i; + + for (i = 1; i + 1 < argc; i = i + 2){ + char * opt = argv[i]; //GOOD + char * val = argv[i+1]; //GOOD + if ( (strcmp(opt, "--alphabet") == 0) || (strcmp(opt,"-a") == 0) ){ + this->_config.setAlphabetFile(val); + continue; + } + if ( (strcmp(opt, "--epsilon") == 0) || (strcmp(opt,"-e") == 0) ){ + this->_config.setEpsilon(atof(val)); + continue; + } + if ( (strcmp(opt, "--priorities") == 0) || (strcmp(opt,"-p") == 0) ){ + this->_config.setPrioritiesFile(val); + continue; + } + if ( (strcmp(opt, "--frequencies") == 0) || (strcmp(opt,"-f") == 0) ){ + this->_config.setFrequencies(atof(val)); //File(val); + continue; + } + if ( (strcmp(opt, "--text") == 0) || (strcmp(opt,"-t") == 0) ){ + this->_config.setTextFile(val); + continue; + } + if ( (strcmp(opt, "--mode") == 0) || (strcmp(opt,"-m") == 0) ){ + this->_config.setMode(val); + continue; + } + /* + printf("Option = %s, ",argv[i]); + printf("value = %s\n",argv[i+1]); + */ + } + + if (!this->_config.areParamReady()) + { + printf("\nUsage: %s \n", argv[0]); + printf("\nWhere options could be:\n"); + printf("-a, --alphabet Letters ordered by decreasing frequency\n"); + printf("-e, --epsilon Tolerance for the final key test\n"); + printf("-f, --frequencies Average frequencies for the 9 first letters\n"); + printf("-m, --mode ( v | a ) Choose the kind of cypher : vigenere or afine.\n"); + printf("-p, --priorities Letters ordered by decreasing frequency\n"); + printf("-t, --text Cipher text to decipher\n"); + //printf("-s, --popsize Population size in each generation\n"); + + exit(-1); + } else { + printf("continuing..."); + } + } + + void BreakAfinity::run(){ + // vigenere ou affine ? + MathTools mt; + CodecVigenere codec; + FreqAnalyser fa; + Text cypherText = this->_config.getText(); + Text plainText; + std::list tc; + cypherText.setAlphabet(this->_config.getAlphabet()); + int alpha_size = this->_config.getAlphabet().size(); + printf("Alive ==\n"); + if (this->_config.isModeVigenere()){ + printf("Selecting Vigenere mode\n"); + this->runVigenere(); + } else { + printf("Selecting Afine mode\n"); + this->runAfine(); + } + } +} + +#undef DEBUG diff --git a/src/tools/ba_cmd.hh b/src/tools/ba_cmd.hh new file mode 100644 index 0000000..7282cde --- /dev/null +++ b/src/tools/ba_cmd.hh @@ -0,0 +1,27 @@ +#ifndef _BREAKAFINITY_CMD_HH +#define _BREAKAFINITY_CMD_HH + +#include +#include + +#include "breakafinity.hh" +#include "ba_config.hh" + + +namespace BreakAfinity { + + class BreakAfinity { + private: + BreakerConfig _config; + public: + BreakAfinity(); + void init(int argc, char ** argv); + void loadFiles(); + void run(); + void runAfine(); + void runVigenere(); + }; + +} + +#endif diff --git a/src/tools/ba_config.cpp b/src/tools/ba_config.cpp new file mode 100644 index 0000000..7df89a9 --- /dev/null +++ b/src/tools/ba_config.cpp @@ -0,0 +1,169 @@ + +#include "ba_config.hh" +#include "file_loader.hh" + +namespace BreakAfinity { + void BreakerConfig::setMode(char * m){ + switch(m[0]){ + case 'v': + case 'V': + this->_modeVigenere = true; + break; + case 'a': + case 'A': + this->_modeVigenere = false; + break; + default: + this->_modeVigenere = true; + break; + } + + } + + bool BreakerConfig::isModeVigenere(){ + return this->_modeVigenere; + } + + BreakerConfig::BreakerConfig(){ + this->_key_length = -1; + this->_modeVigenere = true; + } + + Alphabet BreakerConfig::getAlphabet(){ + return this->_alphabet; + } + + void BreakerConfig::setFrequencies(float f){ + this->_frequencies = f; + } + + float BreakerConfig::getFrequencies(){ + return this->_frequencies; + } + + void BreakerConfig::setEpsilon(float e){ + this->_epsilon = e; + } + + float BreakerConfig::getEpsilon(){ + return this->_epsilon; + } + + bool BreakerConfig::areParamReady(){ + printf("Testing parameters\n"); + if ( (this->_text_file.length() > 0) + /* && (this->_frequencies_file.length() > 0) */ + && (this->_priorities_file.length() > 0) + && (this->_alphabet_file.length() > 0) + && (this->_epsilon > 0) && (this->_epsilon < 1) + ) { + printf("Param OK !\n"); + return true; } + else { + return false; + } + } + + void BreakerConfig::loadFiles(){ + FileLoader filo; + printf("Loading alphabet..."); fflush(stdout); + this->_alphabet = filo.loadAlphabet(this->_alphabet_file); + printf("Building reverse alphabet...\n"); fflush(stdout); + this->_reverse_alphabet = this->_alphabet.getReverse(); + printf("Loading text..."); fflush(stdout); + this->_text = filo.loadText(this->_reverse_alphabet, + this->_text_file); + printf("Loading priorities..."); fflush(stdout); + this->_priorities = filo.loadPriorities(this->_reverse_alphabet, + this->_priorities_file); + //printf("Loading frequencies..."); fflush(stdout); + //this->_frequencies = filo.loadFrequencies( + // this->_reverse_alphabet, + // this->_frequencies_file); + } + + void BreakerConfig::setTextFile(std::string filename){ + if (filename.length()<1){ + printf("Error: incorrect text file name '%s'",filename.c_str()); + } else { + printf("Text file = %s\n", filename.c_str()); + this->_text_file = filename; + } + } + + std::string BreakerConfig::getTextFile(){ + return this->_text_file; + } + + void BreakerConfig::setAlphabetFile(std::string filename){ + if (filename.length()<1){ + printf("Error: incorrect alphabet file name '%s'",filename.c_str()); + } else { + printf("Alphabet file = %s\n", filename.c_str()); + this->_alphabet_file = filename; + } + } + + std::string BreakerConfig::getAlphabetFile(){ + return this->_alphabet_file; + } + + /* + void BreakerConfig::setFrequenciesFile(std::string filename){ + if (filename.length()<1){ + printf("Error: incorrect frequencies file name '%s'",filename.c_str()); + } else { + printf("Frequencies file = %s\n", filename.c_str()); + this->_frequencies_file = filename; + } + }*/ + + /* std::string BreakerConfig::getFrequenciesFile(){ + return this->_frequencies_file; + } */ + + void BreakerConfig::setPrioritiesFile(std::string filename){ + if (filename.length()<1){ + printf("Error: incorrect priorities file name '%s'",filename.c_str()); + } else { + printf("Priorities file = %s\n", filename.c_str()); + this->_priorities_file = filename; + } + } + + std::string BreakerConfig::getPrioritiesFile(){ + return this->_priorities_file; + } + + void BreakerConfig::setKeyLength(int len){ + if (len < 1){ + printf("Error: incorrect key length '%d'",len); + + } else { + printf("Key length = %d\n", len); + this->_key_length = len; + } + } + + Text BreakerConfig::getText(){ + return this->_text; + } + + std::vector BreakerConfig::getPriorities(){ + return this->_priorities; + + /* + std::list result; + std::map::iterator prioIt; + + for (prioIt = this->_priorities.begin(); + prioIt != this->_priorities.end(); + prioIt++){ + TextCounter tc; + + result.push_back(tc); //FIXME: fill the tc + } + return result;*/ + } + +} diff --git a/src/tools/ba_config.hh b/src/tools/ba_config.hh new file mode 100644 index 0000000..6bc0950 --- /dev/null +++ b/src/tools/ba_config.hh @@ -0,0 +1,74 @@ +#ifndef _BREAKAFINITY_CONFIG_HH +#define _BREAKAFINITY_CONFIG_HH + +#include +#include +#include + +#include "alphabet.hh" +#include "text.hh" + +using namespace LibCryptAfinity; + +namespace BreakAfinity { + class BreakerConfig { + private: + bool _modeVigenere; + int _key_length; + + std::string _alphabet_file; + std::string _text_file; + std::string _frequencies_file; + std::string _priorities_file; + float _epsilon; + + Alphabet _alphabet; + std::map _reverse_alphabet; + Text _text; + //std::map _frequencies; + float _frequencies; + std::vector _priorities; + + public: + BreakerConfig(); + bool areParamReady(); + + void setEpsilon(float e); + float getEpsilon(); + + + void setAlphabetFile(std::string); + std::string getAlphabetFile(); + + // void setFrequenciesFile(std::string); + // std::string getFrequenciesFile(); + + void setPrioritiesFile(std::string); + std::string getPrioritiesFile(); + + void setTextFile(std::string); + std::string getTextFile(); + + void loadFiles(); + + void reverseAlphabet(); + + void setKeyLength(int len); + int getKeyLength(); + + void setMode(char * c); + bool isModeVigenere(); + + Alphabet getAlphabet(); + + float getFrequencies(); + void setFrequencies(float f); + + std::vector getPriorities(); + + Text getText(); + }; + +} + +#endif diff --git a/src/tools/ba_vigenere.cpp b/src/tools/ba_vigenere.cpp new file mode 100644 index 0000000..b615f1c --- /dev/null +++ b/src/tools/ba_vigenere.cpp @@ -0,0 +1,128 @@ + +#include +#include "ba_cmd.hh" + +#define DEBUG 0 + +namespace BreakAfinity { + + void BreakAfinity::runVigenere(){ + MathTools mt; + CodecVigenere codec; + FreqAnalyser fa; + Text cypherText = this->_config.getText(); + Text plainText; + std::list tc; + cypherText.setAlphabet(this->_config.getAlphabet()); + 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()); + KeyVigenere key; + TextCounter fst; + TextCounter sec; + int dist1, dist2; + int fst_idx1, fst_idx2; + int sec_idx1, sec_idx2; + int key_len; + int key_idx; + + tc = cypherText.getRepeatedPatterns(); + + fst = tc.front(); + tc.pop_front(); + sec = tc.front(); + + std::list fst_idx = fst.getParam(); + std::list sec_idx = sec.getParam(); + + fst_idx1 = fst_idx.front(); + fst_idx.pop_front(); + fst_idx2 = fst_idx.front(); + + sec_idx1 = sec_idx.front(); + sec_idx.pop_front(); + sec_idx2 = sec_idx.front(); + + dist1 = fst_idx2 - fst_idx1; + dist2 = sec_idx2 - sec_idx1; + + // 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); + + // 3 - on calcule le décalage par colonne + std::list::iterator pI; + std::vector prio_conf = this->_config.getPriorities(); + + for (int i=0; i< prio_conf.size(); i++){ + printf("%d - ",prio_conf[i]); + } + printf("\n"); + std::list keyList; + std::list::iterator lI; + + for (key_idx = 0; key_idx < key_len; key_idx++){ + std::list prio_list; + TextCounter firstCypherTC, firstPlainTC; + int firstCypher, firstPlain; + int shift; + prio_list = fa.getPriorities(cypherText, key_len, key_idx); + + firstCypherTC = prio_list.front(); + firstCypher = firstCypherTC.getText()[0]; + + std::list nList; + for (int i=0; i<2; i++){ + firstPlain = prio_conf[i]; + //printf("Shift column %d from %d to %d\n", + //key_idx, + //firstCypher, + //firstPlain); + // + // on fixe le décalage a partir de la premiere priorité... + shift = (alpha_size + firstCypher - firstPlain) % alpha_size; + // Cypher = Plain + Key => Key = Cypher - Plain + if(key_idx==0){ + KeyVigenere kv; + kv.push_back(shift); + nList.push_back(kv); + } else { + for (lI=keyList.begin(); lI!=keyList.end(); lI++){ + KeyVigenere kv=*lI; + //printf("From %s ",kv.toString().c_str()); + kv.push_back(shift); + //printf("creating %s\n",kv.toString().c_str()); + nList.push_back(kv); + } + } + } + keyList.clear(); + for (lI=nList.begin(); lI!=nList.end(); lI++){ + keyList.push_back((*lI)); + } + } + // on filtre en fonction des 70%... + for (lI=keyList.begin(); lI!=keyList.end(); lI++){ + float score = 0; + key = (*lI); + printf("Trying key %s\n", key.toString().c_str()); + + plainText = codec.decode(cypherText, key); + 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 - this->_config.getFrequencies()) < this->_config.getEpsilon()){ + key.setAlphabet(this->_config.getAlphabet()); + printf(" KEY = %s\n",key.toAlphabet().c_str()); + printf(" PLAIN TEXT(%f) = %s\n",fabs(score-0.7),plainText.toAlphabet().c_str()); + } + + } + return ; + } +} + +#undef DEBUG diff --git a/src/tools/breakafinity.hh b/src/tools/breakafinity.hh new file mode 100644 index 0000000..d9eff86 --- /dev/null +++ b/src/tools/breakafinity.hh @@ -0,0 +1,8 @@ +#ifndef _BREAKAFINITY_HH +#define _BREAKAFINITY_HH + +#include "breakafinity_global.hh" +#include "breakafinity_iface.hh" +#include "breakafinity_proto.hh" + +#endif diff --git a/src/tools/breakafinity_global.hh b/src/tools/breakafinity_global.hh new file mode 100644 index 0000000..2cd6fe8 --- /dev/null +++ b/src/tools/breakafinity_global.hh @@ -0,0 +1,21 @@ +#ifndef _BREAKAFINITY_GLOBAL_HH +#define _BREAKAFINITY_GLOBAL_HH + +#include +#include + +#include "cryptafinity.hh" + +#define COLOR_GREEN "\x1B[33m" +#define COLOR_NORMAL "\x1B[0m" + + +#ifndef pDEBUG +#define pDEBUG(x,...) if (DEBUG){ \ + printf("%s:%d/ %s",x,__LINE__,COLOR_GREEN); \ + printf(__VA_ARGS__); \ + printf("%s",COLOR_NORMAL); \ + } +#endif + +#endif diff --git a/src/tools/breakafinity_iface.hh b/src/tools/breakafinity_iface.hh new file mode 100644 index 0000000..64c4099 --- /dev/null +++ b/src/tools/breakafinity_iface.hh @@ -0,0 +1,4 @@ +#ifndef _BREAKAFINITY_IFACE_HH +#define _BREAKAFINITY_IFACE_HH + +#endif diff --git a/src/tools/breakafinity_proto.hh b/src/tools/breakafinity_proto.hh new file mode 100644 index 0000000..c4f8278 --- /dev/null +++ b/src/tools/breakafinity_proto.hh @@ -0,0 +1,8 @@ +#ifndef _BREAKAFINITY_PROTO_HH +#define _BREAKAFINITY_PROTO_HH + +#include "ba_cmd.hh" +#include "ba_config.hh" +#include "ba_config.hh" + +#endif diff --git a/src/tools/file_loader.cpp b/src/tools/file_loader.cpp new file mode 100644 index 0000000..f021241 --- /dev/null +++ b/src/tools/file_loader.cpp @@ -0,0 +1,97 @@ + +#include "file_loader.hh" + +using namespace LibCryptAfinity; + +namespace BreakAfinity { + std::vector FileLoader::loadPriorities( + std::map reverse_alpha, + std::string filename){ + + std::vector result; + std::vector file; + int i; + file = this->loadFile(filename); + printf("PRIORITIES = "); fflush(stdout); + for (i=0; i%s ", i, file[i].c_str()); + result.push_back(reverse_alpha[file[i]]); //]=i; + } + printf("\n"); + return result; + } + + std::map FileLoader::loadFrequencies( + std::map reverse_alpha, + std::string filename){ + std::map result; + std::vector file; + int i; + file = this->loadFile(filename); + printf("FREQUENCIES = "); fflush(stdout); + for (i=0; i FileLoader::loadFile(std::string filename){ + gchar * contentc; + gsize length; + GError *error = NULL; + std::vector result; + std::string contents; + std::string sub; + int lf_idx; + g_file_get_contents(filename.c_str(), + &contentc, + &length, + &error); + contents = contentc; + while((lf_idx = contents.find("\n")) != std::string::npos){ + sub = contents.substr(0, lf_idx); + //printf("%s",sub.c_str()); + + contents.erase(0,lf_idx+1); + result.push_back(sub); + } + return result; + } + + Alphabet FileLoader::loadAlphabet(std::string filename){ + std::vector file; + Alphabet result; + file = this->loadFile(filename); + int i; + printf("ALPHABET = "); fflush(stdout); + for (i=0; i reverse_alpha, + std::string filename){ + Text result; + std::vector file; + int i; + int txtidx; + file = this->loadFile(filename); + printf("TEXT = "); fflush(stdout); + for (i=0; i +#include +#include +#include + +#include +#include + +#include "alphabet.hh" +#include "text.hh" + +using namespace LibCryptAfinity; + +namespace BreakAfinity{ + class FileLoader { + private: + public: + std::vector loadPriorities( + std::map reverse_alpha, + std::string filename); + + std::map loadFrequencies( + std::map reverse_alpha, + std::string filename); + + std::vector loadFile(std::string filename); + + Alphabet loadAlphabet(std::string filename); + + Text loadText( + std::map reverse_alpha, + std::string filename); + + }; +} diff --git a/src/tools/main.cpp b/src/tools/main.cpp new file mode 100644 index 0000000..749a059 --- /dev/null +++ b/src/tools/main.cpp @@ -0,0 +1,14 @@ + +#include "breakafinity.hh" +#include "ba_cmd.hh" + +using namespace BreakAfinity; + +int main(int argc, char ** argv){ + BreakAfinity::BreakAfinity br_af; + + br_af.init(argc, argv); + br_af.loadFiles(); + br_af.run(); + return EXIT_SUCCESS; +}