2016-09-24 6 views
2

Я пытаюсь написать реализацию SHA-1 на C++. По какой-то причине я получаю отличный результат, чем ожидаю.Неверный хэш в реализации на С ++ SHA-1

Ввод test должен содержать a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.

Вместо этого я получаю вывод e58f4aa9a69bb1cc73084c1c87e991d3d3bb2f98.

У меня есть следующая функция

void sha1(const uint8_t *org_msg, size_t org_len, uint8_t *digest) 

который я называю как

// msg = original input 
// org_len = original length of input 
// output = uint8_t output[20]; 
sha1((uint8_t *)msg.c_str(), org_len, output); 

У меня есть эти пять переменных в конце функции сжатия (которые являются правильными, как вы можете видеть here в то botom страницы)

h0 = 10101001010010101000111111100101 
h1 = 11001100101100011001101110100110 
h2 = 00011100010011000000100001110011 
h3 = 11010011100100011110100110000111 
h4 = 10011000001011111011101111010011 

Переменные все типа uint32_t. Теперь я хочу, чтобы преобразовать их в uint8_t, которые у меня есть следующие функции для:

void to_bytes(uint32_t val, uint8_t *bytes) { 
    bytes[0] = (uint8_t)val; 
    bytes[1] = (uint8_t)(val >> 8); 
    bytes[2] = (uint8_t)(val >> 16); 
    bytes[3] = (uint8_t)(val >> 24); 
} 

И я называю это как

to_bytes(h0, digest); 
to_bytes(h1, digest + 4); 
to_bytes(h2, digest + 8); 
to_bytes(h3, digest + 12); 
to_bytes(h4, digest + 16); 

и, наконец, вывести его как так:

for (size_t i = 0; i < 20; i++) { 
    printf("%2.2x", output[i]); 
} 

Что приводит к e58f4aa9a69bb1cc73084c1c87e991d3d3bb2f98.

+1

'to_bytes' производит обратный выход. 'bytes [0]' будет получать последние 8 бит ввода, в то время как вам нужны первые 8 бит. –

+0

Спасибо! Глупый из меня за то, что я его не видел. Вы ответите на него, и я помету его. – Cartman123

+0

С удовольствием помогите :) –

ответ

3

to_bytes производит обратный выход. bytes[0] получит последние 8 бит ввода, в то время как вам нужны первые 8 бит.

 Смежные вопросы

  • Нет связанных вопросов^_^