개발/C

[C언어] 해시 알고리즘 / OpenSSL/ SHA256 사용

그린란드상어 2018. 10. 14. 20:02
반응형

OpenSSL


OpenSSL은 네트워크를 통한 데이터 통신에 쓰는 프로토콜인 TLS와 SSL의 오픈 소스 구현판이다. C언어로 작성되어 있는 중심 라이브러리 안에는, 기본적인 암호화 기능 및 여러 유틸리티 함수들이 구현되어 있다.


OpenSSL 라이브러리 안의 SHA-256 알고리즘을 사용해 보고자 한다.




윈도우 환경에서 사용할 수 있도록 미리 컴파일 해놓은 사이트


https://www.npcglib.org/~stathis/blog/precompiled-openssl/



위 사이트에서 필요한 것을 다운로드 받는다.


include 안의 헤더파일과 lib폴더안의 라이브러리가 필요합니다.





속성의 C/C++ -> 일반 -> 추가 경로에서 openssl 폴더가 위치한 경로 추가





링커 -> 일반 -> 추가 라이브러리 경로에서 lib 폴더 경로 추가





링커 -> 입력 -> 라이브러리를 추가합니다.







#include <openssl/sha.h>를 해준다.

int calc_sha256(char *path, char *output) {

	FILE* file = fopen(path, "rb");
	if (!file) return -1;
	
	unsigned char hash[SHA256_DIGEST_LENGTH];
	const int bufSize = 32768;
	unsigned char *buffer = (unsigned char *)malloc(bufSize);
	SHA256_CTX sha256;
	int bytesRead = 0;

	if (!buffer) return -2;

	SHA256_Init(&sha256);

	while ((bytesRead = fread(buffer, 1, bufSize, file))) {
		SHA256_Update(&sha256, buffer, bytesRead);
	}

	SHA256_Final(hash, &sha256);
	sha256_hash_string(hash, output);
	fclose(file);

	return 0;
}

void sha256_hash_string(unsigned char hash[SHA256_DIGEST_LENGTH], char *outputBuffer)
{
	int i = 0;
	for (i = 0; i < SHA256_DIGEST_LENGTH; i++)
	{
		sprintf(outputBuffer + (i * 2), "%02x", hash[i]);
	}
	outputBuffer[64] = 0;
}

void main(int argc, char *argv[]) {

	char calc_hash[65];
	char * path = "shark.png";
	int result;
	result = calc_sha256(path, calc_hash);
	printf("%s\n", calc_hash);

	return ;
}


calc_sha256 함수에서 해쉬된 내용을 sha256_hash_string에서 스트링으로 바꿔 출력해줍니다.


위 예제에서는 아래의 shark.png 파일을 해시했습니다.






해시값 계산 결과로


6C931954FFB802D5DD1AC5DFF30B09A637C136C1BE8FD9C0D5955BAC364CF474가 나왔습니다.




결과확인


위 해시값이 맞는지 해시 계산 프로그램으로 확인해보겠습니다.




calcfilehash_1_0_1_5.zip







해시 계산 프로그램으로 같은 이미지를 해시한 결과값 일치합니다.


이렇듯 해시를 통하여 파일의 위변조 여부, 즉 데이터 무결성을 보장할 수 있습니다.





2018/10/09 - [개발] - 해시(Hash) 알고리즘 / SHA256







반응형

'개발 > C' 카테고리의 다른 글

해시(Hash) 알고리즘 / SHA256  (0) 2018.10.09