Internetové služby

 

Online šifrování podle Vernama, one-time pad

key:
message:

Vernamova šifra   (one-time pad) je založena na posunu písmen v abecedě na základě náhodně generovaného řetězce (klíče). Na základě tohoto faktu C. E. Shannon v roce 1949 publikoval důkaz, že posunutí znaku na náhodnou pozici se prakticky rovná výměně znaku za zcela náhodný a šifra je v principu nerozluštitelná.

Nutné podmínky pro zachování kvality šifry:

Klíč je minimálně tak dlouhý jako zpráva
Klíč je dokonale náhodný
Klíč nesmí být v žádném případě použit opakovaně

Je jasné, že v praxi je obrovskou překážkou právě předávání náhodného klíče do budoucna řešitelné pomocí přenosu informace fotony mechanismem kvantové kryptografie ve svém příkladě však využívám šifrování zprávy "náhodně" zvoleným řetězcem   (tedy např. textem třetího článku v dané rubrice některého internetového deníku) který sice v žádném případě zcela náhodnému řetězci ekvivaletní není, přesto v kombinaci s případným posunem o jeden řád  (např. dle parity bio zátězě pro další den) dá šifře slušnou odolnost. Pro případné použití ještě doporučuji v kódu indexy znaků popřehazovat.

vernam.zip download

-- G --

HTML:

<form method="post" action=""> <div>key:<textarea name="key"></textarea></div> <div>message:<textarea name="message"></textarea></div> <div><input type="submit" value="send"/></div> </form>

PHP:

<?php if($_POST){ $key = str_split(str($_POST['key'])); $text = str_split(str($_POST['message'])); $schema = schema(); //Zašifrování $out = ex($schema,$key,$text); //Výpis zašifrované zprávy echo $out."<br />"; //Dešifrování echo xe($schema,$key,$out); } ?>

PHP function:

<?php function ex($schema,$key,$text){ $count=count($text); for($i=0;$i<count($key);$i++){ if($i<$count){ $sufix = (($i+1)%20)?null:" "; $tmp = strval($schema[$text[$i]]+$schema[$key[$i]]); $out .= ((strlen($tmp)<2)?"0".$tmp:$tmp).$sufix; } } return $out; } function xe($schema,$key,$number){ $number = preg_replace("/\s+/m",'',$number); $amehcs = array_flip($schema); $string = str_split($number,2); for($i=0;$i<count($string);$i++){ $tmp = $string[$i]-$schema[$key[$i]]; $out .= $amehcs[((strlen($tmp)<2)?"0".$tmp:$tmp)]; } return $out; } function str($text){ $str = strtolower($text); $str = preg_replace("#[\t\n]*#m",'',$str); return diacritic($str,false); } function diacritic($text,$cestina=true){ if(!$cestina){ $utf8table = array ( "\xc3\xa1"=>"a", "\xc3\xa4"=>"a", "\xc4\x8d"=>"c", "\xc4\x8f"=>"d", "\xc3\xa9"=>"e", "\xc4\x9b"=>"e", "\xc3\xad"=>"i", "\xc4\xbe"=>"l", "\xc4\xba"=>"l", "\xc5\x88"=>"n", "\xc3\xb3"=>"o", "\xc3\xb6"=>"o", "\xc5\x91"=>"o", "\xc3\xb4"=>"o", "\xc5\x99"=>"r", "\xc5\x95"=>"r", "\xc5\xa1"=>"s", "\xc5\xa5"=>"t", "\xc3\xba"=>"u", "\xc5\xaf"=>"u", "\xc3\xbc"=>"u", "\xc5\xb1"=>"u", "\xc3\xbd"=>"y", "\xc5\xbe"=>"z", "\xc3\x81"=>"A", "\xc3\x84"=>"A", "\xc4\x8c"=>"C", "\xc4\x8e"=>"D", "\xc3\x89"=>"E", "\xc4\x9a"=>"E", "\xc3\x8d"=>"I", "\xc4\xbd"=>"L", "\xc4\xb9"=>"L", "\xc5\x87"=>"N", "\xc3\x93"=>"O", "\xc3\x96"=>"O", "\xc5\x90"=>"O", "\xc3\x94"=>"O", "\xc5\x98"=>"R", "\xc5\x94"=>"R", "\xc5\xa0"=>"S", "\xc5\xa4"=>"T", "\xc3\x9a"=>"U", "\xc5\xae"=>"U", "\xc3\x9c"=>"U", "\xc5\xb0"=>"U", "\xc3\x9d"=>"Y", "\xc5\xbd"=>"Z"); return strtr($text, $utf8table); } return $text; } function schema(){ return array( 'a'=>'01', 'b'=>'02', 'c'=>'03', 'd'=>'04', 'e'=>'05', 'f'=>'06', 'g'=>'07', 'h'=>'08', 'i'=>'09', 'j'=>'10', 'k'=>'11', 'l'=>'12', 'm'=>'13', 'n'=>'14', 'o'=>'15', 'p'=>'16', 'q'=>'17', 'r'=>'18', 's'=>'19', 't'=>'20', 'u'=>'21', 'v'=>'22', 'w'=>'23', 'x'=>'24', 'y'=>'25', 'z'=>'26', '.'=>'27', ' '=>'28', '%'=>'29', '@'=>'30', '!'=>'31', '?'=>'32', '"'=>'33', "'"=>'34', '-'=>'35', '+'=>'36', '('=>'37', ')'=>'38', ','=>'39', '1'=>'40', '2'=>'41', '3'=>'42', '4'=>'43', '5'=>'44', '6'=>'45', '7'=>'46', '8'=>'47', '9'=>'48', '0'=>'49', ); } ?>
 
©2009-2015  INTERNETOVÉ SLUŽBY