Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1964 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Cryptage et decryptage C++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Cryptage et decryptage C++

n°2165705
Bloupies
Posté le 27-11-2012 à 22:21:44  profilanswer
 

Programme C++ Cryptage/Decrytage et  césar

Message cité 1 fois
Message édité par Bloupies le 28-11-2012 à 11:33:08
mood
Publicité
Posté le 27-11-2012 à 22:21:44  profilanswer
 

n°2165710
Terminapor
I'll see you rise.
Posté le 27-11-2012 à 22:54:48  profilanswer
 

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
n°2165711
Bloupies
Posté le 27-11-2012 à 22:58:56  profilanswer
 

C'est à dire ?

n°2165714
Terminapor
I'll see you rise.
Posté le 27-11-2012 à 23:41:39  profilanswer
 

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
n°2165717
Bloupies
Posté le 28-11-2012 à 00:02:29  profilanswer
 

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

n°2165721
gilou
Modérateur
Modzilla
Posté le 28-11-2012 à 02:13:44  profilanswer
 

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

---------------
Samantha Fish Rulez!     --    Iyashikei Anime Forever!    --    In umbra igitur pugnabimus. --
n°2165724
Bloupies
Posté le 28-11-2012 à 08:27:32  profilanswer
 

Merci infiniment

n°2165771
theshockwa​ve
I work at a firm named Koslow
Posté le 28-11-2012 à 11:18:05  profilanswer
 


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
n°2165781
Bloupies
Posté le 28-11-2012 à 11:34:04  profilanswer
 

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


 

n°2165797
gilou
Modérateur
Modzilla
Posté le 28-11-2012 à 12:28:26  profilanswer
 

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

---------------
Samantha Fish Rulez!     --    Iyashikei Anime Forever!    --    In umbra igitur pugnabimus. --
mood
Publicité
Posté le 28-11-2012 à 12:28:26  profilanswer
 

n°2165804
Bloupies
Posté le 28-11-2012 à 13:08:48  profilanswer
 

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

n°2165820
gilou
Modérateur
Modzilla
Posté le 28-11-2012 à 14:32:05  profilanswer
 

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


---------------
Samantha Fish Rulez!     --    Iyashikei Anime Forever!    --    In umbra igitur pugnabimus. --
n°2167276
Bloupies
Posté le 07-12-2012 à 23:50:40  profilanswer
 

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 !

n°2167278
gilou
Modérateur
Modzilla
Posté le 08-12-2012 à 00:33:37  profilanswer
 

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

---------------
Samantha Fish Rulez!     --    Iyashikei Anime Forever!    --    In umbra igitur pugnabimus. --
n°2167280
Bloupies
Posté le 08-12-2012 à 00:54:06  profilanswer
 

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
n°2167281
gilou
Modérateur
Modzilla
Posté le 08-12-2012 à 01:17:35  profilanswer
 

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

---------------
Samantha Fish Rulez!     --    Iyashikei Anime Forever!    --    In umbra igitur pugnabimus. --
n°2167292
Bloupies
Posté le 08-12-2012 à 10:40:28  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Cryptage et decryptage C++

 

Sujets relatifs
Fonction temps en C pour pic[C/Reseau] Connaitre le port Client connecté au port 21 du FTP
Interactions avec l'OS en CCoder en Objective-C sur windows ?
Coder le commande ls -l en CSockets en C
[C] PIC18F2580 problème sortie inversée[C] Fonction gotoligcol
[C/Reseau] Protocole FTP/ mode passif/ LIST&GETprogramme C :jeu de cartes
Plus de sujets relatifs à : Cryptage et decryptage C++



Copyright © 1997-2016 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR