Nesse tutorial vamos aprender como criar hashs em C/C++ usando a lib do openssl (nesse topico não vou abordar a instalação da lib ou da biblioteca), no caso o openssl é uma excelente ferramenta de criptografia contendo varios tipos de hashs (md5, md4, sha, ripemd e whrlpool), criptografias simetricas/assimetricas, certificados digitais, formas de comunicações criptografadas (ssl/tls) entre outras coisas. No caso das hashs começamos declarando a biblioteca dela (no caso do md5 que vamos utilizar nesse tutorial incluimos o openssl/md5)
para compilar é necessario declarar a lib crypto durante a compilação, caso não fizer o compilador não vai reconhecer as funções do openssl
agora declaramos a estrutura de contexto daquela hash, sendo MD5_CTX no caso do md5
usamos a função MD5_Init com o endereço de memoria da nossa estrutura de contexto
vamos criar uma array contendo a nossa string e uma outra tendo o tamanho 16bytes para armazenar a hash gerada (no caso da md5 é uma hash de 128bits ou seja 16bytes de tamanho fixo)
agora usamos a função MD5_Upadate para calcular a hash md5, o primeiro argumento dela é o endereço do contexto da hash, o segundo argumento é a nossa string que vamo calcular, o terceiro argumento é o tamanho dessa string (obs: temos que tomar um certo cuidado aqui nesse tamanho, as strings em C tem um caracter NULL no final, caso voce inclua ele acidentalmente o calculo da hash vai ser diferente e pode não bater com outros sistemas, outro problema caso crie uma array de um tamanho especifico por exemplo de 10 bytes e seu texto nela é de apenas apenas 4 bytes então deve tomar o cuidado de incluir apenas esses 4 bytes)
por fim usamos a função MD5_Final para exportar os bytes do MD5 para a nossa array, nessa função passamos como argumento o nossa array seguido do endereço do contexto
agora basta a gente ler a nossa array que contem a hash
em outros tipos de hashs é a mesma logica do md5, bastando mudar apenas os nomes das funções, ex: sha256
bom galera tem outras funções do openssl bem legais tambem que podemos abordar em futuros posts (OU NAO) \o
by kodo no kami
- Código:
#include <stdio.h>
#include <openssl/md5.h>
int main(void){
}
para compilar é necessario declarar a lib crypto durante a compilação, caso não fizer o compilador não vai reconhecer as funções do openssl
- Código:
gcc kodo.c -o kodo.out -l crypto
agora declaramos a estrutura de contexto daquela hash, sendo MD5_CTX no caso do md5
- Código:
#include <stdio.h>
#include <openssl/md5.h>
int main(void){
MD5_CTX hash;
}
usamos a função MD5_Init com o endereço de memoria da nossa estrutura de contexto
- Código:
#include <stdio.h>
#include <openssl/md5.h>
int main(void){
MD5_CTX hash;
MD5_Init(&hash);
}
vamos criar uma array contendo a nossa string e uma outra tendo o tamanho 16bytes para armazenar a hash gerada (no caso da md5 é uma hash de 128bits ou seja 16bytes de tamanho fixo)
- Código:
#include <stdio.h>
#include <openssl/md5.h>
int main(void){
MD5_CTX hash;
char texto[] = "cade as waifus";
unsigned char textohash[16];
MD5_Init(&hash);
}
agora usamos a função MD5_Upadate para calcular a hash md5, o primeiro argumento dela é o endereço do contexto da hash, o segundo argumento é a nossa string que vamo calcular, o terceiro argumento é o tamanho dessa string (obs: temos que tomar um certo cuidado aqui nesse tamanho, as strings em C tem um caracter NULL no final, caso voce inclua ele acidentalmente o calculo da hash vai ser diferente e pode não bater com outros sistemas, outro problema caso crie uma array de um tamanho especifico por exemplo de 10 bytes e seu texto nela é de apenas apenas 4 bytes então deve tomar o cuidado de incluir apenas esses 4 bytes)
- Código:
#include <stdio.h>
#include <openssl/md5.h>
int main(void){
MD5_CTX hash;
char texto[] = "cade as waifus";
unsigned char textohash[16];
MD5_Init(&hash);
MD5_Update(&hash, texto, sizeof(texto) - 1);
}
por fim usamos a função MD5_Final para exportar os bytes do MD5 para a nossa array, nessa função passamos como argumento o nossa array seguido do endereço do contexto
- Código:
#include <stdio.h>
#include <openssl/md5.h>
int main(void){
MD5_CTX hash;
char texto[] = "cade as waifus";
unsigned char textohash[16];
MD5_Init(&hash);
MD5_Update(&hash, texto, sizeof(texto) - 1);
MD5_Final(textohash, &hash);
}
agora basta a gente ler a nossa array que contem a hash
- Código:
#include <stdio.h>
#include <openssl/md5.h>
int main(void){
MD5_CTX hash;
char texto[] = "cade as waifus";
unsigned char textohash[16];
MD5_Init(&hash);
MD5_Update(&hash, texto, sizeof(texto) - 1);
MD5_Final(textohash, &hash);
int cont = 0;
for(cont; cont <= (sizeof(textohash) - 1); cont++){
printf("%02x", textohash[cont]);
}
printf("\n");
}
em outros tipos de hashs é a mesma logica do md5, bastando mudar apenas os nomes das funções, ex: sha256
- Código:
#include <stdio.h>
#include <openssl/sha.h>
int main(void){
SHA256_CTX hash;
char texto[] = "cade as waifus";
unsigned char textohash[32];
SHA256_Init(&hash);
SHA256_Update(&hash, texto, sizeof(texto) - 1);
SHA256_Final(textohash, &hash);
int cont = 0;
for(cont; cont <= (sizeof(textohash) - 1); cont++){
printf("%02x", textohash[cont]);
}
printf("\n");
}
bom galera tem outras funções do openssl bem legais tambem que podemos abordar em futuros posts (OU NAO) \o
by kodo no kami