C с использованием функции хеширования sha2

Как использовать функцию хеширования

void sha2( const unsigned char *input, int ilen,
           unsigned char output[32] )
{
    sha2_context ctx;

    sha2_starts( &ctx );
    sha2_update( &ctx, input, ilen );
    sha2_finish( &ctx, output );

    memset( &ctx, 0, sizeof( sha2_context ) );
}

Я пытался

sha2(InpData, sizeof(InpData), OutData)

но в результате я получаю ненужные данные.


c sha
person user2304765    schedule 17.05.2013    source источник
comment
В чем смысл memset?   -  person Carl Norum    schedule 17.05.2013
comment
@CarlNorum Единственный пункт memset - не оставлять контекст SHA-2 в стеке, который можно использовать для обратного проектирования исходной строки. Хэш устойчив к реверсированию, состояние контекста может не быть. Конечно, в этом случае проблема в том, что исходная строка тоже не перезаписывается ... :)   -  person Joachim Isaksson    schedule 17.05.2013


Ответы (2)


Не видя объявления InpData, мы не можем знать наверняка (Пожалуйста, опубликуйте короткий компилируемый пример), но вероятность такова, что InpData - это некий указатель, а не массив. Оператор sizeof(), применяемый к указателю, оценивает не размер выделенного хранилища, а размер указателя: обычно 4 или 8 байтов.

person This isn't my real name    schedule 17.05.2013

Просто вызовите его с данными, длиной и буфером, в котором вы хотите получить результат;

char* data = "my data to hash";
int datalen = strlen(data);       // or if binary data, the size of your input
unsigned char buffer[32];         // The buffer to receive the result

sha2(data,datalen,buffer);

Обратите внимание, что данные, полученные в буфере, являются двоичными (32 * 8 = 256 бит, если это SHA-256), поэтому вам нужно использовать hex / base64 / etc. закодируйте его перед отображением результата на экране.

РЕДАКТИРОВАТЬ: Чрезвычайно простое и хакерское шестнадцатеричное кодирование полностью без чистых кодовых точек :)

char* hexencode(void* data, int len)
{
  char* outdata = malloc(len*2+1);
  char* tmp = outdata;
  unsigned char* indata = (char*)data;
  while(len--)
  {
    *tmp++ = "0123456789abcdef"[(*indata)>>4];
    *tmp++ = "0123456789abcdef"[(*indata++)&0xf];
  }
  *tmp = 0;
  return outdata;
}
person Joachim Isaksson    schedule 17.05.2013
comment
он отправляет помощь, все еще получает мусор, но я получаю еще немного: ĹWç = pÓK1Ău! SŕĘDđˇá; ŞR ň | éG? -RcşáUË6ŕÚíÄÇÎ] «ts Правильный хеш: d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592 - person user2304765; 17.05.2013
comment
Прочтите примечание внизу, желаемый результат - двоичный код в шестнадцатеричном формате, а результат sha2 - просто двоичный файл. - person Joachim Isaksson; 17.05.2013
comment
Как просто закодировать его в asci в C, извините за новичок, спросите, я новичок в C? - person user2304765; 17.05.2013
comment
@ user2304765 Добавил простую шестнадцатеричную кодировку. Если вы не получаете правильный результат, нам нужно знать, что вы пытаетесь кодировать, чтобы попытаться повторить результат, поэтому вам нужно будет добавить код. - person Joachim Isaksson; 17.05.2013
comment
все еще не работает, вот предупреждения wklej.to/JuJ2f, источник: wklej.to/ljb6k - person user2304765; 17.05.2013
comment
@ user2304765 Я думаю, вам нужно добавить более подробную информацию к вашему вопросу, что вы пытаетесь сделать, код, который вы опубликовали, читает символ за раз, кажется, пытается вычислить контрольную сумму символа с помощью SHA256, а затем записывает тот же символ в серийный номер порт. Вы хотите проверять контрольную сумму более чем одного символа за раз? - person Joachim Isaksson; 17.05.2013
comment
Дело в том, чтобы сделать контрольную сумму из inpdata с помощью sha256 и записать ее в OutData, а затем отправить. это все. inpdata может состоять из одного символа или более десятка - person user2304765; 17.05.2013