2010-10-19 7 views
6

This question chodzi o to, jak utworzyć skrót SHA-1 z tablicy danych w C przy użyciu biblioteki OpenSSL.Czy istnieje standardowy sposób reprezentowania skrótu SHA1 jako ciągu C i jak mogę go przekonwertować?

Zwraca tablicę składającą się z 20 bajtów, zawierającą skrót. Czy istnieje jakiś standardowy sposób reprezentowania tych danych w formie łańcuchowej, a nie binarnej?

Jeśli tak, czy w samej OpenSSL istnieje funkcja konwersji na format napisów?

Jeśli nie, jak należy to zrobić? Oczywiście, mogę wymyślić własne kodowanie, użyć base64 lub czego nie, ale czy istnieje jakiś format kanoniczny?

Odpowiedz

12

Zwykle hashy są reprezentowane jako ciąg cyfr szesnastkowych (naturalnie dwa na bajt). Można napisać kod, aby napisać coś takiego łatwo przy użyciu ostringstream z odpowiednich modyfikatorów:

#include <string> 
#include <sstream> 
#include <iomanip> 

std::string GetHexRepresentation(const unsigned char * Bytes, size_t Length) 
{ 
    std::ostringstream os; 
    os.fill('0'); 
    os<<std::hex; 
    for(const unsigned char * ptr=Bytes;ptr<Bytes+Length;ptr++) 
     os<<std::setw(2)<<(unsigned int)*ptr; 
    return os.str(); 
} 
+1

Dzięki, a nawet przykład ślicznotka C++ dla programistów C++ tam. Dobra robota! –

+1

W kontekście kryptograficznym, base64 jest znacznie bardziej powszechną reprezentacją tekstową dla danych binarnych (takich jak hasze) niż szesnastkowy. –

+2

Dla danych ogólnych i długich binarnych tak, ale widziałem krótkie dane i skróty (które zwykle są wystarczająco krótkie) prawie zawsze wyrażone w postaci szesnastkowej. –

3

Standardowy sposób reprezentowania mieszań jest jako ciągi szesnastkowe.
W języku C można użyć printf("%02x", byte), aby uzyskać reprezentację szesnastkową każdego bajtu.

Przykładem MD5, powinny być łatwe do dostosowania go do SHA:

http://en.literateprograms.org/MD5_sum_(C,_OpenSSL)

+4

'$ byte'? Napisałeś ostatnio dużo Perla? ;) –

+0

Lol za $ bajt. Przegłosowałem, ale już rozdałem akceptację pierwszemu facetowi. –

+0

Niestety, to zły nawyk PHP :) – Archimedix

0

Privacy Enhanced Poczta (lub PEM) wydawało się, wyznacza standardy dla przechowywania danych tekstowych reprezentacji kryptograficznych. PEM przechowuje rzeczywisty fragment binarny w Base64, ale ma również nagłówek i stopkę tekstową.

+1

PEM definiuje standardowe formaty przechowywania kluczy i certyfikatów w plikach - a wewnątrz certyfikatu hasz rzeczywiście będzie kodowany w base-64 - ale skrót hash jest zwykle wyświetlany tylko w języku heksadecymalnym. Jeśli jest to kluczowy odcisk palca, jest zwykle wyświetlany jako pary cyfr szesnastkowych rozdzielonych dwukropkami (patrz np. RFC4716) – dajames

2

Oto przykład dla C:

//function 
void convertSHA1BinaryToCharStr(const unsigned char * const hashbin, char * const hashstr) { 
    for(int i = 0; i<20; ++i) 
    { 
    sprintf(&hashstr[i*2], "%02X", hashbin[i]); 
    } 
    hashstr[40]=0; 
} 

//Example call. hashbin is the 20byte hash array. 
char hashstr[41]; 
convertSHA1BinaryToCharStr(hashbin, hashstr); 
printf("%s\n", hashstr); 
Powiązane problemy