I am trying to create a program that prints the given hash as input.
Example: myprogram.exe
04033ca1921e1d4ab6c4036401786c18d97dca5ea4f886b95ae92d4e3423fffe0045071b97cdd00df725611d757d1ca756ab325230a7faeead09385663a29ae2
Output: Hash algorithm: SHA512
myprogram.exe
86896e2eb7ea8ce15c3037d4d59e2f5f505d28588b413b48499d54f6d83b877fc01512aac7c98f28bb2ef3f0b7ddd5e740ae3146d13385efe1bc67f00721c951
Output: Hash algorithm: SHA3-512
myprogram.exe
c872e20ea321f223c531c03a37b58c51
Output: Hash algorithm: MD5
I have this code:
#include <iostream>
#include <string>
#include <openssl/evp.h>
std::string determineHashAlgorithm(const std::string& hash) {
const EVP_MD* md = EVP_get_digestbyname("SHA256");
if (md == nullptr) {
return "Unknown";
}
EVP_MD_CTX* mdctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(mdctx, md, nullptr);
unsigned char md_value[EVP_MAX_MD_SIZE];
unsigned int md_len;
EVP_DigestUpdate(mdctx, hash.c_str(), hash.length());
EVP_DigestFinal_ex(mdctx, md_value, &md_len);
EVP_MD_CTX_free(mdctx);
if (md_len == hash.length() && memcmp(md_value, hash.c_str(), md_len) == 0) {
return EVP_MD_name(md);
}
return "Unknown";
}
int main(int argc, char* argv[]) {
if (argc != 2) {
std::cout << "Usage: " << argv[0] << " <hash>\n";
return 1;
}
std::string hash = argv[1];
std::string algorithm = determineHashAlgorithm(hash);
std::cout << "Hash algorithm: " << algorithm << std::endl;
return 0;
}
And it says: Hash algorithm: unknown every time, no mater the hash you give as input.
Thank you in advance!