[php] Новичкам: задаем вопросы

Discussion in 'PHP' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. Byrger

    Byrger Elder - Старейшина

    Joined:
    7 Mar 2008
    Messages:
    521
    Likes Received:
    26
    Reputations:
    -4
    Почему функция неправитьно шифрует...
    Заменяет не то что под тем сиволом как во 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;
    }
     
  2. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    потому что разное кол-во элементов массивов
     
  3. Byrger

    Byrger Elder - Старейшина

    Joined:
    7 Mar 2008
    Messages:
    521
    Likes Received:
    26
    Reputations:
    -4
    Да вроде даже на глаз видно что одинаковое...
     
  4. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Чото сам не понимаю, даже так сделал:

    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);
    ?> 
    чушь какая-то:)
     
  5. Byrger

    Byrger Elder - Старейшина

    Joined:
    7 Mar 2008
    Messages:
    521
    Likes Received:
    26
    Reputations:
    -4
    А как можно сделать?
    Мне надо шифрование хотяб по 6 значному ключу...
     
  6. vizard-06

    vizard-06 Elder - Старейшина

    Joined:
    6 Dec 2006
    Messages:
    55
    Likes Received:
    8
    Reputations:
    0
    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');
    ?>
    выводет
    перезамен идёт по несколько раз
     
  7. NuR

    NuR Elder - Старейшина

    Joined:
    11 Dec 2005
    Messages:
    85
    Likes Received:
    58
    Reputations:
    -2
    проблема в том что в алфавите нет каких то букв, поэтому происходит замена левым символом который заменялся перед ней, иначе символом w как я понял. если тебе нужен шифроалгоритм могу скинуть перестановку с путями гамильтона(тока я не доделал декодирование сего мяса)
     
  8. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    а вот так работает:

    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/
     
    #9388 Pashkela, 2 Apr 2009
    Last edited: 2 Apr 2009
  9. vizard-06

    vizard-06 Elder - Старейшина

    Joined:
    6 Dec 2006
    Messages:
    55
    Likes Received:
    8
    Reputations:
    0
    работает на половину не верно,верные вариации есть только потому что нет заменённых символов дальше в массиве на которые бы можно было ещё заменить
     
  10. vizard-06

    vizard-06 Elder - Старейшина

    Joined:
    6 Dec 2006
    Messages:
    55
    Likes Received:
    8
    Reputations:
    0
    Pashkela.
    да какой это баг, функция меняет все варианты котрые есть в массиве, и ей пофиг что они уже были когда то поменяны, перезамен идёт по несколько раз, так как заменив например на символ "e" на "d", она дальше в списке массива находит ещё символ "d" и меняет соответственно его на "x", поэтому и получается не верный результат
     
  11. Byrger

    Byrger Elder - Старейшина

    Joined:
    7 Mar 2008
    Messages:
    521
    Likes Received:
    26
    Reputations:
    -4
    И как сделать чтоб 1 раз меняла?
     
  12. vizard-06

    vizard-06 Elder - Старейшина

    Joined:
    6 Dec 2006
    Messages:
    55
    Likes Received:
    8
    Reputations:
    0
    Byrger
    меняй по отдельности буквы а не все сразу или реализовать через ASCII
     
    #9392 vizard-06, 2 Apr 2009
    Last edited: 2 Apr 2009
  13. Byrger

    Byrger Elder - Старейшина

    Joined:
    7 Mar 2008
    Messages:
    521
    Likes Received:
    26
    Reputations:
    -4
    Отсюда вопрос как сторку разбить по букавм на массив и потом после прогона собрать?
     
  14. vizard-06

    vizard-06 Elder - Старейшина

    Joined:
    6 Dec 2006
    Messages:
    55
    Likes Received:
    8
    Reputations:
    0
    можно попробовать вот так извратиться)))
    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$dekeyord($text{$i})));
        }
        return 
    $texte
    }
    echo 
    crupt('qwer');
    ?>
     
  15. vizard-06

    vizard-06 Elder - Старейшина

    Joined:
    6 Dec 2006
    Messages:
    55
    Likes Received:
    8
    Reputations:
    0
    а лучше всё-таки
    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');
    ?>
     
  16. Byrger

    Byrger Elder - Старейшина

    Joined:
    7 Mar 2008
    Messages:
    521
    Likes Received:
    26
    Reputations:
    -4
    Аналогичный результат...
    Без шифровки: e10adc3949ba59abbe56e057f20f883e
    после шифровки: d10adc3949ba59abbd56d057f20f883d
    После расшифровки: e10aec3949ba59abbe56e057w20w883e
     
  17. vizard-06

    vizard-06 Elder - Старейшина

    Joined:
    6 Dec 2006
    Messages:
    55
    Likes Received:
    8
    Reputations:
    0
    в массиве на замен не все символы, добаляй все, я ради приера показывал
     
  18. NuR

    NuR Elder - Старейшина

    Joined:
    11 Dec 2005
    Messages:
    85
    Likes Received:
    58
    Reputations:
    -2
    собственно вот вам реализация крипто-алгоритма методом перестановки с применением путей Гамильтона

    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) );
    
    помоему никто еще на пхп не реализовывал данный алгоритм=) хорошо шифрует строки кратные длине ключа, а если нет то выходит что на выходе будут технические символы. если кто то заинтересуется может доработать мой код
     
  19. Byrger

    Byrger Elder - Старейшина

    Joined:
    7 Mar 2008
    Messages:
    521
    Likes Received:
    26
    Reputations:
    -4
    Спасибо большое!
     
  20. vizard-06

    vizard-06 Elder - Старейшина

    Joined:
    6 Dec 2006
    Messages:
    55
    Likes Received:
    8
    Reputations:
    0
    вот рабочий на 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');
    ?>
     
Thread Status:
Not open for further replies.