Siis tällä psmp:llä voi lähettää lyhyitä salattuja viestejä php-sovelluksesta toiseen. Salaukseen käytetään Rijndael 256-bittistä salausta ja viesti tarkistetaan hashilla. Mcrypt pitää olla asennetuna että tätä voi käyttää. Koodi on aika sekavaa. Ja PHP 5 pitää olla jotta voi käyttää hash-funktiota.
psmp.php
<?php function psmp_message($target,$message) { $socket = stream_socket_client("udp://".$target.":9110", $errno, $errstr); //Yhdistetään kohteeseen if (!$socket) { die("PSMP Socket error: $errstr ($errno)"); //Jos tapahtuu virhe, niin poistutaan ja annetaan virheilmoitus } $splitter=md5(time()); while (strstr($message,$splitter)) { //Luodaan tekstin eroitinmerkkijono $splitter=md5(time()); //Käydään silmukkaa läpi niin kauan että viesti ei sisällä eroitinmerkkijonoa } fwrite($socket, "HELLO SPLIT ".trim($splitter)); // Lähetetään HELLO viesti ja eroitinmerkkijono $splitreply = trim(fread($socket,999)); //Luetaan SPLIT RECEIVED merkkijono ja eroitin $splitpieces = explode(" ", $splitreply); $spl=trim($splitpieces[2]); if (trim($spl)==trim($splitter)) { //Tarkistetaan onko vastaanotettu eroitin oikea fwrite($socket, "SPLIT VALID"); //Jos on, niin lähetetään SPLIT VALID } else { fwrite($socket, "SPLIT ERROR"); // Jos ei ole,lähetetään SPLIT ERROR ja palautetaan false echo "PSMP Error: Splitter."; return 0; } $keypiece = trim(fread($socket,999)); //Luetaan salattu avaimenmuodostusmerkkijono $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_256,'','cbc',''); //Puretaan RIJNDAEL 256 salattu avaimenmuodostusmerkkijono. mcrypt_generic_init($cipher, trim($splitter), "69546756842734154961258436795213"); // Salauksen avain on eroitinmerkkijono $decrypted = mdecrypt_generic($cipher,trim($keypiece)); mcrypt_generic_deinit($cipher); $mykey=md5(trim($decrypted)); //Luodaan salausavain merkkijonosta $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_256,'','cbc',''); //Salataan viesti RIJNDAEL 256 salauksella mcrypt_generic_init($cipher, trim($mykey), "69546756842734154961258436795213"); $mes = mcrypt_generic($cipher,trim($message)); mcrypt_generic_deinit($cipher); fwrite($socket, trim(sf1(trim($message))).$splitter.trim($mes)); //Lähetetään viesti muodossa tarkistusumma eroitinmerkkijono salattu viesti $pkt = trim(fread($socket,1000000)); // Luetaan vastaanotettu tarkistussumma if (trim($pkt)==trim(sf1($message))) { //Verrataan tarkistussummia return 1; //Jos ne ovat samoja palautetaan true } else { echo "PSMP Error: Checksum: Data Corrupted.<br>"; //Jos eivät, tulostetaan virheilmoitus ja palautetaan false return 0; } } function psmp_receive(){ $socket = stream_socket_server("udp://127.0.0.1:9110", $errno, $errstr, STREAM_SERVER_BIND); //Aloitetaan portin kuuntelu if (!$socket) { die("PSMP Socket error: $errstr ($errno)"); // Jos virhe, poistutaan ja annetaan virheilmoitus } $splitter = stream_socket_recvfrom($socket, 99999, 0, $peer); // Vastaanotetaan HELLO ja eroitinmerkkijono $pieces = explode(" ", $splitter); $splitter=trim($pieces[2]); stream_socket_sendto($socket,"SPLIT RECEIVED ". trim($splitter), 0, $peer); //Lähetetään SPLIT RECEIVED ja eroitinmerkkijono $pktl = stream_socket_recvfrom($socket, 999, 0, $peer); //Vastaanotetaan SPLIT ERROR/VALID if (trim($pktl) == "SPLIT ERROR") { //Jos SPLIT ERROR, niin tulostetaan virhe ja palautetaan false echo "PSMP Error: Data splitter."; return 0; } $keypiece=microtime().time(); //Luodaan avaimenmuodostusmerkkijono $mykey=md5($keypiece); // Luodaan avain merkkijonosta $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_256,'','cbc',''); //Lähetetään avaimenmuodostusmerkkijono salattuna käyttäen avaimena eroitinta mcrypt_generic_init($cipher, trim($splitter), "69546756842734154961258436795213"); $mes = mcrypt_generic($cipher,trim($keypiece)); mcrypt_generic_deinit($cipher); stream_socket_sendto($socket,trim($mes), 0, $peer); $pkt = stream_socket_recvfrom($socket, 99999, 0, $peer); //Vastaanotetaan viesti ja tarkistussumma $pieces = explode($splitter, $pkt); $pieces[0]=trim($pieces[0]); $pieces[1]=trim($pieces[1]); $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_256,'','cbc',''); //Puretaan salattu viesti mcrypt_generic_init($cipher, trim($mykey), "69546756842734154961258436795213"); $decrypted = mdecrypt_generic($cipher,trim($pieces[1])); mcrypt_generic_deinit($cipher); $pieces[1]=trim($decrypted); stream_socket_sendto($socket, trim(sf1($pieces[1])), 0, $peer); //Lähetetään viestistä saatu tarkistusumma if (trim(sf1($pieces[1]))==$pieces[0]) { //Verrataan tarkistusummia return $pieces[1]; //Jos samat palautetaan viesti } else { echo "PSMP Error: Hash check result: Data Corrupted.<br>"; //Jos eivät, palautetaan false ja virhe return 0; } } function sf1($str) { $splitted=str_split($str,1); $len=strlen($str); for ($i=0; $i < $len; $i++) { $ascii = ord(substr($str,$i)).$ascii; } for ($i=0; $i < $len; $i++) { $first=md5(substr($str,$i).$ascii).md5($str).sha1($first).$first; } $temp=md5(hash(sha256,$first)); $temp=hash("sha256",$temp,true); for ($i=0; $i < strlen($temp); $i++) { $asc = ord(substr($temp,$i)).$asc; } $second=strlen($str)/$asc; $third=$second*strlen($asc); for ($i=0; $i < $len; $i++) { $final=hash("sha256",substr($str,$i).$ascii,true).md5($str).$third.hash("sha256",$third).sha1(crc32($first)).$final; } return(hash("sha256",$final)); } ?>
client.php
server.php
Aihe on jo aika vanha, joten et voi enää vastata siihen.