Шифр Виженера

Discussion in 'PHP' started by BHYCHIK, 10 Jul 2010.

  1. BHYCHIK

    BHYCHIK Member

    Joined:
    30 Jan 2009
    Messages:
    52
    Likes Received:
    28
    Reputations:
    9
    Добрый день. На пхп пишу кодер/декодер шифра виженера. Ссылка на описание шифра: http://ru.wikipedia.org/wiki/%D0%A8%D0%B8%D1%84%D1%80_%D0%92%D0%B8%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0

    Вот что получилось:
    PHP:
    <?php
    $mod 
    1;              // 1 for cipher, 2 for decipher
    $text="xxx";
    $key="cz";
    function 
    vigenere($text$prekey$mod)
    {
        
    $len=strlen($text);
        
    $res="";
        
    $key="";
        
    $prelen=strlen($prekey);
        for(
    $i=0$i<$len;$i++)
        {
            
    $key .= $prekey[$i%$prelen];
        }
        if(
    $mod === 1)
        {
            for(
    $i=0$i<$len$i++)
            {
                
    $res .= chr((((ord($text[$i])-ord("a"))+(ord($key[$i])-ord("a")))%26)+ord("a"));
            }
        }
        elseif(
    $mod === 2
        {
            for(
    $i=0$i<$len$i++)
            {
                
    $res .= chr((((ord($text[$i])-ord("a"))-(ord($key[$i])-ord("a")))%26)+ord("a"));
            }
        }
        return 
    $res;
    }
    echo 
    vigenere($text,$key,$mod)."\n";
    ?>
    но не всегда работает правильно. Например, пример из википедии шифруется правильно, а дешифруется неверно. Помогите найти баг, пожалуйста.
     
    #1 BHYCHIK, 10 Jul 2010
    Last edited: 11 Jul 2010
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    BHYCHIK проблема в том, что в ПХП оператор % работает не так как ожидается для отрицательных чисел. Добавьте функцию:
    PHP:
    function mymod($val)
    {
        return 
    $val $val 26$val;
    }
    И замените строки:
    PHP:
                $res .= chr((((ord($text[$i])-ord("a"))-(ord($key[$i])-ord("a")))%26)+ord("a")); 
    // Заменить на:
                
    $res .= chr(mymod(ord($text[$i])-ord($key[$i]))+ord("a"));
     
    _________________________
    2 people like this.
  3. BHYCHIK

    BHYCHIK Member

    Joined:
    30 Jan 2009
    Messages:
    52
    Likes Received:
    28
    Reputations:
    9
    Спасибо большое. Не подумал, что при расшифровке могут быть отрицательные числа.