[C] Probleme dans un programme de cryptage

Probleme dans un programme de cryptage [C] - C - Programmation

Marsh Posté le 24-01-2006 à 19:45:55    

Voici un programme de cryptage:

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. void crypte(void);
  4. void decrypte(void);
  5. int main(int argc, char *argv[]) {
  6.     printf("** Petit exemple de cryptage avec cle **\n" );
  7.     printf("[1] pour crypter / [2] pour decrypter : " );
  8.     int action;
  9.     scanf("%d", &action);
  10.     if (action == 1) {
  11.        crypte();
  12.     } else {
  13.        decrypte();
  14.     }
  15.     return 0;
  16. }
  17. void crypte() {
  18.     printf("\n================================================================================\n" );
  19.     printf("Entrez le message a crypter :" );
  20.     char message[256];
  21.     scanf("%s", &message);
  22.     printf("\n================================================================================\n" );
  23.     printf("Entrez maintenant la cle de cryptage (autant de chiffres que vous voulez) :\n" );
  24.     int cle;
  25.     scanf ("%d", &cle);
  26.     int i;
  27.     for(i=0; i<strlen(message); i++) {
  28.         message[i] += cle^2;
  29.     }
  30.     printf("================================================================================\n" );
  31.     printf("Voici le message crypte :\n %s", message);
  32.     printf("\n================================================================================\n" );
  33.     getch();
  34. }
  35. void decrypte() {
  36.      printf("\n================================================================================\n" );
  37.      printf("Entrez le message a decrypter :\n" );
  38.      char message[256];
  39.      scanf("%s", &message);
  40.      printf("\n================================================================================\n" );
  41.      printf("Entrez maintenant la cle de cryptage :\n" );
  42.      int cle;
  43.      scanf("%d", &cle);
  44.      int i;
  45.      for(i=0; i<strlen(message); i++) {
  46.          message[i] -= cle^2;
  47.      }
  48.      printf("\n================================================================================\n" );
  49.      printf("Voici le message decrypte :\n %s", message);
  50.      printf("\n================================================================================\n" );
  51.      getch();
  52. }


Mais voilà, je ne comprends pas pourquoi, quand je crypte puis décrypte un mot avec le bonne clé, le résultat est faux. Je ne sais pas si celà vient de l'opération de cryptage ou de décryptage, ou même des deux.


Message édité par Pcsnake le 24-01-2006 à 19:46:42

---------------
Non pas maintenant
Reply

Marsh Posté le 24-01-2006 à 19:45:55   

Reply

Marsh Posté le 24-01-2006 à 19:54:03    

Salut,
moi je capte pas grand chose en cryptage decryptage, mais je remarque que ta clé est coder en entier, avec pour plage de valeur -2 milliard a +2 milliard et que message[i] est un char allant de 0 a 255!

Reply

Marsh Posté le 24-01-2006 à 20:06:50    

En effet en bridant la clé de 0 a 255 ça marche mieux... ^^


---------------
Non pas maintenant
Reply

Marsh Posté le 25-01-2006 à 10:31:08    

Moi j'isolerais de façon plus significative les opérations de saisie du message et de la clef; et les opérations de cryptage/décryptage (qui sont d'ailleurs quasiment les mêmes).
 
Ensuite, il vaut mieux utiliser l'opérateur "^" plutôt que "+". Le cryptage se fait alors au niveau du bit plutôt que du nombre et il est alors bien meilleur et en plus la même opération permet de crypter ou décrypter

  • clair xor clef = crypt
  • crypt xor clef = clair
  • clair xor crypt = clef


Mais bon, si le but du jeu est juste un exercice de manipulation d'octets et non un projet secret défense, c'est tout à fait suffisant. Mais si vraiment tu veux épater le prof, alors tu peux utiliser un mécanisme de double cryptage.
Voici le principe : tu cryptes ton message clair avec une vrai clef et ça donne un message crypté. Puis tu cryptes ton message crypté avec un message bidon et ça te donne une clef bidon.
Ensuite, si jamais tu es capturé (gros film) et qu'on te force à donner ta clef, ben tu donnes ta clef bidon. En l'associant avec le message crypté, cela donnera un message (bidon) mais personne ne pourra prouver qu'il ne s'agissait pas là du vrai message

  • message_secret xor clef_secret = message_crypt
  • message_crypt xor message_bidon = clef_bidon
  • message_crypt xor clef_bidon = message_bidon
  • message_crypt xor clef_secret = message_secret



Message édité par Sve@r le 25-01-2006 à 10:39:33
Reply

Marsh Posté le 25-01-2006 à 13:46:33    

Ce que tu dis c'est bien et totalement indéchiffrable je suis d'accord, mais dans ce cas là il faut une clé au moins aussi longue que le message, donc autant se souvenir du message.
Ou alors si c'est pour le transmettre de façon sécurisé, le problème se transforme en comment envoyer la clé …
 
Sinon je précise qu’il faut dans ce cas une seule clé par message (et sans la faire se répéter) sinon ça se déchiffre en 5 secondes.
 
Pour faire quelque chose de vraiment costaud sans avoir une clé énorme, actuellement je ne connais pas mieux que l’AES. Et une clé peut être utilisé pour chiffrer plusieurs messages sans problème.

Reply

Marsh Posté le 25-01-2006 à 18:31:27    

Tarabiscote a écrit :

Ce que tu dis c'est bien et totalement indéchiffrable je suis d'accord, mais dans ce cas là il faut une clé au moins aussi longue que le message


Là tu cites le "one time pad" de Gilbert Vernam (utilisé pendant la guerre froide et encore utilisé aujourd'hui pour crypter les communications du téléphone rouge).  
 

Tarabiscote a écrit :

Ou alors si c'est pour le transmettre de façon sécurisé, le problème se transforme en comment envoyer la clé …


L'algorithme de Diffie, Hellman et Merckle permet à deux personnes utilisant chacune un nombre personnel et inconnu de l'autre de générer une clef commune aux deux. Cet algo a été la base des travaux qui ont mené à RSA.
 

Tarabiscote a écrit :

Sinon je précise qu’il faut dans ce cas une seule clé par message (et sans la faire se répéter) sinon ça se déchiffre en 5 secondes.


Tout dépend de la taille de la clef.
 

Tarabiscote a écrit :

Pour faire quelque chose de vraiment costaud sans avoir une clé énorme, actuellement je ne connais pas mieux que l’AES. Et une clé peut être utilisé pour chiffrer plusieurs messages sans problème.


Idem réponse précédente. Mais bon, je crois qu'on dépasse un peu le cadre du TP (s'il s'agit bien d'un TP)...

Message cité 1 fois
Message édité par Sve@r le 25-01-2006 à 18:31:50

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 25-01-2006 à 20:19:18    

Sve@r a écrit :

Là tu cites le "one time pad" de Gilbert Vernam (utilisé pendant la guerre froide et encore utilisé aujourd'hui pour crypter les communications du téléphone rouge).


Téléphone rouge je pense pas mais par contre ça m’étonnerai pas pour la commande de lancement de la bombe nucléaire ;)
 
 

Sve@r a écrit :

L'algorithme de Diffie, Hellman et Merckle permet à deux personnes utilisant chacune un nombre personnel et inconnu de l'autre de générer une clef commune aux deux. Cet algo a été la base des travaux qui ont mené à RSA.


Ok, mais il ne faudrait pas essayer de créer une clé de la taille du message avec. (ces algos ont une très forte complexité, c’est ce qui fait qu’ils peuvent tenir un bon moment, mais ils ne sont pas infaillibles).
 
 

Sve@r a écrit :

Tout dépend de la taille de la clef.


Et du nombre de messages, si tu envoies 100 messages avec une telle clé peut importe la longueur, ça se décrypte sans problème.
 
 

Sve@r a écrit :

Idem réponse précédente. Mais bon, je crois qu'on dépasse un peu le cadre du TP (s'il s'agit bien d'un TP)...


Je disais pas qu'il fallais faire ça pour le TP, c'était juste histoire de démonter ton histoire de film :p , ça risque pas d'arriver avec ce genre d'algo.

Reply

Marsh Posté le 25-01-2006 à 22:44:35    

Tarabiscote a écrit :

Je disais pas qu'il fallais faire ça pour le TP, c'était juste histoire de démonter ton histoire de film :p , ça risque pas d'arriver avec ce genre d'algo.


Non, j'ai expliqué le double cryptage juste pour montrer l'idée et les possibilités qu'on peut en faire (le logiciel "TrueCrypt" sous Licence GPL disponible pour Zindoz et Linux offre justement cette possibilité => http://www.truecrypt.org). Evidemment que sur un algo style "cryptage de Jules César" c'est même pas la peine d'y songer. Mais l'algo peut changer...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 29-01-2006 à 13:37:16    

Comment adapter le systeme de cryptage pour ce style de programme (je veux crypter hEdit):
 
Main.c

Code :
  1. #include <windows.h>
  2. #include "resource.h"
  3. HINSTANCE hinst;
  4. HWND hEdit;
  5. LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
  6. BOOL APIENTRY Dialog1Proc(HWND, UINT, WPARAM, LPARAM);
  7. BOOL APIENTRY Dialog2Proc(HWND, UINT, WPARAM, LPARAM);
  8. int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance,
  9.                                                 LPSTR lpCmdLine, int nCmdShow)
  10. {
  11.     HWND hwnd;
  12.     MSG msg;
  13.     WNDCLASS wc;
  14.     hinst = hinstance;
  15.     wc.style = 0 ;
  16.     wc.lpfnWndProc = MainWndProc;
  17.     wc.cbClsExtra = 0;
  18.     wc.cbWndExtra = 0;
  19.     wc.hInstance = NULL;
  20.     wc.hIcon = LoadIcon(hinstance,MAKEINTRESOURCE(2));
  21.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  22.     wc.hbrBackground = NULL;
  23.     wc.lpszMenuName =  "LEMENU";
  24.     wc.lpszClassName = "MaWinClass";
  25.     if(!RegisterClass(&wc)) return FALSE;
  26.     hwnd = CreateWindow("MaWinClass", "Cryptage/décryptage", WS_OVERLAPPEDWINDOW,
  27.                                    CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,
  28.                                                    NULL, NULL, hinstance, NULL);
  29.     if (!hwnd)  return FALSE;
  30.     ShowWindow(hwnd, nCmdShow);
  31.     while (GetMessage(&msg, NULL, 0, 0))
  32.     {
  33.         TranslateMessage(&msg);
  34.         DispatchMessage(&msg);
  35.     }
  36.     return msg.wParam;
  37. }
  38. /******************************************************************************/
  39. LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  40. {
  41.     static HWND hEdit;
  42.     static BOOL EditNotChg = TRUE;
  43.                  char txt[256];
  44.     switch (uMsg)
  45.     {
  46.         case WM_CREATE:
  47.             {
  48.              HFONT hFont;
  49.              hEdit = CreateWindow("edit", "Tapez ici votre texte à crypter/décrypter...",
  50.                WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL,
  51.                                             0, 0, 0, 0, hwnd, NULL, hinst, NULL);
  52.              return 0;
  53.             }
  54.         case WM_CLOSE:
  55.             if(EditNotChg ||
  56.                MessageBox(hwnd,"Le texte a été modifié.\r\nEtes vous sûr de \
  57. vouloir fermer l'application ?"
  58.                             ,"Attention",MB_YESNO | MB_ICONQUESTION ) == IDYES)
  59.                                                             DestroyWindow(hwnd);
  60.             return 0;
  61.         case WM_COMMAND:
  62.             if(LOWORD(wParam) == IDM_QUIT) PostMessage(hwnd, WM_CLOSE,0,0);
  63.             if(LOWORD(wParam) == IDM_NEW)
  64.                 if(EditNotChg ||
  65.                   MessageBox(hwnd,"Le texte a été modifié.\r\nEtes vous sûr de \
  66. vouloir fermer votre travail ?"
  67.                             ,"Attention",MB_YESNO | MB_ICONQUESTION ) == IDYES)
  68.                       {
  69.                               SendMessage(hEdit,WM_SETTEXT,0,(long)"" );
  70.                               EditNotChg = TRUE;
  71.                       }
  72.             if(LOWORD(wParam) == IDM_ABOUT)
  73.                        DialogBox(hinst, "ABOUT" , hwnd, (DLGPROC)Dialog1Proc);
  74.             if(HIWORD(wParam) == EN_CHANGE) EditNotChg = FALSE;
  75.            
  76.             if(LOWORD(wParam) == IDM_CRYPTE)
  77.                               DialogBox(hinst, "CRYPTE" , hwnd, (DLGPROC)Dialog2Proc);
  78.             return 0;
  79.         case WM_SIZE:
  80.              MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
  81.              return 0;
  82.         case WM_DESTROY:
  83.             PostQuitMessage(0);
  84.             return 0;
  85.            
  86.         default:
  87.             return DefWindowProc(hwnd, uMsg, wParam, lParam);
  88.     }
  89. }
  90. /******************************************************************************/
  91. BOOL APIENTRY Dialog1Proc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
  92. {
  93.     switch (uMsg)
  94.     {
  95.       case WM_INITDIALOG:
  96.          return TRUE;
  97.       case WM_COMMAND:
  98.          if (LOWORD(wParam) == IDCANCEL || LOWORD(wParam) == IDOK)
  99.                 {
  100.                    EndDialog(hDlg,0);
  101.                    return TRUE;
  102.                 }
  103.       default:
  104.          return FALSE;
  105.     }
  106. }
  107. /******************************************************************************/
  108. BOOL APIENTRY Dialog2Proc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
  109. {
  110.     static HWND hParent;
  111.     switch (uMsg)
  112.     {
  113.       case WM_INITDIALOG:
  114.           {
  115.             CHAR st[256];
  116.             hParent = (HWND)lParam;
  117.             GetWindowText(hParent, st, 256);
  118.             SetDlgItemText(hDlg, IDE_EDIT1, st);
  119.           }
  120.          return TRUE;
  121.       case WM_COMMAND:
  122.          if (LOWORD(wParam) == IDOK )
  123.                 {
  124.                    CHAR cle[3];
  125.                    GetDlgItemText(hDlg, IDE_EDIT1, cle, 3);
  126.                    SetWindowText(hEdit,cle);
  127.                    EndDialog(hDlg,0);
  128.                    return TRUE;
  129.                 }
  130.          if (LOWORD(wParam) == IDCANCEL )
  131.                 {
  132.                    EndDialog(hDlg,0);
  133.                    return TRUE;
  134.                 }
  135.       default:
  136.          return FALSE;
  137.     }
  138. }


 
resource.h

Code :
  1. #define IDM_QUIT  1
  2. #define IDM_NEW   2
  3. #define IDM_ABOUT 3
  4. #define IDM_CRYPTE 4
  5. #define IDE_EDIT1 101
  6. #define WM_CRYPTER 201


 
resource.rc;

Code :
  1. #include <windows.h>
  2. #include "resource.h"
  3. 1 ICON icone.ico
  4. 2 ICON autre.ico
  5. LEMENU MENU
  6. BEGIN
  7.   POPUP "Fichier"
  8.     BEGIN
  9.        MENUITEM "&Nouveau", IDM_NEW
  10.        MENUITEM "&Crypter", IDM_CRYPTE
  11.        MENUITEM SEPARATOR
  12.        MENUITEM "&Quitter", IDM_QUIT
  13.     END
  14.   POPUP "Aide"
  15.     BEGIN
  16.        MENUITEM "A propos...", IDM_ABOUT
  17.     END
  18. END
  19. ABOUT DIALOG
  20.      60, 60, 160, 80
  21.            STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
  22.                                                              CAPTION "A propos"
  23. BEGIN
  24.     DEFPUSHBUTTON "Ok", IDOK, 56, 50, 42, 12
  25.     ICON 2, -1, 20, 15, 32, 32
  26.     LTEXT "Programme de cryptage par Pcsnake", -1, 60, 12, 80, 30
  27. END
  28. CRYPTE DIALOG
  29.     60, 60, 182, 70
  30.           STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
  31.                                                          CAPTION "Clé de cryptage"
  32. BEGIN
  33.     DEFPUSHBUTTON "OK", IDOK, 36, 42, 42, 12
  34.     PUSHBUTTON "Cancel", IDCANCEL, 96, 42, 42, 12
  35.     EDITTEXT IDE_EDIT1, 88, 15, 74, 12
  36.     LTEXT "Veuillez entrer cotre clé de cryptage", -1, 24, 10, 60, 30
  37. END


---------------
Non pas maintenant
Reply

Marsh Posté le 15-03-2006 à 11:20:12    

Euhhh... up?

Reply

Sujets relatifs:

Leave a Replay

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