} else { throw new Exception('Unable to encrypt data. Perhaps it is bigger than the key size?'); } return $data; } public function decrypt($data) { if (openssl_private_decrypt(base64_decode($data), $decrypted, $this->privkey)) { $data = $decrypted; } else { $data = ''; } return $data; } } $hasher = new MyEncryption(); $encryptData = $hasher->encrypt('hello world'); //echo "\n public key : {$hasher->pubkey} \n"; //echo "\n public key : {$hasher->privkey} \n"; echo "\n" . $encryptData; $decryptData = $hasher->decrypt($encryptData); echo "\n" . $decryptData; /*for ($i = 1; $i <= 5; ++$i) { $pid = pcntl_fork(); if (!$pid) { sleep(1); print "In child $i\n"; exit($i); } }
/** * Unit test вместе с API */ function test_register() { DBHelper::init_test_db(); // Get invites $request['username'] = '******'; $request['password'] = '******'; $adminToken = $this->authorize($request); $request = array(); $request['token'] = $adminToken; $invitation = $this->getInvitation($request); // Registration $request = array(); $request['invitation'] = $invitation; $request['username'] = '******'; $request['password'] = '******'; try { $this->register($request); } catch (Exception $ex) { die($ex->getMessage()); } // Authorization $userToken = $this->authorize($request); // Encryption $encModule = new MyEncryption(); $testMessageOrig = 'Hello, this is test йцукенгшщъхзщфывждловыабюьтяюбчсьтюбьт вфывфывжфдылвьжфдлыьвждфлыьвждлфыьвждль фыв лдфьыжвл ьфыжвлд ьфжылдв ьфыв фывждл фьыжвдлфьы жвлдфьыж влдьфыж лдвьфжылвь йцукенгшщъхзщфывждловыабюьтяюбчсьтюбьт вфывфывжфдылвьжфдлыьвждфлыьвждлфыьвждль фыв лдфьыжвл ьфыжвлд ьфжылдв ьфыв фывждл фьыжвдлфьы жвлдфьыж влдьфыж лдвьфжылвь йцукенгшщъхзщфывждловыабюьтяюбчсьтюбьт вфывфывжфдылвьжфдлыьвждфлыьвждлфыьвждль фыв лдфьыжвл ьфыжвлд ьфжылдв ьфыв фывждл фьыжвдлфьы жвлдфьыж влдьфыж лдвьфжылвь йцукенгшщъхзщфывждловыабюьтяюбчсьтюбьт вфывфывжфдылвьжфдлыьвждфлыьвждлфыьвждль фыв лдфьыжвл ьфыжвлд ьфжылдв ьфыв фывждл фьыжвдлфьы жвлдфьыж влдьфыж лдвьфжылвь йцукенгшщъхзщфывждловыабюьтяюбчсьтюбьт вфывфывжфдылвьжфдлыьвждфлыьвждлфыьвждль фыв лдфьыжвл ьфыжвлд ьфжылдв ьфыв фывждл фьыжвдлфьы жвлдфьыж влдьфыж лдвьфжылвь йцукенгшщъхзщфывждловыабюьтяюбчсьтюбьт вфывфывжфдылвьжфдлыьвждфлыьвждлфыьвждль фыв лдфьыжвл ьфыжвлд ьфжылдв ьфыв фывждл фьыжвдлфьы жвлдфьыж влдьфыж лдвьфжылвь йцукенгшщъхзщфывждловыабюьтяюбчсьтюбьт вфывфывжфдылвьжфдлыьвждфлыьвждлфыьвждль фыв лдфьыжвл ьфыжвлд ьфжылдв ьфыв фывждл фьыжвдлфьы жвлдфьыж влдьфыж лдвьфжылвь йцукенгшщъхзщфывждловыабюьтяюбчсьтюбьт вфывфывжфдылвьжфдлыьвждфлыьвждлфыьвждль фыв лдфьыжвл ьфыжвлд ьфжылдв ьфыв фывждл фьыжвдлфьы жвлдфьыж влдьфыж лдвьфжылвь йцукенгшщъхзщфывждловыабюьтяюбчсьтюбьт вфывфывжфдылвьжфдлыьвждфлыьвждлфыьвждль фыв лдфьыжвл ьфыжвлд ьфжылдв ьфыв фывждл фьыжвдлфьы жвлдфьыж влдьфыж лдвьфжылвь йцукенгшщъхзщфывждловыабюьтяюбчсьтюбьт вфывфывжфдылвьжфдлыьвждфлыьвждлфыьвждль фыв лдфьыжвл ьфыжвлд ьфжылдв ьфыв фывждл фьыжвдлфьы жвлдфьыж влдьфыж лдвьфжылвь'; $testMessage = $testMessageOrig; $encryptedData = $encModule->ssl_encrypt($testMessage, 'public', $encModule->pubkey); $testMessage = $encModule->ssl_decrypt($encryptedData, 'private', $encModule->privkey); if ($testMessage != $testMessageOrig) { die("RSA failed"); } // Admin хочет добавить User1 в друзья $request = array(); $request['token'] = $adminToken; $request['type'] = API::MESSAGE_TYPE_ADD_FRIEND; $request['reciepent'] = 'user1'; // Передает публичный ключ в теле сообщения без шифрования $request['data'] = $encModule->pubkey; $this->sendMessage($request); // User1 получает сообщения $request = array(); $request['token'] = $userToken; $messagesJson = $this->getMessages($request); $messages = json_decode($messagesJson); // User1 начинает дружить с Admin $user1PubKeys = ''; foreach ($messages->messages as $message) { if ($message->type == API::MESSAGE_TYPE_ADD_FRIEND) { $user1PubKeys[$message->user_from] = $message->data; } } // Но и Admin должен подружиться с User1 $request = array(); $request['token'] = $userToken; $request['type'] = API::MESSAGE_TYPE_ADD_FRIEND; $request['reciepent'] = 'Admin'; $request['data'] = $encModule->pubkey2; $this->sendMessage($request); // Admin получает свои сообщения $request = array(); $request['token'] = $adminToken; $messagesJson = $this->getMessages($request); $messages = json_decode($messagesJson); // Admin начинает дружить с User1 (автоматически соглашаясь) $adminPubKeys = ''; foreach ($messages->messages as $message) { if ($message->type == API::MESSAGE_TYPE_ADD_FRIEND) { $adminPubKeys[$message->user_from] = $message->data; } } // Общаемся $request = array(); $request['token'] = $userToken; $request['type'] = API::MESSAGE_TYPE_TEXT; $request['reciepent'] = 'Admin'; $request['data'] = $encModule->ssl_encrypt('user1|Привет приятель!', 'public', $user1PubKeys['Admin']); $this->sendMessage($request); $request = array(); $request['token'] = $adminToken; $request['type'] = API::MESSAGE_TYPE_TEXT; $request['reciepent'] = 'user1'; $request['data'] = $encModule->ssl_encrypt('Admin|Как делищи? Работает же?', 'public', $adminPubKeys['user1']); $this->sendMessage($request); // Расшифровываем // User1 получает сообщения $request = array(); $request['token'] = $userToken; $messagesJson = $this->getMessages($request); $messages = json_decode($messagesJson); foreach ($messages->messages as $message) { if ($message->type == API::MESSAGE_TYPE_TEXT) { $decrypted = $encModule->ssl_decrypt($message->data, 'private', $encModule->privkey2); list($user, $messageText) = explode("|", $decrypted); echo "<h1>" . $user . "</h1><br>" . $messageText; } } // Admin получает сообщения $request = array(); $request['token'] = $adminToken; $messagesJson = $this->getMessages($request); $messages = json_decode($messagesJson); foreach ($messages->messages as $message) { if ($message->type == API::MESSAGE_TYPE_TEXT) { $decrypted = $encModule->ssl_decrypt($message->data, 'private', $encModule->privkey); list($user, $messageText) = explode("|", $decrypted); echo "<h1>" . $user . "</h1><br>" . $messageText; } } // Админ создает группу public_html $request = array(); $request['token'] = $adminToken; $request['group_name'] = 'public_html'; $this->groupCreate($request); // Сообщение о приглашении в группу $request = array(); $request['token'] = $adminToken; $request['type'] = API::MESSAGE_TYPE_GROUP_INVITE; $request['reciepent'] = 'user1'; // Название группы|Публичный ключ|Приватный ключ $message = "public_html|" . $encModule->group_pubkey . "|" . $encModule->group_privkey; try { //$request['data'] = $encModule->encrypt($message, $adminPubKeys['user1']); $request['data'] = $encModule->ssl_encrypt($message, 'public', $adminPubKeys['user1']); } catch (Exception $exc) { echo $exc->getMessage(); } $this->sendMessage($request); // Сервис по созданию приглашения в группу для новичка // Только если Администратор! $request = array(); $request['token'] = $adminToken; $request['group_name'] = 'public_html'; $request['user_name'] = 'user1'; $this->groupInvite($request); // Получить приглашение и согласиться // User1 получает сообщения $request = array(); $request['token'] = $userToken; $messagesJson = $this->getMessages($request); $messages = json_decode($messagesJson); foreach ($messages->messages as $message) { if ($message->type == API::MESSAGE_TYPE_GROUP_INVITE) { $decrypted = $encModule->ssl_decrypt($message->data, 'private', $encModule->privkey2); list($groupName, $groupPubkey, $groupPrivKey) = explode("|", $decrypted); echo "<h1>Invitation " . $groupName . "</h1><br>" . $groupPubkey . "<br>" . $groupPrivKey; // Соглашение войти в группу $request = array(); $request['token'] = $userToken; $request['group_name'] = $groupName; $this->groupInviteAccept($request); // Сохраняем ключи $userGroups[$groupName]['priv_key'] = $groupPrivKey; $userGroups[$groupName]['pub_key'] = $groupPubkey; } } // Пишем в группу User1 $request = array(); $groupName = 'public_html'; $request['token'] = $userToken; $request['type'] = API::MESSAGE_TYPE_TEXT; $request['reciepent'] = $groupName; $request['data'] = $encModule->ssl_encrypt('user1|Привет приятель!', 'public', $userGroups[$groupName]['pub_key']); $this->sendMessage($request); // Пишем в группу Admin $request = array(); $groupName = 'public_html'; $request['token'] = $adminToken; $request['type'] = API::MESSAGE_TYPE_TEXT; $request['reciepent'] = $groupName; $request['data'] = $encModule->ssl_encrypt('И админ тоже хочет отметиться )', 'public', $userGroups[$groupName]['pub_key']); $this->sendMessage($request); $request['data'] = $encModule->ssl_encrypt('Даже два сообщения подряд написать !', 'public', $userGroups[$groupName]['pub_key']); $this->sendMessage($request); // Читаем из группы // User1 получает сообщения $request = array(); $request['token'] = $userToken; $messagesJson = $this->getMessages($request); $messages = json_decode($messagesJson); foreach ($messages->groups as $group => $messages) { foreach ($messages as $message) { if ($message->type == API::MESSAGE_TYPE_TEXT) { $decrypted = $encModule->ssl_decrypt($message->data, 'private', $userGroups[$groupName]['priv_key']); echo "<h1>" . $group . " от " . $message->user_from . "</h1><br>" . $decrypted; } } } // А теперь выходим из группы сомстоятельно $request = array(); $request['token'] = $userToken; $request['group_name'] = 'public_html'; $this->groupReject($request); // Читаем групповые сообщения еще раз... и тишина // User1 получает сообщения $request = array(); $request['token'] = $userToken; $messagesJson = $this->getMessages($request); $messages = json_decode($messagesJson); foreach ($messages->groups as $group => $messages) { foreach ($messages as $message) { if ($message->type == API::MESSAGE_TYPE_TEXT) { $decrypted = $encModule->ssl_decrypt($message->data, 'private', $userGroups[$groupName]['priv_key']); echo "<h1>" . $group . " от " . $message->user_from . "</h1><br>" . $decrypted; } } } }