Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: PSMP-viestiprotokolla

teppuli [31.07.2007 15:44:01]

#

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

<?php
include("psmp.php");
print psmp_message("127.0.0.1","Hei maailma!");
?>

server.php

<?php
include("psmp.php");
print psmp_receive();
?>

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta