Я пытаюсь реализовать алгоритм HMAC-SHA1 в своем C++ / спокойное приложение. У меня есть метод для доступного алгоритма Sha1, я просто должен понять часть HMAC его.
Этот псевдокод из Википедии:
1 function hmac (key, message)
2 if (length(key) > blocksize) then
3 // keys longer than blocksize are shortened
4 key = hash(key)
5 end if
6 if (length(key) < blocksize) then
7 // keys shorter than blocksize are zero-padded
8 key = key ∥ zeroes(blocksize - length(key))
9 end if
10
11 // Where blocksize is that of the underlying hash function
12 o_key_pad = [0x5c * blocksize] ⊕ key
13 i_key_pad = [0x36 * blocksize] ⊕ key // Where ⊕ is exclusive or (XOR)
14 // Where ∥ is concatenation
15 return hash(o_key_pad ∥ hash(i_key_pad ∥ message))
16 end function
Каков blocksize? Что обнулять-функция делает на строке 8? Как Вы выражаете строки 12-13 в C++?
Обычно хеш-алгоритм обрабатывает данные, разрезая их на фрагменты данных фиксированного размера (также известные как «блоки»). Для SHA1 обычный размер блока составляет 64 байта.
Она (как сказано в комментарии) добавляет «нули» в конец ключа, чтобы его длина соответствовала размеру «блока».
Думаю, вы ищете оператор XOR: ^
.
Пример:
o_key_pad = (0x5c * blocksize) ^ key; // Actually, it should be 0x5c5c5c... repeated enough so that it matches key size.
Небольшое примечание : это не имеет ничего общего с Qt
, и вы, вероятно, захотите сделать это в "исходном" C ++
, поэтому что вы можете в конечном итоге повторно использовать его в проекте, отличном от Qt
. Qt
великолепен imho, но вам явно не требуется, чтобы он реализовал это.
Взгляните на библиотеку QCA . Он уже предоставляет реализации всех основных криптографических алгоритмов.
Вам также следует взглянуть на QCryptographicHash , поскольку он может помочь вам с sha1-частью вашей проблемы.