Passage de MSDOS à win32 Application: problème de CAST!

Résolu
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 - 17 août 2004 à 12:57
cs_eRoZion Messages postés 241 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 8 octobre 2007 - 17 août 2004 à 16:09
Hello,

en un mot : H-E-L-P-!-!-!

J'ai un problème qui m'énerve depuis deux jours...

Si j'exécute le programme suivant dans VC++:

#include "mycrypt.h"
#pragma comment(lib, "tomcrypt.lib")

int main(void)
{
int x;
hash_state sha;
unsigned char out[20];
char *in = "hello world";
int table[20];

sha1_init(&sha);
sha1_process(&sha, (unsigned char*)in, strlen(in));
sha1_done(&sha, out);

for (x=0; x<20;x++){
table[x]=(int)out[x];

}

printf("\n\n");
for (x=0; x<20;x++){
table[x]=(int)out[x];

printf("%d ",table[x]);
}

printf("\n");

return 0;
}

j'aurai en réponse
42 174 108 53 201 79 207 180 21 219 233 95 64 139 156 233 30 232 70 237, ce qui est ce que je lui demande (hashage d'e "hello world" en utilisant SHA-1). Maintenant, ça se complique. Je veux faire ça dans une interface graphique. J'ai fait une fenêtre avec un bouton browse qui va chercher le fichier à hasher. Ensuite, en appuyant sur OK, le hashage est sauvé dans un fichier temporaire... mais voilà, c'est pas les chiffres que j'ai dans ce fichier, mais des "char" bizarroïdes et je sais vraiment pas comment faire un "cast" dans ce cas, HELP!

Un peu de code pour être plus clair:

... blabla ...

//Création du fichier cible
hDestFile = CreateFile("C:/WINDOWS/Temp/this-is-a-temporary-file.txt",GENERIC_WRITE,NULL,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

... blabla ...

//Lire le fichier source
if(!ReadFile(hSrcFile,szData,dwFileSize,&dwO,0))
{
delete[] szSrc;
delete[] szData;
CloseHandle(hSrcFile);
CloseHandle(hDestFile);
return FALSE;
}

//Encrypter le fichier source
encode(szData,out);

//Écrit les données dans le fichier cible
bRet = WriteFile(hDestFile,out,dwFileSize,&dwO,0);

delete[] szData;
CloseHandle(hSrcFile);
CloseHandle(hDestFile);

delete[] szSrc;

return bRet;
}

//Fonction pour hasher les données

void encode(char* pszData,unsigned char out[20])
{
hash_state sha;
int x;int table[20];
char buf00[2];

sha1_init(&sha);
sha1_process(&sha, (unsigned char*)pszData, strlen(pszData));
sha1_done(&sha, out);

}

Si je regarde le fichier de sortie, j'ai: Ê..À¾’Þí¢0.. et j'aimerai qqch du type : 42 174 108 53 201 79 207 180 21 219 233 95 64 139 156 233 30 232 70 237

Quelqu'un peut m'aider? Je désespère à trouver comment faire ce "cast"... HELP!!!!

Malik7934

PS: peut-être que je devrais poser la question autrement:

sachant que dans ma console je peux faire

for (x=0; x<20;x++){
table[x]=(int)out[x];

printf("%d ",table[x]);
}

et grace au %d, j'ai de beaux chiffres qui correspondent à ce que je veux, comment on fait ça dans une API sachant que j'écris ma réponse ainsi:

bRet = WriteFile(hDestFile,out,dwFileSize,&dwO,0);

et que c'est bien le contenu de "out" qui m'intéresse... ?????

12 réponses

malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
17 août 2004 à 14:47
Merci à tous, j'ai réglé moin problème!

En fait, il suffisait de remplacer

bRet = WriteFile(hDestFile,(LPCVOID)out,dwFileSize,&dwO,0);

Par:

for (i=0;i<20;i++){
char buf[3];
sprintf(buf,"%02x ",out[i]);
bRet = WriteFile(hDestFile,buf,3,&dwO,0);
}

Maintenant, mon problème c'est d'afficher des décimals "propres", plutôt que des hexa...
Le code
for (i=0;i<20;i++){
char buf[4]={0};
sprintf(buf,"%d ",out[i]);
bRet = WriteFile(hDestFile,buf,3,&dwO,0);
}
ne donne pas qqch de propre...
3
cs_eRoZion Messages postés 241 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 8 octobre 2007 1
17 août 2004 à 15:30
Etant donné qu'une signature sha-1 est composée d'entiers de 8 bits maximum et qu'on ne prend que leur valeur positive, à prioris tu n'as qu'à remplacer
sprintf(buf,"%02x ",out[i]);
par
sprintf(buf,"%03hu ",out[i]);

Comme out est en unsigned char y'a rien besoin de changer d'autre.

eRoZion
3
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
17 août 2004 à 13:09
fo ke tu utilises itoa() pour passer dentiers vers chaine de carac, mais je vois pas comment tu remplis ton "out", tu peux poster le code corresponddant ?
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
17 août 2004 à 13:12
char *in = "hello world";
est entièrement faux.

char *in;
VirtualAlloc...
strcpy(in, "hello...");

ou
char in[] = "hello...";

@+
Arnotic,
Admin CS, MVP Visual C++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 août 2004 à 13:13
Si tu as ecrit les donnees direct dans leur format binaire (et c'est tres bien) alors tu les relis idem.
par exemple:
int table[20];
DWORD v;
HANDLE hfl;
v = 0; ReadFile(hfl, table, sizeof(int) * 20, &v, 0);
CloseHandle(hfl);

tu as le nbr OCTETS lus dans v, a diviser par sizeof(int) pour savoir combien de 'int' inseres dans table.

ciao...
BruNews, Admin CS, MVP Visual C++
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
17 août 2004 à 13:15
Non, t'y es pas. J'ai un "unsigned char out[20]" qui contient du blabla tel que si je fais un printf("%d ",(int)out[x]) (x entre 0 et 20), j'obtiens un entier. Je veux récupérer et sauver ces entiers dans un fichier. Voici mon code pour l'instant:

/*****************************************************************************************
Programme pour encrypter des fichiers et les décrypter
*****************************************************************************************/
#define _WIN32_WINNT 0x0501

#include <stdlib.h>
#include <stdio.h>

#include <windows.h>
#include "resource.h"
#include "C:/Documents and Settings/mhammout/Desktop/ProgC-Malik/mycrypt.h"

#pragma comment(lib, "C:/Documents and Settings/mhammout/Desktop/ProgC-Malik/tomcrypt.lib")

BOOL CALLBACK MainDlgProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
BOOL OnBOk(HWND hWnd);
void OnBrowse(HWND hParent,bool bOpen);
void encode(char* pszData,unsigned char* out);//UINT uLen,unsigned char* out);

//Point d'entrée du prog
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR szCmdLine,int nCmdShow)
{
return (int)DialogBox(hInst,MAKEINTRESOURCE(IDD_MAIN),NULL,MainDlgProc);
}

//Procédure pour le dialogue principal -- Traitement des messages
BOOL CALLBACK MainDlgProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
SendMessage(GetDlgItem(hWnd,IDC_R_CRYPT),BM_SETCHECK,1,0);
SendMessage(GetDlgItem(hWnd,IDC_CK_DEL_SRC),BM_SETCHECK,1,0);
return TRUE;

case WM_COMMAND:
switch((UINT)wParam)
{
case IDCANCEL:
return EndDialog(hWnd,0);

//Bouton ok, encrypter ou décrypter un fichier
case IDC_B_OK:
if(OnBOk(hWnd))
MessageBox(hWnd,"Traitement terminé.","Succès",MB_OK);
else
MessageBox(hWnd,"Une erreur est survenue.","Erreur",MB_OK);
return TRUE;

//Bouton Browse pour le fichier source
case IDC_B_BROWSE_SRC:
OnBrowse(hWnd,true);
return TRUE;

//Bouton Browse pour le fichier destination
case IDC_B_BROWSE_DEST:
OnBrowse(hWnd,false);
return TRUE;
}

break; /*WM_COMMAND*/
}

return FALSE;
}

//Quand on clique sur un des deux buton browse, pour faire afficher le
//dialogue enregistrer sous ou ouvrir
void OnBrowse(HWND hParent,bool bOpen)
{
OPENFILENAME sOpenFile;
char szPath[MAX_PATH + 1];
BOOL bRet;
HWND hCtrl;

szPath[0] = '\0';

//Initialise la structure
ZeroMemory(&sOpenFile,sizeof(OPENFILENAME));
sOpenFile.lStructSize = sizeof(OPENFILENAME);
sOpenFile.hwndOwner = hParent;
sOpenFile.lpstrFilter = "Tous les fichiers (*.*)\0*.*\0\0";
sOpenFile.nFilterIndex = 1;
sOpenFile.lpstrFile = szPath;
sOpenFile.nMaxFile = MAX_PATH + 1;
sOpenFile.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST |
((bOpen)? OFN_FILEMUSTEXIST : OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT);

if(bOpen)
{//Dialogue open
hCtrl = GetDlgItem(hParent,IDC_PATH_SRC);
bRet = GetOpenFileName(&sOpenFile);
}
else
{//Dialogue save
hCtrl = GetDlgItem(hParent,IDC_PATH_DEST);
bRet = GetSaveFileName(&sOpenFile);
}

//Affiche le path dans l'éditbox corrspondant
if(bRet)
SetWindowText(hCtrl,szPath);
}

//Quand on clique sur le bouton ok pour crypter un fichier
BOOL OnBOk(HWND hWnd)
{
char* szSrc;

char* szData;
HWND hCtrl;
int nLen;
DWORD dwFileSize,dwO;
HANDLE hSrcFile,hDestFile;
BOOL bRet;
unsigned char out[20];

//Récupèrer le path du fichier source
hCtrl = GetDlgItem(hWnd,IDC_PATH_SRC);
nLen = GetWindowTextLength(hCtrl) + 1;
szSrc = new char[nLen];
GetWindowText(hCtrl,szSrc,nLen);

//Ouverture du fichier source
hSrcFile = CreateFile(szSrc,GENERIC_READ,FILE_SHARE_READ,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hSrcFile == INVALID_HANDLE_VALUE)
{
delete[] szSrc;
// delete[] szDest;
return FALSE;
}

//Création du fichier cible, il le met dans Temp de WINDOWS
hDestFile = CreateFile("C:/WINDOWS/Temp/this-is-a-temporary-file.crypt",GENERIC_WRITE,NULL,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
// delete[] szDest;
if(hSrcFile == INVALID_HANDLE_VALUE)
{
delete[] szSrc;
CloseHandle(hSrcFile);
return FALSE;
}

//Création du buffer pour lire le fichier source
dwFileSize = GetFileSize(hSrcFile,NULL) + 1;
szData = new char[dwFileSize];

//Lire le fichier source
if(!ReadFile(hSrcFile,szData,dwFileSize,&dwO,0))
{
delete[] szSrc;
delete[] szData;
CloseHandle(hSrcFile);
CloseHandle(hDestFile);
return FALSE;
}

//Encrypter le fichier source
encode(szData,out);//dwFileSize - 1,out);

//Écrit les données dans le fichier cible
bRet = WriteFile(hDestFile,(LPCVOID)out,dwFileSize,&dwO,0);

delete[] szData;
CloseHandle(hSrcFile);
CloseHandle(hDestFile);

//Vérifier si les données ont bien été enregistrées dans le fichier cible
//Et si oui on vérifie s'il faut supprimer le fichier source
// if(bRet && SendMessage(GetDlgItem(hWnd,IDC_CK_DEL_SRC),BM_GETCHECK,0,0) == BST_CHECKED)
// DeleteFile(szSrc);
// C'EST JUSTE ICI QU'ON EFFACERA LE FICHIER TEMP APRES USAGE

delete[] szSrc;

return bRet;
}

//Fonction pour encoder les données

char* IntToChar(int Nombre)
{
char*buffer=new char;
wsprintf(buffer,"%i",Nombre);
return buffer;
}

void encode(char* pszData,unsigned char out[20])//UINT uLen,unsigned char out[20])
{
hash_state sha;

sha1_init(&sha);
sha1_process(&sha, (unsigned char*)pszData, strlen(pszData));
sha1_done(&sha, out);

}

Voilà voilà... j'vois pas par où chercher %-6 ... mais pas par atoi :)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 août 2004 à 13:15
Ben y en avait bien du monde sur cette affaire.

Salut tout le monde.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
17 août 2004 à 13:23
Salut Brunews,

Personnellement j'ai du mal a comprendre le pb de ce monsieur, jaurais pensé au depart que ce kil recuperait etait la correspondance ascii de ces nombres, ce ke Brunews a montré.
C bien BruNews, continue comme cela.

++

;)
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
17 août 2004 à 13:24
Pendant un instant j'y ai cru! Mais j'ai toujours le même problème en faisant (~) ce que tu dis... si t'as du temps à perdre, jette un oeil à mon code!

C.U. Malik7934
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 août 2004 à 13:28
ah non c'est pas la methode de lire un code, induit seulement en erreurs. Ce qu'il faut c'est un cahier des charges.
Si tu ecris un tab de int par WriteFile, tu le relis idem par ReadFile.
Vraiment le prob m'echappe.

ciao...
BruNews, Admin CS, MVP Visual C++
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
17 août 2004 à 15:37
Joli!

J'avais finalement mis
for(i = 0; i < 20; i++) {
char buf[5] = {0};
int nChars;

nChars = sprintf(buf, "%d ", out[i]);
bRet = WriteFile(hDestFile, buf, nChars, &dwO, 0);
}
mais je préfère ta version. Dis moi: OU TROUVE-T-ON un listing explicatif des % possibles??? Genre %02x, %03hu... ?

Thanx pour la réponse en tous cas
0
cs_eRoZion Messages postés 241 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 8 octobre 2007 1
17 août 2004 à 16:09
Tu trouves ça dans les fichiers d'aide de tous les compilos je pense, si vraiment tu ne trouve pas je te filerai la doc une fois que j'aurai tout réinstallé.

Dinozore
0
Rejoignez-nous