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가 나왔습니다.
위 해시값이 맞는지 해시 계산 프로그램으로 확인해보겠습니다.
해시 계산 프로그램으로 같은 이미지를 해시한 결과값 일치합니다.
이렇듯 해시를 통하여 파일의 위변조 여부, 즉 데이터 무결성을 보장할 수 있습니다.
2018/10/09 - [개발] - 해시(Hash) 알고리즘 / SHA256
'개발 > C' 카테고리의 다른 글
해시(Hash) 알고리즘 / SHA256 (0) | 2018.10.09 |
---|