Существует ли стандартный способ представления хэша SHA1 в виде строки C, и как я могу преобразовать в нее? - PullRequest
6 голосов
/ 19 октября 2010

Этот вопрос о том, как создать хеш SHA-1 из массива данных в C с использованием библиотеки OpenSSL .

Возвращает массив из 20 байтов, содержащий хэш. Есть ли какой-нибудь стандартный способ представления этих данных в виде строки, а не в двоичном формате?

Если это так, есть ли в самом OpenSSL функция для преобразования в указанный формат строки?

Если нет, то как это сделать? Конечно, я могу придумать свою собственную кодировку, использовать base64 или нет, но есть ли какой-то канонический формат?

Ответы [ 4 ]

12 голосов
/ 19 октября 2010

Обычно хэши представляются в виде последовательности шестнадцатеричных цифр (естественно, по два на байт).Вы можете написать код, чтобы легко написать такую ​​вещь, используя ostringstream с правильными модификаторами:

#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();
}
3 голосов
/ 19 октября 2010

Стандартный способ представления хешей - шестнадцатеричные строки.
В C вы можете использовать printf("%02x", byte), чтобы получить шестнадцатеричное представление каждого байта.

Пример для MD5, должно быть легко адаптировать его для SHA:

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

2 голосов
/ 21 ноября 2010

Вот пример для 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);
0 голосов
/ 19 октября 2010

Privacy Enhanced Mail (или PEM), казалось, устанавливает стандарт для хранения текстовых представлений криптографических данных.PEM хранит фактический двоичный фрагмент в Base64, но также имеет текстовый верхний и нижний колонтитулы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...