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


Автор: Loony 16.5.2008, 13:44
Добрый день. Необходимо реализовать передачу по протоколу TCP бинарных данных. Данные даны в таком формате:
| Блок 1 (2 байта)| Блок 2 | Блок 3 |
Блок 1 - размер сообщения, Блок 2 - данные, зашифрованные по алгоритму RSA, Блок 3 - цифровая подпись данных, вычисляется по алгоритму RSA

Как подобное реализовать!? С php дело почти не имел, как вообще в нем работать с бинарными данными? Я могу например прочитать файл и передать по сети, а как вручную ввести ключи, которые даны в виде строк, но имеют шестнадцатиричное представление? Есть ли в php готовые реализации RSA для шифрования и цифровой подписи? Буду благодарен за любую помощь!

Автор: Fortop 16.5.2008, 14:09
http://www.php.net/manual/ru/refs.mathcrypto.crypto.php

Автор: Loony 16.5.2008, 15:26
Fortop, спасибо за линк, это я видел. Забыл упомянуть, что у меня имеются ключи в таком виде, для наглядности приведу кусочек кода:

Код

 function read_private_key($filename)
    {
        $xml = simplexml_load_file($filename);
        $key_values['Modulus'] = base64_decode($xml->Modulus);
        $key_values['Exponent'] = base64_decode($xml->Exponent);
        $key_values['P'] = base64_decode($xml->P);
        $key_values['Q'] = base64_decode($xml->Q);
        $key_values['DP'] = base64_decode($xml->DP);
        $key_values['DQ'] = base64_decode($xml->DQ);
        $key_values['InverseQ'] = base64_decode($xml->InverseQ);
        $key_values['D'] = base64_decode($xml->D);
        return $key_values;
    }


То есть, у меня нет в наличии .pem файла с ключем. Для цифровой подписи нужна реализация по формуле: signature = m ^ D mod Modulus. Как видно, даны превычесленные значения алгоритма, которые позволяют использовать так называемую "китайскую теорему об остатке", при этом увеличивается быстродействие. Еще остается открытым вопрос о формировании сообщения, есть подозрение, что нужно использовать "сырые" сокеты, но я не уверен. Люди добрые, откликнитесь, возможно кто-то сталкивался с подобными проблемами. Уже голова кругом!

Автор: Fortop 19.5.2008, 22:22
Loony, 
пробуй именно raw sockets больше в PHP с бинарными потоками почти ничего и не работает.

Т.е. открываешь сокет на нужный порт и отсылаешь свои ключи. хочешь побайтово, хочешь одним куском - тебе виднее по требованиям.

Добавлено @ 22:25
Цитата(Loony @  16.5.2008,  13:44 Найти цитируемый пост)
 как вручную ввести ключи, которые даны в виде строк, но имеют шестнадцатиричное представление


Берешь каждые 2ва шестандцатиричных символа, конвертируешь их в десятичные и конвертируешь в байт-символ.

Код

$byte = chr(hexdec('FF')); // FF только для примера, тут у тебя должны подставляться твои два символа.
$stringTosend .= $byte // добавили очередной байт к строке отправки.

Автор: Feldmarschall 19.5.2008, 22:29
http://php.net/pack

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