Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сокеты, байты и шифрование 
:(
    Опции темы
bars80080
Дата 8.11.2011, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



мне надо раздраконить одну тему, которой я раньше не касался, а вместе с ней идёт свора вопросов

задача такая, надо соединиться с неким сервером через сокет, отправить сообщение и получить ответ

передаваемые данные имею такую структуру:

[заголовок][ответ]

в заголовке

Код

Смещение    Длина (байт)    Тип    Описание
0    4    Целое число    Длина текста сообщения (без заголовка)
4    4    Целое число    Время создания запроса (кол-во секунд с 1 января 1970 GMT)
8    4    Целое число    Идентификатор сообщения
12    32        Зарезервировано (заполнено нулевым байтом)


где целые числа передаются в сетевом формате (network byte order).
соответственно 

вопрос 1: можно ли соединять заголовок и ответ обычной конкатенацией, как строки, учитывая, что в заголовке всё побайтово?

вопрос 2: как обычное число превратить в network byte order?

вопрос 3: нулевой байт 0х00, как я понял, можно ли его нарастить до нужной длины конкатенацией? не схлопнется ли от чего-нибудь?



пока наработка выглядит так:


Код

$address = 'domain';
$port    = 10001;

try {
    
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if($socket < 0) {
        throw new Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n");
    }
    
    $result = socket_connect($socket, $address, $port);
    if ($result === false) {
        throw new Exception('socket_connect() failed: '.socket_strerror(socket_last_error())."\n");
    }
    
    // общаемся с клиентом, отправляя ему данные
    $header = $body = '';
    
    $body_len = mb_strlen($body);
    $create_time = time();
    $message_id = 0;
    $null32 = ''; for($i = 0; $i < 32; $i++) { $null32 .= 0x00; }
    
    $header .= $body_len . $create_time . $message_id . $null32;
    
    $message = $header.$body;
    
    socket_write($socket, $message, mb_strlen($message));
    
    $out = socket_read($socket, 1024);
    echo $out."\n";
    
    $msg = 'shutdown';
    socket_write($socket, $msg, strlen($msg));
    
} catch (Exception $e) {
    $txt = $e->getMessage();
    $txt = iconv('cp1251', 'UTF-8', $txt);
}

if(isset($socket)) {
    socket_close($socket);
}


PM MAIL WWW   Вверх
Pfailed
Дата 8.11.2011, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 5
Всего: 39



http://ru2.php.net/manual/en/function.pack.php
Цитата(bars80080 @  8.11.2011,  17:35 Найти цитируемый пост)
вопрос 1: можно ли соединять заголовок и ответ обычной конкатенацией, как строки, учитывая, что в заголовке всё побайтово?

можно и конкатенацией, а можно и в pack все соеденить
Цитата(bars80080 @  8.11.2011,  17:35 Найти цитируемый пост)
вопрос 2: как обычное число превратить в network byte order?

network order == big endian byte order
4 байта = 32 бита
Цитата(bars80080 @  8.11.2011,  17:35 Найти цитируемый пост)
вопрос 3: нулевой байт 0х00, как я понял, можно ли его нарастить до нужной длины конкатенацией? не схлопнется ли от чего-нибудь?

можно



--------------------
PM MAIL   Вверх
bars80080
Дата 9.11.2011, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Код

    $header = '';
    $body = '';
    
    $body_len = mb_strlen($body); $body_len = pack('N*', $body_len);
    $create_time = time(); $create_time = pack('N*', $create_time);
    $message_id = $create_time;
    $null32 = ''; for($i = 0; $i < 32; $i++) { $null32 .= 0x00; }
    
    $header .= $body_len . $create_time . $message_id . $null32;
    
    $message = $header.$body;
    
    var_dump($message);
    echo var_export($message).'<br />';
    print_r($message);


Код

string(98) "����N�9�N�9�0000000000000000000000000000000006400000000000000000000000000000000000000000000000000"
'' . "\0" . '' . "\0" . '' . "\0" . '' . "\0" . 'N�9�N�9�0000000000000000000000000000000006400000000000000000000000000000000000000000000000000'
N�9�N�9�0000000000000000000000000000000006400000000000000000000000000000000000000000000000000


в cp1251 это выглядит немного иначе:

Код

string(98) "����Nє9§Nє9§0000000000000000000000000000000006400000000000000000000000000000000000000000000000000"
'' . "\0" . '' . "\0" . '' . "\0" . '' . "\0" . 'Nє9§Nє9§0000000000000000000000000000000006400000000000000000000000000000000000000000000000000'
Nє9§Nє9§0000000000000000000000000000000006400000000000000000000000000000000000000000000000000


однако, мне принципиально получать результат для UTF-8



правильно ли оно делается?

меня больше всего напрягает ситуация, что я не знаю, как проверять, что у меня получается. 
есть ли какой-нибудь способ увидеть непосредственно значения байтов?

и вопрос: а как получить, допустим, число на 8 байт? через $q = pack('N*', $x), а затем докинуть впереди недостающее число нулевых байт, определённое как 8 - mb_strlen($q)?
PM MAIL WWW   Вверх
Pfailed
Дата 9.11.2011, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 5
Всего: 39



Цитата(bars80080 @  9.11.2011,  10:40 Найти цитируемый пост)
меня больше всего напрягает ситуация, что я не знаю, как проверять, что у меня получается. 
есть ли какой-нибудь способ увидеть непосредственно значения байтов?

Записать в файл и посмотреть в hex редакторе.


Цитата(bars80080 @  9.11.2011,  10:40 Найти цитируемый пост)
и вопрос: а как получить, допустим, число на 8 байт? через $q = pack('N*', $x), а затем докинуть впереди недостающее число нулевых байт, определённое как 8 - mb_strlen($q)? 

Да, просто добавить спереди 4 нулевых байта.



--------------------
PM MAIL   Вверх
bars80080
Дата 9.11.2011, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата

00 00 00 00 4e ba 51 4f 4e ba 51 4f 30 30 30 30
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
30 30 30 30 30 30 30 30 30 30 30 30


собственно, что я получил, и уже несколько не догоняю.

длина пустого сообщения    
$body_len = mb_strlen($body); $body_len = pack('N*', $body_len);
дала первых четыре байта: 00 00 00 00

а нулевой байт 32 раза
$null32 = ''; for($i = 0; $i < 32; $i++) { $null32 .= 0x00; }
дал 30

30 - это нормальное отображение нулевого байта?

Добавлено через 2 минуты и 58 секунд
может, надо делать так:


Код

    $null32 = ''; for($i = 0; $i < 32; $i++) { $null32 .= pack('x'); }


PM MAIL WWW   Вверх
ksnk
Дата 9.11.2011, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



про длину пакета, скорее всего имелось ввиду strlen, а не mb_strlen. Кодирование и прочие украшательства обычно идут после приема пакета данных.

32 нулевых байта получаются так str_repeat("\0",32);

Хотя проще так
Код

$header=pack('NNNx32',strlen($body),time(),$mess_id);


Это сообщение отредактировал(а) ksnk - 9.11.2011, 12:46


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Pfailed
Дата 9.11.2011, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 5
Всего: 39



Цитата(bars80080 @  9.11.2011,  12:16 Найти цитируемый пост)
30 - это нормальное отображение нулевого байта?

нет, 30 - это код нуля. 0x** - это шестнадцетиричная форма записи десятичных чисел. echo 0xff  --> 255



--------------------
PM MAIL   Вверх
bars80080
Дата 9.11.2011, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



да, вариант с pack() в конце наиболее лучший, и в hex-редакторе видно, что получается то, что надо



теперь новая задача: создать 1024-битный закрытый ключ RSA и открытый ключ к нему

смотрю на алгоритм и думаю: а нет ли уже готового метода генерации ключей на пхп?

и соответственно, нет ли готового метода шифрования сообщения ключом?

в списке криптов вижу только функции
md5_file() - Calculates the md5 hash of a given file
sha1_file() - Calculate the sha1 hash of a file
crc32() - Calculates the crc32 polynomial of a string
sha1() - Calculate the sha1 hash of a string
hash() - Generate a hash value (message digest)
но это же только хэшевые
PM MAIL WWW   Вверх
Pfailed
Дата 9.11.2011, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 5
Всего: 39





--------------------
PM MAIL   Вверх
ksnk
Дата 9.11.2011, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386





--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
bars80080
Дата 10.11.2011, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



ох, что-то ksnk твоя ссылка требует регистрации, а в регистрации отказывает


Цитата(Pfailed @  9.11.2011,  17:48 Найти цитируемый пост)
http://ddev.ru/159/realizaciya-rsa-klassa-na-php/ 

да вроде бы то что надо, но кое в чём я застопорился

мне надо RSA 1024 бита, и как я понял из описания:

Выбираются два различных случайных простых числа p и q заданного размера (например, 1024 бита каждое).

мне всего лишь надо подобрать два простых числа на 1024 бита

это же песец полный. как???

PM MAIL WWW   Вверх
bars80080
Дата 10.11.2011, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



стал ковырять openssl, у них вроде как всё должно быть подогнано. даже функция получить_ключ есть.
однако, вразумительных примеров использования пока не нашёл

к примеру,

Код

$privKey = openssl_pkey_new();
$mes = openssl_error_string();

var_dump($privKey);
var_dump($mes);


Цитата

bool(false)
string(51) "error:02001003:system library:fopen:No such process"

и с какого бока копать - не понятно
PM MAIL WWW   Вверх
ksnk
Дата 10.11.2011, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(bars80080 @  10.11.2011,  15:08 Найти цитируемый пост)
ох, что-то ksnk твоя ссылка требует регистрации, а в регистрации отказывает

Ну, phpclasses - довольно распространенный рессурс скриптов.

вот сам класс.
Насчет простых чисел - вот что сказано в комментах этого скрипта
Цитата

*Prime-Numbers.org provide small prime numbers list.  
*You can browse all small prime numbers(small than 10,000,000,000) there.  
*There's totally 455042511 prime numbers. 
*http://www.prime-numbers.org/ 

 

Это сообщение отредактировал(а) ksnk - 10.11.2011, 17:13

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  rsa.class.php 5,08 Kb


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
bars80080
Дата 10.11.2011, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(ksnk @  10.11.2011,  16:59 Найти цитируемый пост)
*Prime-Numbers.org provide small prime numbers list.  
*You can browse all small prime numbers(small than 10,000,000,000) there.  
*There's totally 455042511 prime numbers. 
*http://www.prime-numbers.org/ 

да, я у них уже был, и они могут дать только small than 10,000,000,000

а насколько я понимаю 1024-битное число, это 128 байт или 2^1024, то есть мне нужно получить число порядка 2*10^308
а на компе я оперирую только числами 2^32 степени


PM MAIL WWW   Вверх
ksnk
Дата 10.11.2011, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



вот тут про инсталляцию OpenSSL
Нужны DLL ки в шаговой доступности и переменные окружения какие-то...

Это сообщение отредактировал(а) ksnk - 10.11.2011, 17:04


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0636 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.