Partage
  • Partager sur Facebook
  • Partager sur Twitter

Crypeur/decrypteur tout simple

mais à amélioré ^^

    12 décembre 2005 à 18:50:04

    [rz0] Utilisez les balises < code type="c"></ code> ou < code type="cpp"></ code> si vous faites du C++ ...

    salut à tous,
    alors voila j'viens d'finir mon crypteur et mon decrypteur, j'les ai pas mit dans l'meme programme parce que j'avais des problèmes pour la conditions :euh: si quelqu'un peut faire ca c'est surement très simple mais là j'suis distrait :p
    Ils sont très simple mais indecryptable par des methodes dico ou brute force enfin j'pense :p , ca m'a soulé de changer la clé a chaque fois mais bon vous pouvez le changer pour faire en sorte que ce soit l'utilisateur qui definisse une clé :D
    Le crypteur:

    #include <cstdlib>
    #include <iostream>

    using namespace std;

    int main(int argc, char *argv[])
    {
        debut:;
        printf("\nTapez le message a crypter et ne faite pas attention au dernier caractere  :\n");     
    char c1;
    long l1;
    long l2;
    char c2;
            do
            {
                    scanf("%c", &c1);
                    l1 = c1;
                    l2 = l1 - 25;
                    if(l2<255)
                    {
                              l2 + 256;
                              }
                              c2 = l2;
                                    printf("%c ", c2);
            }
          while (c1 != '\n');
          goto debut;
        system("PAUSE");
        return EXIT_SUCCESS;
    }

    et le decrypteur

    #include <cstdlib>
    #include <iostream>

    using namespace std;

    int main(int argc, char *argv[])
    {
        debut:;
        printf("\nTapez le message a decrypter,ne faite pas attention au dernier caractere :\n");     
    char c1;
    long l1;
    long l2;
    char c2;
            do
            {
                    scanf("%c", &c1);
                    l1 = c1;
                    l2 = l1 + 25;
                    if(l2>255)
                    {
                              l2 - 256;
                              }
                              c2 = l2;
                                    printf("%c ", c2);
            }
          while (c1 != '\n');
          goto debut;
        system("PAUSE");
        return EXIT_SUCCESS;
    }

    voila je sais que c'est inifniment simple, j'l'ai fais en 20minutes là :-°
    si vous avez des conseil ou des améliorations j'suis preneur
    • Partager sur Facebook
    • Partager sur Twitter
      12 décembre 2005 à 19:09:56

      Goto c' est le mal !!

      Essais de l' enlever.

      Sinon il on des departement entier de mathematicien pour essais de trouver le codage parfais. Ton code marche juste sur un systeme de substitution donc tres facile a cassez mais c'est deja un debut !! :p
      • Partager sur Facebook
      • Partager sur Twitter
        12 décembre 2005 à 19:11:29

        Ben je pense pas que ce système soit infaillible : au pire, je teste les 256-1 décalages possibles et je retombe sur ta phrase d'origine.

        Toute la technique de chiffrement doit reposer sur un secret (la clef), et il doit être impossible pratiquement de déchiffrer sans la clef. Par exemple, une compression ZIP ne constitue pas une protection car même si cela altère les fichiers, il suffit d'effectuer une décompression pour retrouver le message en clair ;)

        Hors ici, il n'y a pas de clef. Il suffit donc de regarder l'algorithme pour casser la protection.

        Bref, intéressant pour un début, mais dépassé depuis 2000 ans (Jules César utilisait déja ce système, et les ennemis de Jules César savaient déja comment le contourner).

        Comme prochaine solution, je te conseille le chiffrement de Vigenère (un lien). Puis le chiffrement par OU exclusif (très facile à faire en C, et permet de chiffrer des fichiers de façon robuste). Puis viendra le temps du RSA, et de l'algorithme d'Euclide étendu :)

        Bon courage, le chiffrement est très intéressant mais difficile.

        PS : D'un point vue pratique : ca serait sympa si l'utilisateur pouvait entrer une phrase, et ton programme ressort toute la phrase chiffrée. Car lettre par lettre

        1 - C'est pas joli
        2 - C'est lent (image qu'un autre programme veuille utiliser le tien, il doit se farcir l'encodage lettre par lettre :euh:
        3 - Ca fait apparaître un caractère sans signification à la fin.

        Le mieux serait d'avoir une fonction qui prend une chaîne de caractère et en rejette une autre.

        PPS : Avec ton procédé, certains caractères ne seront plus lisibles pour un humain, car ne correspondant plus à un code ASCII de caractère. Si tu comptes ne chiffrer que du texte, il serait intéressant que ton programme ne sorte que du texte lisible (a-z , A-Z, 0-9, etc)
        • Partager sur Facebook
        • Partager sur Twitter
          12 décembre 2005 à 19:13:26

          et tu nfais comment pour le casser?
          mais pour le rendre plus compliquer faudrait qu'il génère une clés au hasard qui ai le meme nombre de caractère que le message a code et pour ca faudrait que j'arrive a faire une variable qui contient une chaine de caractère et ca j'arrive pas xD, j'débute en C j'ai commencer y'a genre 1/2 semaine
          sinon pourquoi tu dis que goto c'est l'mal, moi j'aime bien pour faire les test avec le prog ...
          edit pour supermat:
          il doit etre très dur a casser si on a pas la source hein parce qu'avec la source bah.. il est meme plus crypter :D
          edit²:
          j'viens d'trouver pour avoir que des lettres, il me faudrait un llien avec la liste des valeur ascii pour savoir quelle est la valeur ascii de la denrière lettre
          • Partager sur Facebook
          • Partager sur Twitter
            12 décembre 2005 à 21:03:05

            Citation : dOsSpr0uTosS

            il doit etre très dur a casser si on a pas la source



            Un système de chiffrement ne peut se baser que sur une variable secrète. Il est illusoire de vouloir cacher un code source afin d'assurer la protection des messages. Si la machine (ou le programme) tombe aux mains de l'ennemi, celui-ci finira bien par percer le secret de fonctionnement.

            Toutes les techniques sont bonnes : désassemblage, envoyer des milliards de messages pour voir comment le programme les traîte, etc.

            La machine Enigma qui chiffrait les messages de la flotte allemande pendant la guerre reposait en partie sur le fait que les Alliés ne savaient pas comment elle fonctionnait. Une fois que ceux-ci ont pu mettre la main dessus, des savants ont pu ouvrir une brèche dans le système Enigma.

            Dans ton cas, il suffit de désassembler le programme pour savoir comment il opère.

            Pour avoir que des lettres, il te faudrait un tableau de char reprennant tous les char humainement lisibles. Il suffit alors de réaliser le décalage dans ce tableau. Et tant qu'à faire, généralisons ton algo avec ce qu'on appelle la substitution monoalphabétique. Comme son nom l'indique, ce procédé consiste à changer une lettre par une autre, toujours de la même façon. Par exemple :

            a => f
            b => x
            c => a
            ...

            La clef de l'algorithme est alors le tableau de correspondance entre les caractères entrés et les caractères sortis. C'est une généralisation de ce que tu as fait car toi tu dis simple, si on fait un décalage de 2 par exemple :

            a => c
            b => d
            c => e
            ...

            Ce système de chiffrement résiste déja mieux à la force brute : alors qu'il suffit de N tentatives pour ton algo (N est le nombre de caractères possibles), le mien demande N! tentatives pour passer en revues toutes les combinaisons possibles. Pour N grand, ca devient rédhibitoire.

            Il existe cependant un moyen simple et relativement efficace pour casser ce système : Dans chaque langue, les lettres n'apparaissent pas avec la même fréquence. En français, la lettre e est celle qui revient le plus souvent, suivie de la lettre s je pense. En analysant un grand texte, il est possible de déterminer la fréquence d'apparition de chaque lettre. Puisqu'on fait une substitution monoalphabétique, la fréquence des lettres dans le message chiffré est préservé.

            Ainsi, si on remplace toujours e par k, k devrait être la lettre qui revient le plus souvent. Je dis devrait car tout ca n'est que statistiques. Néanmoins, plus le texte chiffré est long plus on peut se fier à la fréquence d'apparition des lettres. Il suffit alors de remplacer la lettre qui revient le plus souvent (k) par celle qui revient le plus souvent dans la langue (e). On a alors établi

            k => e

            L'ordinateur peut ainsi trouver quelques substitutions. Il lui reste ensuite à tester les substitutions qui n'ont pas pu se faire "à la main" et on retrouve le message original.


            Tout ca pour te montrer une autre façon de chiffrer des messages, mais surtout pour te montrer combien ton algo offre une faible protection par rapport au moins (qui est lui-même très simple à casser). Il est très difficile de dire si une méthode est robuste. Et cacher le code procure un faux sentiment de sécurité.

            Maintenant, il n'y a pas de mal à cacher un code dont la robustesse a été prouvée, pourquoi simplifier la vie des pirates?
            • Partager sur Facebook
            • Partager sur Twitter
              12 décembre 2005 à 21:13:08

              Et pourquoi pas avec des fichiers au lieu de phrases?

              <fait ca pub>

              Tu trouvera tout ce qui te faut ici :
              http://www.siteduzero.com/forum-83-3265-29558-c-quelques-fonctions-utiles.html#r29558

              </pub>
              • Partager sur Facebook
              • Partager sur Twitter
                12 décembre 2005 à 21:29:54

                bah enfaite une fois qu'on a mon programme il suffit de faire espace pour griller comment il march de toute facon :(
                Mais j'dis juste que si tu tombes sur un fichiers texte crypté avec mon programme et que tu sais pas avec quel programme il a été crypté le text est très dur a decrypté mais une fois qu'on la on met deux minutes a tut grillé :-°
                • Partager sur Facebook
                • Partager sur Twitter
                  13 décembre 2005 à 0:11:30

                  Bonjour... Je suis tombé sur ce topic, je l'ai lu et je me suis dit:

                  Citation : de moi

                  tiens voilà un tcho programme ben sympatoche à faire. y'est ti point boubours s'garchon.



                  alors je me suis lancé dans mon codeur décodeur. mais j'ai des erreurs... de compilation et de résultat. merci de votre aide.

                  #include <iostream>
                  #include <math.h>

                  using namespace std;

                  void code( char text[], char cle[] );
                  void decode( char text[], char cle[] );

                  int main()
                  {
                          char code[80];
                          char clef[80];
                         
                          cout << "entrez votre code: ";
                          cin >> code;

                          cout << "et votre clef de déchiffrage: ";
                          cin >> clef;

                          code( code, clef ); // <-- Ici on me dit: term does not evaluate to a function

                          decode( code, clef );

                          return 0;
                  }

                  void code( char text[], char cle[] )
                  {
                          int code = 0;
                          int i=0, j=0;
                         
                          while (text[i] != 0)
                          {
                                  code = text[i] + cle[j];

                                  if(code<100)cout << "0";
                                 
                                  cout << code;
                                                 
                                  i++; j++;

                                  if(cle[j] == 0)j=0;
                          }
                  }

                  void decode( char text[], char cle[] )
                  {
                          char code;
                          int i=0, j=0, k=0;
                         
                          while (text[i] != 0)
                          {
                                  code = 0;
                                 
                                  for(int k = i + 2; k <= i ; k--)
                                          code += text[k]*pow(10,k);
                                 
                                  code -= cle[j];

                                  cout << code;   // <-- Et ici il écrit pas ce que je veut
                                 
                                  i+=3,j++;

                                  if(cle[j] == 0)j=0;
                          }
                  }
                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 décembre 2005 à 7:16:06

                    Citation : SuperMat

                    Citation : dOsSpr0uTosS

                    il doit etre très dur a casser si on a pas la source



                    Un système de chiffrement ne peut se baser que sur une variable secrète. Il est illusoire de vouloir cacher un code source afin d'assurer la protection des messages. Si la machine (ou le programme) tombe aux mains de l'ennemi, celui-ci finira bien par percer le secret de fonctionnement.


                    T'étais pas cryptanaliste dans la deuxième guerre mondiale par hasard ^^

                    BooBaa, tu as une fonction et une variable qui s'appellent tous les deux "code" ~~~~~~> conflit
                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 décembre 2005 à 10:22:20

                      Citation : asmanur

                      T'étais pas cryptanaliste dans la deuxième guerre mondiale par hasard ^^



                      Bon j'avoue, c'est moi qui déchiffrait les messages de la marine japonaise :D


                      BooBaa : Que veux-tu faire avec les lignes


                      if(code<100)
                          cout << "0";
                      cout << code;


                      ?

                      Pourquoi affiches-tu le résultat à l'écran, et pas le stocker dans une chaîne (que tu peux afficher par la suite) ?


                      if(cle[j] == 0)
                        j=0;

                      La condition du if est assez mal foutue : si le mot ne se termine pas par '\0' tu es mal barré. Mieux vaut se fier à la longeur du mot pour déterminer quand tu dois repartir de 0.

                      Enfin, d'après ce que j'ai compris, tu écrases les valeurs < 100, en mettant 0 à la place. Il y a donc une perte de l'information (un écrasement n'est pas réversible : si j'ai 0 est-ce que ca correspond à 1? 5? 63?). Et je fait d'utiliser des puissances (pourquoi d'ailleurs?) ne rendra pas le nombre perdu...


                      Pour ceux que ca intéresse, j'ai implémenté RSA en C sur mon site. Je l'ai fait en JAva aussi, mais le programme ne me satisfait pas encore, et je n'ai pas mis les sources sur internet.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 décembre 2005 à 18:08:20

                        Citation : BooBaa

                        code( code, clef ); // <-- Ici on me dit: term does not evaluate to a function

                        c'est surement parce que tu as une variable et une fonction qui on le même nom, renomme ta variable "code" en "codage" et regarde si çà marche.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 décembre 2005 à 20:31:13

                          oki j'ai plus de probleme et y marche (du moins j'ai pas eu de bug). ma premiere erreur c'était bien que j'avais déja appelé une variable code. La seconde ben en fait je prenais la valeur ascii du nombre or:

                          0 = 48 :( d'ou probleme.

                          enfin le voila si y'a des espions dans le groupe qui souhaite pirater la bourse de tokyo:

                          #include <iostream>
                          #include <math.h>

                          using namespace std;

                          void codage( char text[], char cle[] );
                          void decode( char text[], char cle[] );

                          int main()
                          {
                                  char code[80];
                                  char clef[80];
                                 
                                  cout << "entrez votre code: ";
                                  cin >> code;

                                  cout << "et votre clef de déchiffrage: ";
                                  cin >> clef;

                                  codage( code, clef );

                                  decode( code, clef );

                                  cout << endl;

                                  return 0;
                          }

                          void codage( char text[], char cle[] )
                          {
                                  int code = 0;
                                  int i=0, j=0;
                                 
                                  while (text[i] != 0)
                                  {
                                          code = text[i] + cle[j];

                                          if(code<100)cout << "0";
                                         
                                          cout << code;
                                                         
                                          i++; j++;

                                          if(cle[j] == 0)j=0;
                                  }

                                  cout << endl;
                          }

                          void decode( char text[], char cle[] )
                          {
                                  char code;
                                  int i=0, j=0, k=0;
                                 
                                  while (text[i] != 0)
                                  {
                                          code = 0;
                                         
                                          for(int t=2 ; t>=0 ; i++, t--)
                                                  code += (text[i]-48)*pow(10,t);
                                         
                                          code -= cle[j];

                                          cout << code;
                                         
                                          j++;

                                          if(cle[j] == 0)j=0;
                                  }
                          }
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Crypeur/decrypteur tout simple

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown