Почему функция неправитьно шифрует... Заменяет не то что под тем сиволом как во 2 массиве... PHP: function crupt($text){ $key = array(q,w,e,r,t,y,u,i,o,p,a,s,d,f,g,h,j,k,l,z,x,c,v,b,n,m,1,2,3,4,5,6,7,8,9,0); $dekey=array(g,f,d,s,a,h,j,k,l,m,z,n,x,b,c,v,1,q,2,w,3,e,4,r,5,t,6,y,7,u,8,i,9,o,0,p); $text = str_replace($key, $dekey, $text); return $text; }
Чото сам не понимаю, даже так сделал: PHP: <?php $key = array("q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m","1","2","3","4","5","6","7","8","9","0"); $dekey= array("g","f","d","s","a","h","j","k","l","m","z","n","x","b","c","v","1","q","2","w","3","e","4","r","5","t","6","y","7","u","8","i","9","o","0","p"); $str = "qwe"; echo str_replace($key, $dekey, $str); ?> чушь какая-то
PHP: <? function crupt($text){ $key = array('q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m','1','2','3','4','5','6','7','8','9','0'); $dekey=array('g','f','d','s','a','h','j','k','l','m','z','n','x','b','c','v','1','q','2','w','3','e','4','r','5','t','6','y','7','u','8','i','9','o','0','p'); $text = str_replace($key, $dekey, $text, $count); echo $count; return $text; } echo ' '.crupt('q'); ?> выводет перезамен идёт по несколько раз
проблема в том что в алфавите нет каких то букв, поэтому происходит замена левым символом который заменялся перед ней, иначе символом w как я понял. если тебе нужен шифроалгоритм могу скинуть перестановку с путями гамильтона(тока я не доделал декодирование сего мяса)
а вот так работает: PHP: <?php function zam($text){ $key = array("q","w","e","r","t","y","u"); $dekey= array("g","f","d","s","a","h","j"); return str_replace($key, $dekey, $text); } $str = "qwe"; echo zam($str); ?> т.е. прямая и явная связь с КОЛИЧЕСТВОМ элементов в массиве, т.е. есть ограничения какие-то, или не успевает вычислить, или хз здесь http://ru2.php.net/str_replace ничего про такие ограничения не сказано, наверное мы обнаружили новый баг функции str_replace Надо пулять сюда: http://bugs.php.net/
работает на половину не верно,верные вариации есть только потому что нет заменённых символов дальше в массиве на которые бы можно было ещё заменить
Pashkela. да какой это баг, функция меняет все варианты котрые есть в массиве, и ей пофиг что они уже были когда то поменяны, перезамен идёт по несколько раз, так как заменив например на символ "e" на "d", она дальше в списке массива находит ещё символ "d" и меняет соответственно его на "x", поэтому и получается не верный результат
можно попробовать вот так извратиться))) PHP: <? function crupt($text) { $key = array(ord('q'),ord('w'),ord('e'),ord('r')); $dekey= array(ord('g'),ord('f'),ord('d'),ord('s')); for($i = 0; $i < strlen($text); $i++) { $texte .= chr(str_replace($key, $dekey, ord($text{$i}))); } return $texte; } echo crupt('qwer'); ?>
а лучше всё-таки PHP: <? function crupt($text) { $key = array('q' => 'g', 'w' => 'f','e' => 'd', 'r' => 's'); for($i = 0; $i < strlen($text); $i++) { $rekey = empty($key[$text{$i}]) ? $text{$i} : $key[$text{$i}]; $texte .= $rekey; } return $texte; } echo crupt('bbbqwer'); ?>
Аналогичный результат... Без шифровки: e10adc3949ba59abbe56e057f20f883e после шифровки: d10adc3949ba59abbd56d057f20f883d После расшифровки: e10aec3949ba59abbe56e057w20w883e
собственно вот вам реализация крипто-алгоритма методом перестановки с применением путей Гамильтона Code: function gamilton_enc($in,$key) { $out = ""; $routes = array( 1 => "45102376", 2 => "40231576", 3 => "46201573", 4 => "45762013", 5 => "40132675"); $tmp_key = $routes[array_rand($routes, 1)]; $block_size = strlen($tmp_key); while (strlen($in) % $block_size != 0) { $in .= "*"; } $num_block = 0; $blocks = array(); for ($i = 0; $i < strlen($in); ) { $blocks[$num_block] = substr($in, $i, $block_size); $num_block++; $i += $block_size; } $key_routes = explode(",", $key); foreach ($blocks as $key => $block) { $curent_key = $key % count($key_routes); for ($i = 0; $i < strlen($routes[$key_routes[$curent_key]]); $i++) { $out .= $block[$routes[$key_routes[$curent_key]][$i]]; } } return $out; } function gamilton_dec($in,$key) { $out = ""; $fout=""; $routes = array( 1 => "45102376", 2 => "40231576", 3 => "46201573", 4 => "45762013", 5 => "40132675"); $tmp_key = $routes[array_rand($routes, 1)]; $block_size = strlen($tmp_key); $num_block = 0; $blocks = array(); for ($i = 0; $i < strlen($in); ) { $blocks[$num_block] = substr($in, $i, $block_size); $num_block++; $i += $block_size; } $key_routes = explode(",", $key); $block_num=0; foreach ($blocks as $key => $block) { $curent_key = $key % count($key_routes); for ($i = 0; $i < strlen($routes[$key_routes[$curent_key]]); $i++) { $out[$block_num][$routes[$key_routes[$curent_key]][$i]] = $block[$i]; } ksort($out[$block_num]); $fout.=implode('',$out[$block_num]); $block_num++; } return $fout; } $in = "e10adc3949ba59abbe56e057f20f883e"; $key = "2,5,3"; var_dump( gamilton_enc($in,$key) ); помоему никто еще на пхп не реализовывал данный алгоритм=) хорошо шифрует строки кратные длине ключа, а если нет то выходит что на выходе будут технические символы. если кто то заинтересуется может доработать мой код
вот рабочий на 100% вариант, то что ты хотел реализовано, что там у тебя с дешифрацией - незнаю, выкладывай код PHP: <? function crupt($text) { $key = array('q' => 'g', 'w' => 'f', 'e' => 'd', 'r' => 's', 't' => 'a', 'y' => 'h', 'u' => 'j', 'i' => 'k', 'o' => 'l', 'p' => 'm', 'a' => 'z', 's' => 'n', 'd' => 'x', 'f' => 'b', 'g' => 'c', 'h' => 'v', 'j' => '1', 'k' => 'q', 'l' => '2', 'z' => 'w', 'z' => 'w', 'x' => '3', 'c' => 'e', 'v' => '4', 'b' => 'r', 'n' => '5', 'm' => 't', '1' => '6', '2' => 'y', '3' => '7', '4' => 'u', '5' => '8', '6' => 'i', '7' => '9', '8' => 'o', '9' => '0', '0' => 'p' ); for($i = 0; $i < strlen($text); $i++) { $rekey = $key[$text{$i}] != '' ? $key[$text{$i}] : $text{$i}; $texte .= $rekey; } return $texte; } echo crupt('qwertyuiopasdfghjklzxcvbnm1234567890'); ?>