Partage
  • Partager sur Facebook
  • Partager sur Twitter

HASH SHA256

29 juin 2014 à 19:13:09

Bonjour,

Je cherche à obtenir un HASH SHA-256 d'un fichier. Je suis partis du code de la msdn qui fait un HASH MD5.http://msdn.microsoft.com/en-us/library/windows/desktop/aa382380%28v=vs.85%29.aspx

Je l'ai donc modifié pour faire un hash SHA-1 d'un fichier. Le code fonctionne mais sa me dit que rgbHash est corrompu. Je n'ai pas trop compris pourquoi..

// HASH SHA-16.cpp : définit le point d'entrée pour l'application console.
//

#include "stdafx.h"


#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>

#define BUFSIZE 1024
#define MD5LEN  16


int main()
{
	DWORD dwStatus = 0;
	BOOL bResult = FALSE;
	HCRYPTPROV hProv = 0;
	HCRYPTHASH hHash, hHashClone;
	HCRYPTKEY pbHashValue[36];


	HANDLE hFile = NULL;
	BYTE rgbFile[BUFSIZE];
	DWORD cbRead = 0;
	BYTE rgbHash[MD5LEN];
	DWORD cbHash = 0;
	CHAR rgbDigits[] = "0123456789abcdef";
	LPCWSTR filename = L"a.txt";
	// Logic to check usage goes here.

	hFile = CreateFile(filename,
		GENERIC_READ,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		FILE_FLAG_SEQUENTIAL_SCAN,
		NULL);

	if (INVALID_HANDLE_VALUE == hFile)
	{
		dwStatus = GetLastError();
		printf("Error opening file %s\nError: %d\n", filename,
			dwStatus);
		_gettch();

		return 1;
	}

	// Get handle to the crypto provider
	if (!CryptAcquireContext(&hProv,
		NULL,
		NULL,
		PROV_RSA_FULL,
		CRYPT_VERIFYCONTEXT))
	{
		dwStatus = GetLastError();
		printf("CryptAcquireContext failed: %d\n", dwStatus);
		CloseHandle(hFile);
		_gettch();

		return 1;
	}

	if (!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash))
	{
		dwStatus = GetLastError();
		printf("CryptAcquireContext failed: %d\n", dwStatus);
		CloseHandle(hFile);
		CryptReleaseContext(hProv, 0);
		_gettch();

		return 1;
	}

	while (bResult = ReadFile(hFile, rgbFile, BUFSIZE,
		&cbRead, NULL))
	{
		if (0 == cbRead)
		{
			break;
		}

		if (!CryptHashData(hHash, rgbFile, cbRead, 0))
		{
			dwStatus = GetLastError();
			printf("CryptHashData failed: %d\n", dwStatus);
			CryptReleaseContext(hProv, 0);
			CryptDestroyHash(hHash);
			CloseHandle(hFile);
			_gettch();

			return 1;
		}
	}

	if (!bResult)
	{
		dwStatus = GetLastError();
		printf("ReadFile failed: %d\n", dwStatus);
		CryptReleaseContext(hProv, 0);
		CryptDestroyHash(hHash);
		CloseHandle(hFile);
		_gettch();

		return 1;
	}
	DWORD hashlen;
	cbHash = sizeof(DWORD);
	if (CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&hashlen, &cbHash, 0))
	{
		cbHash = 20;
		CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0);
		printf("MD5 hash of file %s is: ", filename);

		for (DWORD i = 0; i < cbHash; i++)
		{
			printf("%c%c", rgbDigits[rgbHash[i] >> 4],
				rgbDigits[rgbHash[i] & 0xf]);
		}
		printf("\n");
		_gettch();

	}
	else
	{
		dwStatus = GetLastError();
		printf("CryptGetHashParam failed: %d\n", dwStatus);
		_gettch();

	}

	CryptDestroyHash(hHash);
	CryptReleaseContext(hProv, 0);
	CloseHandle(hFile);

	return 0;
}

Mais un SHA-1 comparé à un MD5 sa n'a aucun avantage, j'ai donc modifié cette partie de code :

CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash)

en

CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash)

et

        PROV_RSA_FULL,

en

        PROV_RSA_PROV_RSA_AES,

Le code complet (je l'ai hébergé sur pastbin car sa commence à faire beaucoup de code là)

http://pastebin.com/L7rxwggk

Mais sa ne  fait pas le bon hash.. sa me donne "cccccccccccccccccccccccccccccccccccccccccccccccc00000"

Si quelqu'un pouvait m'aider.

Merci



  • Partager sur Facebook
  • Partager sur Twitter
30 juin 2014 à 11:26:08

Je n'ai pas trop regardé ton code, je te poste un exemple pour un sha256 sur une chaine de caractère :

#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>


int main (void)
{
    size_t i;
    unsigned char sha1Hash[32];
    char *st = "Le texte ou autre dont on veux le sha256.";
    DWORD sha1HashLen = 32;

    HCRYPTPROV hCryptProv;
    HCRYPTHASH hHash;

    if(!CryptAcquireContext(&hCryptProv, NULL, NULL,  PROV_RSA_AES , 0))
    {
        CryptReleaseContext(hCryptProv,0);
        exit(1);
    }

    if(!CryptCreateHash(hCryptProv, CALG_SHA_256, 0, 0, &hHash))
     {
        exit(1);
     }

    CryptHashData(hHash, (BYTE*)st, strlen(st), 0);

    CryptGetHashParam(hHash, HP_HASHVAL, sha1Hash, &sha1HashLen, 0);

    if(hHash) CryptDestroyHash(hHash);
    if(hCryptProv) CryptReleaseContext(hCryptProv,0);


    for (i = 0; i < sizeof(sha1Hash); i++) printf("%02X", sha1Hash[i]);

    return 0;
}
  • Partager sur Facebook
  • Partager sur Twitter
14 octobre 2019 à 8:22:12

salut,

serait-il possible de modifier ton code pour qu'il retourne le hash d'une chaine de caractère rentrée au clavier?

parce que je recherche actuellement le sha256 en c qui pourrait me retourner cela.

merci bien.

  • Partager sur Facebook
  • Partager sur Twitter
14 octobre 2019 à 11:53:01

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter