Cryptage et decryptage C++

Cryptage et decryptage C++ - C++ - Programmation

Marsh Posté le 27-11-2012 à 22:21:44    

Programme C++ Cryptage/Decrytage et  césar

Message cité 1 fois
Message édité par Bloupies le 28-11-2012 à 11:33:08
Reply

Marsh Posté le 27-11-2012 à 22:21:44   

Reply

Marsh Posté le 27-11-2012 à 22:54:48    

Ben simplement parcourir ta chaîne de caractère (string est un peu comme un tableau, tu peux accéder aux différents caractères avec [ ]) et appliquer le décalage + modulo


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 27-11-2012 à 22:58:56    

C'est à dire ?

Reply

Marsh Posté le 27-11-2012 à 23:41:39    

Imagine tu as
 
string MaChaine="bonjour!";
 
Tu as besoin de parcourir ta chaine et par exemple, remplacer les o par des u :  

Code :
  1. for (int i=0;i<MaChaine.size();i++)
  2. {
  3.      if (MaChaine[i]=='o')
  4.            MaChaine[i]='u';
  5. }


 
Après ce traitement, MaChaine sera "bunjuur!"
 
Donc je te laisse imaginer comment implémenter ton algo :jap:


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 28-11-2012 à 00:02:29    

Mais là apparemment j'ai besoin de la table Ascii non ?
 
Comment je fais pour considérer directement une lettre par rapport à une valeur ?
 
En faite , on a pas vu encore le chapitre sur la vrai classe string . On est sur les tableaux/pointeurs . On doit se débrouiller quoi ^^

Reply

Marsh Posté le 28-11-2012 à 02:13:44    

Un truc écrit vite fait:

Code :
  1. #include <iostream>
  2. #include <string>
  3. #include <climits>
  4. #include <cstdlib>
  5. using namespace std;
  6. inline int modulo (int m, int n)
  7. {
  8.     return m >= 0 ? m % n : ( n - abs ( m % n ) ) % n;
  9. }
  10. int main()
  11. {
  12.     bool crypter;
  13.     cout << "Taper C si vous voulez crypter et D si vous voulez decrypter" << endl;
  14.     char c;
  15.     cin >> c;
  16.     cin.ignore(INT_MAX, '\n'); // Clean up cin
  17.     switch (c) {
  18.     case 'C':
  19.     case 'c':
  20.         crypter = true;
  21.         break;
  22.     case 'D':
  23.     case 'd':
  24.         crypter = false;
  25.         break;
  26.     default:
  27.         cout << "Entree invalide, fin du programme";
  28.         return (-1);
  29.         break;
  30.     }
  31.     string message;
  32.     cout << "Donnez le message a " << (crypter?"crypter":"decrypter" ) << ">";
  33.     getline(cin, message);
  34.     int cle;
  35.     cout << "Donnez la cle numerique de " << (crypter?"cryptage":"decryptage" ) << ">";
  36.     if (!(cin >> cle)) {
  37.         cout << "Cle invalide, fin du programme";
  38.         return (-1);
  39.     }
  40.     for (string::iterator it = message.begin(); it < message.end(); ++it) {
  41.         if (isupper(*it)) {
  42.             if (crypter)
  43.                 *it = 'A' + modulo(*it - 'A' + cle, 26);
  44.             else
  45.                 *it = 'A' + modulo(*it - 'A' - cle, 26);
  46.         }
  47.         else if (islower(*it)) {
  48.             if (crypter)
  49.                 *it = 'a' + modulo(*it - 'a' + cle, 26);
  50.             else
  51.                 *it = 'a' + modulo(*it - 'a' - cle, 26);
  52.         }
  53.     }
  54.     cout << "Le message " << (crypter?"crypte":"decrypte" ) << " est :"  << message << endl;
  55.     return 0;
  56. }


 
Si tu fais cela avec des tableaux et des pointeurs, alors qu'il s'agit de chaines de caractères, et qu'il y a string::iterator pour se balader dans une string, tu as la malchance d'avoir un cours de C déguisé en cours de C++.
 
A+,


Message édité par gilou le 28-11-2012 à 02:20:57

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 28-11-2012 à 08:27:32    

Merci infiniment

Reply

Marsh Posté le 28-11-2012 à 11:18:05    


Ah ouais, super idée de vider le contenu de son message initial .. C'est sympa pour ceux qui rejoignent le topic plus tard  [:pingouino]


---------------
last.fm
Reply

Marsh Posté le 28-11-2012 à 11:34:04    

Salut .
 
Aujourd'hui 4h de TP , on a vu la méthode utilisé avec seulement du C++ , et non pas du C !  
 
Voilà pour ceux qui la souhaite :  
 

Code :
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main()
  5. {
  6. string message;
  7. int k;
  8. int i=0;
  9. cout << "Donner le message a crypter >";
  10. getline(cin,message);
  11. cout << " Donnez la cle numerique de cryptage/decryptage >";
  12. cin >>k;
  13.   if (k<0)
  14.   k=(k%26)+26;
  15.  
  16.     while (message[i] !='\0')
  17.   {
  18.  
  19.     if (message[i] >='A' && message[i] <='Z' )
  20.   message[i]=(message[i] - 'A' +k)%26+'A';
  21.  if (message[i] >='a' && message[i] <='z' )
  22.   message[i]=(message[i] - 'a' +k)%26+'a';
  23.   i++;
  24.   }
  25.  
  26.   cout <<"Le message crypte/decrypte est : " << endl << message << endl;
  27.  return 0;
  28. }


 

Reply

Marsh Posté le 28-11-2012 à 12:28:26    

Citation :

if (message[i] >='A' && message[i] <='Z' )


C'est ce que je fais, de manière plus simple, avec if (isupper(message[i]))
 
Et pour le reste, c'est la même technique, sauf que la, c'est toujours du C déguisé en C++ (ie qui utilise cin, cout et getline au lieu de stdin, stdout et gets).
 
à tête reposée, mon code pouvait se simplifier:

Code :
  1. #include <iostream>
  2. #include <string>
  3. #include <climits>
  4. #include <cstdlib>
  5. using namespace std;
  6. inline int modulo (int m, int n)
  7. {
  8.     return m >= 0 ? m % n : ( n - abs ( m % n ) ) % n;
  9. }
  10. int main()
  11. {
  12.     bool crypter;
  13.     cout << "Taper C si vous voulez crypter et D si vous voulez decrypter" << endl;
  14.     char c;
  15.     cin >> c;
  16.     cin.ignore(INT_MAX, '\n'); // Clean up cin
  17.     switch (c) {
  18.     case 'C':
  19.     case 'c':
  20.         crypter = true;
  21.         break;
  22.     case 'D':
  23.     case 'd':
  24.         crypter = false;
  25.         break;
  26.     default:
  27.         cout << "Entree invalide, fin du programme";
  28.         return (-1);
  29.         break;
  30.     }
  31.     string message;
  32.     cout << "Donnez le message a " << (crypter?"crypter":"decrypter" ) << ">";
  33.     getline(cin, message);
  34.     int cle;
  35.     cout << "Donnez la cle numerique de " << (crypter?"cryptage":"decryptage" ) << ">";
  36.     if (!(cin >> cle)) {
  37.         cout << "Cle invalide, fin du programme";
  38.         return (-1);
  39.     }
  40.     if (!crypter) {
  41.     cle = -cle;
  42.     }
  43.     for (string::iterator it = message.begin(); it < message.end(); ++it) {
  44.         if (isupper(*it)) {
  45.             *it = 'A' + modulo(*it - 'A' + cle, 26);
  46.         }
  47.         else if (islower(*it)) {
  48.             *it = 'a' + modulo(*it - 'a' + cle, 26);
  49.         }
  50.     }
  51.     cout << "Le message " << (crypter?"crypte":"decrypte" ) << " est :"  << message << endl;
  52.     return 0;
  53. }


 
La solution de ton exercice  
- parle de cryptage décryptage, mais ne fait que le cryptage et pas le décryptage.
- ne vérifie pas que la clé rentrée est un chiffre valide
 
