Я пытаюсь написать реализацию 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
.
'to_bytes' производит обратный выход. 'bytes [0]' будет получать последние 8 бит ввода, в то время как вам нужны первые 8 бит. –
Спасибо! Глупый из меня за то, что я его не видел. Вы ответите на него, и я помету его. – Cartman123
С удовольствием помогите :) –