2011-10-18 2 views
1

J'essaie de hacher une chaîne puis d'utiliser ce hachage comme nom de fichier.Puis-je utiliser un hachage crypté comme nom de fichier ou dois-je le convertir en premier?

Mon problème: est que tous les C++ hashers/crypters Je suis venu à travers un hachage std :: string ou char * & retourne la chaîne hachée comme unsigned char *? Comment puis-je convertir ce char * non signé en une chaîne char * ou une chaîne std :: afin que je puisse l'écrire dans un fichier ou un nom de fichier? Ou n'ai-je pas besoin de le convertir en une chaîne normale pour l'utiliser?

tstring hashString(tstring str) 
{ 
    // Post: 

    unsigned char hashStr[SHA256_DIGEST_SIZE]; 
    std::string messageStr = str; 

    SHA256::getInstance()->digest(messageStr, hashStr); 
    //TCHAR *hashStrSigned = reinterpret_cast <TCHAR*>(hashStr); 

    // can I just use this hashStr to create a file? Or do I have to convert it to char* to use? 

    Handle newF = CreateFile((LPTSTR)hashStr, GENERIC_ALL, 0, NULL, CREATE_ALWAYS, 
           0, NULL); 

    return tstring(hashStrSigned); 
} 

Répondre

4

Le résultat du hachage contiennent probablement des octets qui correspondent aux caractères qui ne sont pas autorisés dans un nom de fichier (par exemple, null-char, « + », « ? », Etc ....). Donc, "hashStr" dans votre code n'est pas susceptible d'être une chaîne, mais juste un tableau d'octets qui ne sont pas terminés par un caractère nul.

Essayez cette petite fonction pour convertir « hachage binaire chaîne appropriée pour le nom de fichier »

void HashToString(unsigned char* shaHash, std::string* pStr) 
{ 
    char szHash[SHA256_DIGEST_SIZE*2+1]; 
    char* pszOut = szHash; 

    for (int x = 0; x < SHA256_DIGEST_SIZE; x++) 
    { 
     sprintf(pszOut, "%.2X", shaHash[x]); // write out as hex chars 
     pszOut += 2; // advance 2 chars 
    } 
    *pszOut = '\0'; // null terminate 

    *pStr = std::string(szHash); 
} 

Dans votre exemple de code ci-dessus, vous appelleriez comme suit:

std::string str; 
HashToString(hashStr, &str); 
HANDLE newF = CreateFileA(str.c_str(), ...); 
+0

Le hachage bibliothèque a probablement une fonction "hexdigest" que vous pourriez appeler au lieu de "digest", qui vous donnera les caractères hexadécimaux. Ensuite, tout ce qui est vraiment nécessaire est la dernière ligne à convertir en 'std :: string', bien que vous pourriez aussi avoir besoin d'avoir une conversation avec votre compilateur sur la différence entre' unsigned char * 'et' char * '. Si c'est le cas, le mieux est de faire 'std :: string (hexHash, hexHash + SHA256_HEXDIGEST_SIZE])' –

Questions connexes