Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Шифрование, формирование подписи


Автор: webmax 15.7.2013, 13:42
Я не имел дел с шифрованием, а тут для связи сайта с банком понадобилось сделать две с виду несложных вещи. Прошу помощи:

1.  Сформировать переменную NONCE – от 8 до 32 случайным образом сформированных байтов в hex формате.

2. Есть строка: 
Код

$str = '511.483USD677144616IT Books. Qty: 217Books Online Inc.14www.sample.com 1512345678901234589999999919pgw@mail.sample.com11--1420030105153021 16F2B2DD7E603A7ADA33https://www.sample.com/shop/reply';

и есть ключ:
Код

$key = '00112233445566778899AABBCCDDEEFF';

Нужно из них сделать подпись с помощью шифрования алгоритмом HMAC_SHA1.
Я сделал вот так:
Код

hash_hmac('sha1', $str, $key);

Выдаёт: 857d471f3660de69a106ad6e214edec38bfc41a7
Но в примере сказано, что должно получиться: FACC882CA67E109E409E3974DDEDA8AAB13A5E48

Привожу выдержку из примера:
Цитата

MAC source string for this example is:
511.483USD677144616IT Books. Qty: 217Books Online Inc.14www.sample.com 1512345678901234589999999919pgw@mail.sample.com11--1420030105153021 16F2B2DD7E603A7ADA33https://www.sample.com/shop/reply
Line breaks are inserted for visibility only. This string is 190 bytes long.
After the MAC source string is assembled, the merchant system must apply a cryptographic algorithm to generate the message authentication code. Gateway supports various cryptographic algorithms and the system administrator may specify which algorithm will be used for a particular merchant terminal.
The merchant system must implement a chosen algorithm either in hardware or software form and be fully responsible for the secure storage and usage of corresponding cryptographic keys. An effective key length must be at least 112 bits for symmetric cryptographic algorithms and 1024 bits for RSA algorithm.
The default MAC algorithm is HMAC_SHA1. Standard options include Triple DES ABA/ABC CBC MAC, AES 128 CBC MAC and RSA/SHA1 signature. Additional options may be available on demand.
For our MAC source string example and HMAC_SHA1 algorithm with hexadecimal secret key “00112233445566778899AABBCCDDEEFF”, the result MAC (“P_SIGN”) field must be equal to: “FACC882CA67E109E409E3974DDEDA8AAB13A5E48”. MAC field value can be either an upper case or lower case hexadecimal string.

Автор: Fortop 15.7.2013, 17:23
Цитата(webmax @  15.7.2013,  13:42 Найти цитируемый пост)
Выдаёт: 857d471f3660de69a106ad6e214edec38bfc41a7
Но в примере сказано, что должно получиться: FACC882CA67E109E409E3974DDEDA8AAB13A5E48


Внимательнее относимся
Цитата(webmax @  15.7.2013,  13:42 Найти цитируемый пост)
Line breaks are inserted for visibility only. This string is 190 bytes long.


А сколько длина этой строки в байтах?
Цитата(webmax @  15.7.2013,  13:42 Найти цитируемый пост)
$str = '511.483USD677144616IT Books. Qty: 217Books Online Inc.14www.sample.com 1512345678901234589999999919pgw@mail.sample.com11--1420030105153021 16F2B2DD7E603A7ADA33https://www.sample.com/shop/reply';


Автор: webmax 15.7.2013, 17:53
а-а-а-а, какая же у меня невнимательность... конечно, скопировал тупо из примера, а там лишние пробелы. Спасибо огромное! 
Пока искал ответ на свои вопросы, понял ещё, что перед вставкой $key в функцию шифрования эту переменную нужно предварительно пропустить через:
Код

$key = pack('H*', $key);


Второй вопрос полностью решен! По первому вопросу подсказать сможете? Как люди делают от 8 до 32 случайным образом сформированных байтов в hex формате?

Автор: Fortop 15.7.2013, 18:26
Цитата(webmax @  15.7.2013,  17:53 Найти цитируемый пост)
Как люди делают от 8 до 32 случайным образом сформированных байтов в hex формате?

не в курсе.

Можно просто генерить случайное число и конвертировать его

А можно, например, вот этим воспользоваться
http://www.php.net/manual/en/function.openssl-random-pseudo-bytes.php
там есть и пример

Автор: webmax 16.7.2013, 18:23
Если сделать так:
Код

bin2hex(pack('H*', str_shuffle('0123456789ABCDEF')))

это будет похоже на правду? smile

Автор: webmax 16.7.2013, 21:50
Не, фигню написал я... Распугал ею всех форумчан, наверное smile Но, может, кто-то остался еще и поможет smile

Автор: webmax 17.7.2013, 20:55
Ребята, подскажите, пожалуйста, хотя бы ответ "да/нет" на следующее: 
хекс - это не просто любой набор из символов 0-9А-F, а особым образом упорядоченный?

Автор: Fortop 17.7.2013, 22:39
Цитата(webmax @  17.7.2013,  20:55 Найти цитируемый пост)
хекс - это не просто любой набор из символов 0-9А-F, а особым образом упорядоченный? 

простой набор

Добавлено через 39 секунд
111111123AAF
FAEEABEAECD1

и т.д.

Добавлено через 3 минуты и 8 секунд
Лишь один нюанс
1 байт = от 00 до FF в 16тиричной системе (0-255 в 10тичной)

Автор: webmax 18.7.2013, 06:42
Спасибо! Выходит, что число символов должно быть обязательно четным. В таком случае для моей задачи вполне подойдёт такой вариант:
Код

substr(str_shuffle('0000111122223333444455556666777788889999AAAABBBBCCCCDDDDEEEEFFFF'), 0, 16)

Я прав?

Я писал:
Цитата

Не, фигню написал я...

потому что позже понял, что вот это:
Код

bin2hex(pack('H*', str_shuffle('0123456789ABCDEF')))

то же самое, что просто это:
Код

str_shuffle('0123456789ABCDEF')

Проблема в том, что я понятия особого не имею о глубинной сути хекс-формата. Поэтому и пытался использовать именно хексовую функцию bin2hex, надеясь, что если хекс - это не просто любой набор из 0-9А-F, а особым образом упорядоченный, то bin2hex сделает своё дело. Но, к счастью, как оказалось, никакой особой упорядоченности в символах хекса не должно быть smile

Автор: Fortop 18.7.2013, 11:28
Цитата(webmax @  18.7.2013,  06:42 Найти цитируемый пост)
о глубинной сути хекс-формата

Это просто 16тиричная система исчисления.
где все числа должны быть представлены из цифр 0-9 и букв A-F

никакой другой сути у нее нет.

Цитата(webmax @  18.7.2013,  06:42 Найти цитируемый пост)
substr(str_shuffle('0000111122223333444455556666777788889999AAAABBBBCCCCDDDDEEEEFFFF'), 0, 16)

запутано и непонятно. Но может подойти

Что мешает просто взять 4 случайных числа в диапазоне от 0 до 2^16 сконвертировать их в 16тиричный вид и просто конкатенировать эти четыре строки предварительно выровняв нулями до 4х символов каждую?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)