marco_coder
asked on
FILE checksum of a file in c/c++ ? 2 ways needed.
Hi i need a simple class win32, visual c/c++ 6.0 NO MFC ofcourse ;-)
like :
class FILE_CHECKSUM
{
private:
public:
char * get_MD5_sum(char * filename);
char * get_SHA_SUM(char* filename);
};
I am looking for something SIMPLE nothing fancy.
The reason is that i need to know when someone has messed up my pc, aka
hacked it, trojanned it, infected it.....
Thats why i want to write this tool.
Thanx.
like :
class FILE_CHECKSUM
{
private:
public:
char * get_MD5_sum(char * filename);
char * get_SHA_SUM(char* filename);
};
I am looking for something SIMPLE nothing fancy.
The reason is that i need to know when someone has messed up my pc, aka
hacked it, trojanned it, infected it.....
Thats why i want to write this tool.
Thanx.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
http://www.openssl.org
Here and example for calculating the md5 sum:
(ommitting much of the recommended error handling)
Implemented on Linux Debian AMD 64 gcc 4.x
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <openssl/evp.h>
unsigned char * calculate_md5_of(void *content, ssize_t len){
EVP_MD_CTX mdctx;
const EVP_MD *md;
unsigned char *md_value[EVP_MAX_MD_SIZE]
unsigned char *result = malloc(EVP_MAX_MD_SIZE * 2);
char as_hex[10];
unsigned int md_len, i;
if (NULL == result) {
return NULL;
}
OpenSSL_add_all_digests();
md = EVP_get_digestbyname("MD5"
EVP_MD_CTX_init(&mdctx);
EVP_DigestInit_ex(&mdctx, md, NULL);
EVP_DigestUpdate(&mdctx, content, (size_t) len);
EVP_DigestFinal_ex(&mdctx,
EVP_MD_CTX_cleanup(&mdctx)
for(i = 0; i < md_len; i++){
sprintf(as_hex, "%02x", md_value[i]);
strcat(result, as_hex);
}
return result;
}
int main (void) {
char *file_content = NULL;
char *file_name = "t1.txt";
struct stat stat_buf;
int i_rval = 0;
int in_fd = -1;
off_t size_of_file;
ssize_t read_bytes;
unsigned char *md5_sum;
i_rval = stat(file_name, &stat_buf);
size_of_file = stat_buf.st_size;
file_content = malloc(size_of_file);
if (NULL == file_content){
goto clean;
}
in_fd = open(file_name, 0, O_RDONLY);
if (in_fd < 0 ){
goto clean;
}
/* slurp in all from the file at once */
read_bytes = read(in_fd, file_content, size_of_file);
if ( read_bytes < 0 ) {
fprintf(stderr, "something has gone wrong while reading from the file\n");
goto clean;
}
close(in_fd);
md5_sum = calculate_md5_of(file_cont
if (NULL == md5_sum){
goto clean;
}
printf("md5 of file = %s\n", md5_sum);
free(md5_sum);
free(file_content);
return 0;
clean:
if (file_content) free(file_content);
if (in_fd > 0) close(in_fd);
exit(EXIT_FAILURE);
}
Regards
Friedrich