Notes que ce cryptage est souvent aussi étendu aux chiffres. Avec mon code, il suffirait de rajouter
        else if (isdigit(*it)) {
            *it = '0' + modulo(*it - '0' + cle, 10);
        }
 
A+,


Message édité par gilou le 28-11-2012 à 12:53:01

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 28-11-2012 à 12:28:26   

Reply

Marsh Posté le 28-11-2012 à 13:08:48    

Salut , merci de ta réponse .
 
Mon programme crypte et décrypte .  
 
On écrit le message a crypter , puis on met la cle , le message crypé apparait .
 
On réeouvre le programme , on met le message crypté , on fait le sens inverse de la cle ( si on a cripté k=2 , alors là ça sera k=-2 , et notre message de base apparait .
 
Testé sur "Bonjour" avec k=2

Reply

Marsh Posté le 28-11-2012 à 14:32:05    

Bien sur, je me doute que ça décrypte en mettant la clé en négatif, vu que c'est le principe de l'algo, mais c'est nul comme interface, de demander la clé, et en fait d'attendre l'inverse de la clé.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 07-12-2012 à 23:50:40    

Salut
 
En prenant du recul , je pense vraiment que ton script est de premier choix ! Il est vraiment pas mal !  
 
D'ailleur j'ai essayé de crypter/decrypter une série de nombre avec isdigit , mais cela n'a pas l'air de bien fonctionner .  
 
Par ailleur , je me demandais si la clé pouvait être une des caracteres ? Du genre cle="bongo" .
 
Merci d'avance de ton attention !

Reply

Marsh Posté le 08-12-2012 à 00:33:37    

Tu as fait ceci comme remplacement:
for (string::iterator it = message.begin(); it < message.end(); ++it) {
        if (isupper(*it)) {
            *it = 'A' + modulo(*it - 'A' + cle, 26);
        }
        else if (islower(*it)) {
            *it = 'a' + modulo(*it - 'a' + cle, 26);
        }
        else if (isdigit(*it)) {  
            *it = '0' + modulo(*it - '0' + cle, 10);  
        }  
}
J'ai pas testé, mais ça devrait marcher. [EDIT: j'ai testé et ça marche]
 
La clé ne peut pas être des caractères non numériques avec ce type de cryptage, puisque décaler de clé n'a plus de sens ici.
Par contre tu as des méthodes de cryptages du même genre, mais un peu plus poussées, ou cela est possible:  
Au lieu de décaler chaque caractère d'une valeur constante, la clé, modulo qque chose, on décale chaque caractère d'une longueur variable, le caractère courant de la clé (sur laquelle on avance en boucle caractère par caractère).
On a traité récemment le sujet ici: http://forum.hardware.fr/hfr/Progr [...] 8091_1.htm
 
 
A+,


Message édité par gilou le 08-12-2012 à 00:44:46

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-12-2012 à 00:54:06    

Salut , d'accord , merci !
 
Par contre , comment tu cryptes/decryptes avec digit , tu me donnes un exemple ?
 
Edit : vôtre lien est un programme en c , non pas en c++ :)


Message édité par Bloupies le 08-12-2012 à 00:57:15
Reply

Marsh Posté le 08-12-2012 à 01:17:35    

Ben rien ne changes la pour le cryptage décryptage avec digit, j'appliques le même principe qu'avec les lettres, sauf que le modulo est par rapport a 10.
 
Bon, on peut améliorer ton algo, qui ne permute que les minuscules entre elles, les majuscules entre elles, et les chiffres entre eux, en utilisant un alphabet global pour permuter:
 

Code :
  1. #include <iostream>
  2. #include <string>
  3. #include <climits>
  4. #include <cstdlib>
  5. using namespace std;
  6. inline int modulo (int m, int n)
  7. {
  8.     return m >= 0 ? m % n : ( n - abs ( m % n ) ) % n;
  9. }
  10. int main()
  11. {
  12.     const string alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; // 10 + 26 + 26 = 62
  13.     bool crypter;
  14.     cout << "Taper C si vous voulez crypter et D si vous voulez decrypter" << endl;
  15.     char c;
  16.     cin >> c;
  17.     cin.ignore(INT_MAX, '\n'); // Clean up cin
  18.     switch (c) {
  19.     case 'C':
  20.     case 'c':
  21.         crypter = true;
  22.         break;
  23.     case 'D':
  24.     case 'd':
  25.         crypter = false;
  26.         break;
  27.     default:
  28.         cout << "Entree invalide, fin du programme";
  29.         return (-1);
  30.         break;
  31.     }
  32.     string message;
  33.     cout << "Donnez le message a " << (crypter?"crypter":"decrypter" ) << ">";
  34.     getline(cin, message);
  35.     if (message.empty()) {
  36.         cout << "Pas de message a crypter, fin du programme";
  37.         return (0);
  38.     }
  39.     int cle;
  40.     cout << "Donnez la cle numerique de " << (crypter?"cryptage":"decryptage" ) << ">";
  41.     if (!(cin >> cle)) {
  42.         cout << "Cle invalide, fin du programme";
  43.         return (-1);
  44.     }
  45.     if (!crypter) {
  46.         cle = -cle;
  47.     }
  48.     for (string::iterator it = message.begin(); it < message.end(); ++it) {
  49.         if (isupper(*it) || islower(*it) || isdigit(*it)) {
  50.             *it = alphabet[modulo(alphabet.find(*it) + cle, 62)];
  51.         }
  52.     }
  53.     cout << "Le message " << (crypter?"crypte":"decrypte" ) << " est :"  << message << endl;
  54.     return 0;
  55. }


Et la c'est du C++.
 
Et en poussant un peu plus loin, on arrive facilement au cas ou la clé est une chaine, qui déclenche un décalage variable:

Code :
  1. #include <iostream>
  2. #include <string>
  3. #include <climits>
  4. #include <cstdlib>
  5. using namespace std;
  6. inline int modulo (int m, int n)
  7. {
  8.     return m >= 0 ? m % n : ( n - abs ( m % n ) ) % n;
  9. }
  10. int main()
  11. {
  12.     const string alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; // 10 + 26 + 26 = 62
  13.     bool crypter;
  14.     cout << "Taper C si vous voulez crypter et D si vous voulez decrypter" << endl;
  15.     char c;
  16.     cin >> c;
  17.     cin.ignore(INT_MAX, '\n'); // Clean up cin
  18.     switch (c) {
  19.     case 'C':
  20.     case 'c':
  21.         crypter = true;
  22.         break;
  23.     case 'D':
  24.     case 'd':
  25.         crypter = false;
  26.         break;
  27.     default:
  28.         cout << "Entree invalide, fin du programme";
  29.         return (-1);
  30.         break;
  31.     }
  32.     string message;
  33.     cout << "Donnez le message a " << (crypter?"crypter":"decrypter" ) << ">";
  34.     getline(cin, message);
  35.     if (message.empty()) {
  36.         cout << "Pas de message a crypter, fin du programme";
  37.         return (0);
  38.     }
  39.     string cle;
  40.     cout << "Donnez la cle de " << (crypter?"cryptage":"decryptage" ) << ">";
  41.     getline(cin, cle);
  42.     if (cle.empty()) {
  43.         cout << "Cle vide, fin du programme";
  44.         return (-1);
  45.     }
  46.     string::iterator itc = cle.begin();
  47.     for (string::iterator itm = message.begin(); itm < message.end(); ++itm) {
  48.         if (isupper(*itm) || islower(*itm) || isdigit(*itm)) {
  49.            *itm = alphabet[modulo(alphabet.find(*itm) + (crypter?*itc:-*itc), 62)];
  50.         }
  51.         if (++itc == cle.end()) {
  52.             itc = cle.begin();
  53.         }    
  54.     }
  55.     cout << "Le message " << (crypter?"crypte":"decrypte" ) << " est :"  << message << endl;
  56.     return 0;
  57. }


 
 
A+,


Message édité par gilou le 08-12-2012 à 02:43:27

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-12-2012 à 10:40:28    

Waw ! J'adore ton travail !  
 
Merci encore , je vais faire mumuse :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed