Salut à tous,
Je fréquente le forum depuis un petit moment sans avoir poster jusqu'à présent mais aujourd'hui je suis face à deux problèmes et je viens solliciter votre aide.
Voici la situation:
1er problème :
Mon code doit simuler une authentification avec des calculs de chiffrement (triple DES,...). Je ne rentrerai pas trop dans les détails car la n'est pas le problème. Afin de rendre le programme dynamique je demande à l'utilisateur de saisire les clés de chiffrements qui seront utilisées plus tard. Je précise que j'utilise la librairie openssl pour effectuer les calculs.
J'essaie donc de récupérer une clé de chiffrement depuis le terminal et c'est là qu'intervient le problème.
La clé est au format hexadécimale. C'est à dire de la forme "0x0011AA22FF". Elle sera stockée dans un unsigned char[] sous la forme suivante:
La solution que j'ai trouvé pour l'instant est la suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part unsigned char cle[5]={0x00,0x11,0xAA,0x22,0xFF};
Ce code est fonctionnel mais n'est pas pratique car il oblige l'utilisateur à saisir les digits deux par deux et de valider à chaque fois entre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 int number; printf("\nEnter your master key byte by byte:\n"); for(int i=0;i<sizeof(masterkey);i++){ scanf("%x",&number); //l'utilisateur saisie 2 digits a la fois (ex. 41) masterkey[i]=number; //on stocke les digits dans notre tableau (à l'indice i il y aura donc 0x41 qui correspond au caractère 'A' en ASCII) }
La solution parfaite serait que l'utilisateur puisse taper sa clé en une fois, que celle-ci soit considérée non pas comme un string mais comme une valeur en hexa que l'on viendrait parser dans le tableau d'unsigned char.
2eme problème
Maintenant, afin de réaliser les mêmes opérations, le second objectif est de mettre en place une interface graphique avec Windows Form en C++ sous Visual Studio.
J'ai voulu dans un premier temps utiliser ma solution (bien qu'un peu bancale (qui a dit beaucoup???)) combinée avec des textbox mais celle-ci n'est pas applicable car le texte est récupéré dans ces dernières n'est pas interprétable en hexadécimale car il est automatiquement récupéré dans le champ Text de la textbox en string.
J'ai du coup essayé de convertir ce string avec ceci:
sans aucun succès.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 private: System::Void textBox1_TextChanged(System::Object^ sender, System::EventArgs^ e) { System::String^ txt; //std::string txt; if(textBox1->MaxLength==textBox1->TextLength){ txt=textBox1->Text; label1->Text=System::Convert::ToString(mafonction(txt)); textBox2->Select(); //sscanf(&masterkey,"%x",&val); } //fonction située dans un autre fichier .cpp char mafonction(System::String^ val){ char masterkey; System::String^ res; sscanf(&masterkey,"%x",&val); return masterkey; }
Avec ce "joli" morceau de code j'ai le droit à l'erreur suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Une exception non gérée du type 'System.Runtime.InteropServices.MarshalDirectiveException' s'est produite dans test1.exe Informations supplémentaires*: Cannot marshal 'parameter #3': Pointers cannot reference managed objects. Use ByRef instead.
La démarche est donc très archaïque avec cette solution.
J’espère avoir été assez clair dans mes explications afin que chacun puisse comprendre mon problème. Sinon n'hésitez pas à me demander des précision
Merci par avance,
Crackos
Ps: Pour info, je code en C++ (malgré que j'utilise plus du C qu'autre chose) et ce sous Visual Studio, voilou
Partager