Exercice de cryptographie? fichier cpp à complèter?

Exercice de cryptographie? fichier cpp à complèter? - C++ - Programmation

Marsh Posté le 20-03-2005 à 20:25:49    

Bonjour
 
 
Sur le site d'une université française, j'ai trouvé un petit programme en C++ (sans trouver la correction).
Ayant très peu de connaissances en C++, pas vraiment encore de cours sur le sujet,
je fais appel aux plus chevronnés de la POO en C++
le but est surtout de m'aider sur un exercice de maths et la cryptographie
je sais compiler le fichier, mais je bloque sur l'algo à réaliser en C++ :o (pas assez de connaissances pour le faire)
 
Voilà l'intégralité du fichier, qui pour le moment ressort le message (mis en paramètre) clair puis crypté puis clair.
 
fichier: crypto.cpp

Code :
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5. // Conversion caractere (char) vers entier relatif (int)
  6. //
  7. int convCarToZ(char c)
  8. { return (int) ( c - ' ' ); }
  9. // Conversion entier relatif (int) vers caractere (char)
  10. //
  11. char convZToCar(int n)
  12. { return ((char) n) + ' '; }
  13. // Chiffrement XOR
  14. //
  15. // y = x ^ m (^ est le symbole C++ pour le OU EXCLUSIF)
  16. //
  17. // Entree : message a chiffrer
  18. // Sortie : resultat du chiffrement
  19. // Masque : masque binaire a appliquer a chaque caractere (1 octet = 8 bits)
  20. //
  21. // Amelioration possible : utiliser un masque binaire plus grand  
  22. //                         unsigned char Masque[4] par exemple
  23. //
  24. void chiffrementXOR(const string& Entree, string& Sortie, unsigned char Masque)
  25. {
  26. Sortie="";
  27. char caractere;
  28. for(int i=0;i<Entree.length();i++)
  29. {
  30.  caractere=Entree.at(i);
  31.  Sortie+=Masque ^ caractere;
  32. }
  33. }
  34. // Chiffrement par permutations
  35. //
  36. // y = p(m) avec p, permutation a 3 elements
  37. //
  38. // Entree : message a chiffrer
  39. // Sortie : resultat du chiffrement
  40. // P      : permutation a 3 elements
  41. //           
  42. //         exemple  (1, 2, 3) -> (3, 1, 2)
  43. //                   
  44. //                   P[0] = 1
  45. //                   P[1] = 2
  46. //                   P[2] = 0
  47. //
  48. // Amelioration possible : utiliser d'une permutation a n elements
  49. //                         n = 4, 5 ou plus.
  50. //
  51. void chiffrementPermutation(const string& Entree, string& Sortie,int n, int *P)
  52. {
  53. string nouvelle_string("" );
  54. int reste;
  55. Sortie=Entree;
  56. reste=Sortie.length();
  57. if(reste%n!=0)Sortie.append(reste%n,'_');
  58. reste=(Sortie.length())/n;
  59. for (int i=0;i<reste;i++)
  60. {
  61.  for (int j=0;j<n;j++)
  62.  {
  63.   nouvelle_string+=Sortie.at(P[j]);
  64.  }
  65.  Sortie=Sortie.substr(n,(Sortie.length()-n));
  66.  }
  67.  Sortie=nouvelle_string;
  68. }
  69. // Chiffrement par decalage
  70. //
  71. // y = x + d dans Z/95Z
  72. //
  73. // Entree : message a chiffrer
  74. // Sortie : resultat du chiffrement
  75. // d      : decalage, d est un element de Z/95Z
  76. // x   : code du caractère à chiffrer
  77. //
  78. void chiffrementDecalage(const string& Entree, string& Sortie, int d)
  79. {
  80. }
  81. // Chiffrement affine
  82. //
  83. // y = a*x + b dans Z/95Z
  84. //
  85. // Entree : message a chiffrer
  86. // Sortie : resultat du chiffrement
  87. // a, b   : elements de Z/95Z
  88. //
  89. void chiffrementAffine(const string& Entree, string& Sortie, int a, int b)
  90. {
  91. }
  92. // Dechiffrement affine
  93. //
  94. // y = inva*(x + invb) dans Z/95Z
  95. //
  96. // Entree : message a chiffrer
  97. // Sortie : resultat du chiffrement
  98. // a, b   : elements de Z/95Z
  99. //
  100. void dechiffrementAffine(const string& Entree, string& Sortie, int inva, int invb)
  101. {
  102. }
  103. //
  104. // Heuristiques
  105. //
  106. // Parametre :
  107. //    Message : texte a etudier
  108. //
  109. // Valeur retournee : note attribuee au message apres analyse
  110. unsigned int heuristique1(const string& Message)
  111. {
  112. // ???
  113. return 0;
  114. }
  115. int main()
  116. {
  117. string src("Beau temps pour un lundi hi" ), dest;
  118. cout << "Message clair : " << src << endl;
  119. chiffrementXOR(src, dest, 12);
  120. cout << "Message chiffre : " << dest << endl;
  121. chiffrementXOR(dest, src, 12);
  122. cout << "Message clair : " << src << endl;
  123. int n=4;
  124. int P[4]={3,1,0,2};
  125. chiffrementPermutation(src, dest,n,P);
  126. cout << "Message chiffre par permutation :"<<dest<<endl;
  127. return EXIT_SUCCESS;
  128. }


 
C'est surtout la partie "Heuristiques" qui m'intéresse
 
Donc un grand merci d'avance à ceux qui saurront m'aider en complètant les trous des fonctions à faire:
- chiffrementDecalage
- chiffrementAffine
- dechiffrementAffine
- heuristique1 (prioritaire)
 
 
Merci d'avance pour le temps que vous prendrez pour m'aider :sweat:  
 
Kiss
Famitsu

Reply

Marsh Posté le 20-03-2005 à 20:25:49   

Reply

Marsh Posté le 21-03-2005 à 10:09:17    

heuristique sans plus de précision on peut pas deviner..

Reply

Marsh Posté le 21-03-2005 à 10:15:36    

quoi que dans ton cas, la méthode heuristique pourrait être tester tout tes algo de décryptage [:jagstang]

Reply

Marsh Posté le 21-03-2005 à 11:39:16    

L'heuristique ? Tu peux nous expliquer le principe?

Reply

Marsh Posté le 22-03-2005 à 10:39:17    

En fait heuristique, si j'ai bien compris permet d'étudier le texte en éliminant les mots qui ne peuvent pas former un mot
par exemple, en français le mot le plus long est 25, donc on élimine les autres possibilités
les mots composés de "aa" (2 A se suivant) n'existent pas, etc...
 
j'espère que c'est un peu plus clair :o

Reply

Marsh Posté le 22-03-2005 à 11:11:49    

Voilà ce que j'ai trouvé, si ça peut aider à clarifier la fonction heuristique  :)  

Code :
  1. //
  2. // Heuristiques
  3. //
  4. // Parametre :
  5. //    Message : texte a etudier
  6. //
  7. // Valeur retournee : note attribuee au message apres analyse
  8. unsigned int heuristique1(const string& Message)
  9. {
  10. int heur=0;
  11. int p(0),q(0),r(0),s(0),pi(0),qi(0),ri(0),si(0);
  12. char c(' ');
  13. bool compteur=false;
  14. p=Message.find_first_of(c,p);
  15. while(p>-1 && p<25)
  16.  {
  17.   if(pi==24) pi++;
  18.   p=Message.find_first_of(c,p);
  19.   compteur=true;
  20.  }
  21. if(pi>2) heur=0;
  22. else
  23. {
  24.  if(compteur==false) heur=0;
  25.  else
  26.   {
  27.    p=0;pi=0;
  28.   p=Message.find_first_of('e',p);
  29.   while(p!=-1 )
  30.   {
  31.    p=Message.find_first_of(c,p);
  32.    pi++;
  33.   }
  34.   if(Message.length()*0.14>pi) heur++;
  35.   p=0;pi=0;
  36.   p=Message.find_first_of('a',p);
  37.   q=Message.find_first_of('o',q);
  38.   r=Message.find_first_of('u',r);
  39.   s=Message.find_first_of('i',s);
  40.   while(p!=-1 )
  41.   {
  42.    pi=p;qi=q;ri=r;si=s;
  43.    p=Message.find_first_of('a',p);
  44.    q=Message.find_first_of('o',q);
  45.    r=Message.find_first_of('u',r);
  46.    s=Message.find_first_of('i',s);
  47.    (p==pi+1)? heur-- : heur++;
  48.   }
  49.   p=0;pi=0;q=0;
  50.   for(int n=32;n<48;n++)
  51.   {
  52.    c=convZToCar(n);
  53.    p=Message.find_first_of(c,p);
  54.    pi=Message.find_first_of(c,p);
  55.    q=Message.find_first_of(c,pi);
  56.    if (pi==p+1)
  57.    {
  58.     heur--;
  59.     if(q=pi+1) heur--;
  60.    }
  61.    p=0;
  62.   }
  63.  }
  64. }
  65. return heur;
  66. }


Message édité par Famitsu le 22-03-2005 à 11:13:13
Reply

Marsh Posté le 23-03-2005 à 16:17:10    

Personne? :??:

Reply

Marsh Posté le 24-03-2005 à 08:53:21    

ça clarifie pas grand chose. c'est quoi cette horreur ?
 
que fait cette fct heuristique en quelques mots ?
 
note : les commentaires sont aussi important que le code

Reply

Marsh Posté le 28-03-2005 à 01:13:01    

jagstang a écrit :


note : les commentaires sont aussi important que le code


 
C'est ce que me dise mes prof mais c'est plus simple a dire qu'a faire (sourton quand on est sur notre propre code qui n'as pas besoin en theorie d'etre relue par quelqu'un d'autre)

Reply

Marsh Posté le 28-03-2005 à 03:04:36    

sache que dans 2 mois c'est toi-même qui sera incapable de le relire. alors il faut toujours coder "comme si on était pas tout seul"


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 28-03-2005 à 03:04:36   

Reply

Marsh Posté le 28-03-2005 à 03:52:37    

jagstang a écrit :

sache que dans 2 mois c'est toi-même qui sera incapable de le relire. alors il faut toujours coder "comme si on était pas tout seul"


 
+1


---------------
http://www.blastmanu.info
Reply

Marsh Posté le 28-03-2005 à 10:00:41    

et je croyais que la resolution d'exo était hors chartre :o

Reply

Sujets relatifs:

Leave a Replay

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