2015-09-11 3 views
0

Я разрабатываю класс hmac-sha1 для своего экзамена. У меня проблема, когда я должен применять sha-1 два раза, как описано в https://en.wikipedia.org/wiki/Hash-based_message_authentication_code.Преобразование unsigned int, отформатированное в HEX, в строку

Когда я применяю sha1 к строке, он возвращает мне unsigned int [5] с вычисленным хешем. Я хочу преобразовать unsigned int [5] в char [40] с хешем.

Например

unsigned int H[5] = { 67452301, EFCDAB89, 98BADCFE, 10325476, C3D2E1F0 }; 

// char [40] will be "67452301EFCDAB8998BADCFE10325476C3D2E1F0" 

Таким образом, я могу сцепить его IPAD, а затем рассчитать его хэш ipad_hash и, наконец, вычислить opad + ipad_hash конкатенации двух строк.

Правильно ли это?

Я использую arduino uno, поэтому «unsigned int» «unsigned long».

Это мой тестовый код (это беспорядок, но я буду чистить): http://pastebin.com/jfwBxAp1

+0

http://stackoverflow.com/questions/5100718/integer-to-hex-string-in-c –

ответ

0

Вы можете сделать

char hash_cstr[41]; 
sprintf(hash_cstr, "%08lX%08lX%08lX%08lX%08lX", H[0], H[1], H[2], H[3], H[4]) 

Убедитесь, что вы выделить по крайней мере 41 символов (40 для кода и 1 для NULL-терминатора).

В строке формата% 08X 08 обозначается пэд на 8 символов с использованием 0, так что вы получаете ведущие 0s для средних байтов, а X означает шестнадцатеричный формат с использованием символов верхнего регистра. Вы можете использовать нижний регистр x для символов нижнего регистра. Формат Hex автоматически принимает unsigned. Вы можете использовать lX для 64-битных типов.

+0

Это не работает, если я печатаю H с Serial.print (H [i], HEX) it gaves me "1E4E888AC66F8DD41E00C5A7AC36A32A9950D271" -> правильно, если я печатаю hash_cstr, он дает мне «0000888A00001E4E00008DD40000C66F0000C5A7» -> неправильно. H - массив беззнакового int, hash_cstr - массив символов. –

+0

@FloydCrimson Ваш компилятор имеет int, определяемый как 16 бит, поэтому вы получаете только 2 байта с X. Попробуйте использовать lX или llX. – Sorin

+0

Я вижу, что первые 2 байта всего 4 байта меняются местами со вторым 2. С помощью sprintf я могу читать половину всей строки ... –