PHP rot13 с ASCII - PullRequest
       3

PHP rot13 с ASCII

0 голосов
/ 30 сентября 2018

Я хочу сделать простое шифрование с помощью rot13, но я не хочу использовать функцию str_rot13 (), потому что я хочу добавить к ней числа, и я думаю, что str_rot13 () не поддерживается.Я нашел код, подобный этому, и хочу отредактировать, но я не знаю, как

<?php 

$string = "Hello World 123";

for ($i = 0, $j = strlen( $string); $i < $j; $i++) 
{
    // Get the ASCII character for the current character
    $char = ord( $string[$i]); 


    // If that character is in the range A-Z or a-z, add 13 to its ASCII value
    if( ($char >= 65  && $char <= 90) || ($char >= 97 && $char <= 122)) 
    {
        $char += 13; 

        // If we should have wrapped around the alphabet, subtract 26
        if( $char > 122 || ( $char > 90 && ord( $string[$i]) < 97)) 
        {
            $char -= 26;
        }
    }
    echo chr( $char);
}

 ?>

этот код приводит к "Uryyb Jbeyq 123".Я хочу добавить на него число 0-9, чтобы шифрование стало rot18 -> a-z0123456789.Результатом этого стал "Zw336 E693v JKL"

1 Ответ

0 голосов
/ 30 сентября 2018

Str_rot13 - это функция кодирования-декодирования, которая означает str_rot13(str_rot13('some string here'))==='some string here'. Наиболее эффективный способ построения такой функции, по моему мнению, заключается в использовании простой внутренней карты. В PHP мы можем использовать массив, индексированный от 1 до 36, чтобы достичьэто вместо использования кода ASCII.С кодом ASCII Вы столкнетесь с трудностями в создании функции декодирования и кодирования, и, следовательно, ваш алгоритм будет менее быстрым. Ниже приведена базовая реализация функции кодирования-декодирования str_rot18, как пояснено выше:

 function str_rot18($string){
    if(!is_string($string)) return false; 
    $map=array (
      'a' => 1, 'b' => 2,'c' => 3, 'd' => 4, 'e' => 5, 'f' => 6,'g' => 7,'h' => 8,
      'i' => 9,
      '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,
       0 => 27,1 => 28,2 => 29,3 => 30,4 => 31,5 => 32,6 => 33,7 => 34,8 => 35,9 => 36,
    );
    $flipped_map=array (
      1 => 'a',2 => 'b',3 => 'c',4 => 'd',5 => 'e',6 => 'f',7 => 'g',8 => 'h',9 => 'i',
      10 => 'j',11 => 'k',12 => 'l',13 => 'm',14 => 'n',15 => 'o',16 => 'p',17 => 'q',
      18 => 'r',19 => 's',20 => 't',21 => 'u',22 => 'v',23 => 'w',24 => 'x',25 => 'y',
      26 => 'z',27 => 0,28 => 1,29 => 2,30 => 3,31 => 4,32 => 5,33 => 6,34 => 7,35 => 8,
      36 => 9,
    );

    for ($i = 0, $j = strlen( $string); $i < $j; $i++) 
    {
        if(!ctype_digit($string[$i])){
            $char=mb_strtolower($string[$i]);
        }
        else $char=(int)$string[$i];

        if(isset($map[$char])){
            $tmp = $map[$char]+18; 
            $tmp=($tmp>36)?$tmp-36:$tmp;
            if(!ctype_lower($string[$i])&&!ctype_digit($string[$i]))
                $string[$i]=mb_strtoupper($flipped_map[$tmp]);
            else
                $string[$i]=$flipped_map[$tmp];
        }
    }
    return $string;
}

Конечно, это можно улучшить, но это уже хорошая отправная точка ...

Однако , если вы действительно хотите использовать код ASCII, я предлагаю использовать полный ASCIIкарта, позволяющая использовать все символы и поддерживающая дух быстрой и простой в реализации функции кодирования-декодирования. Таким образом, ваша функция будет str_rot128 вместо str_rot18:

function str_rot128($string){
    if(!is_string($string)) return false; 
    for ($i = 0, $j = strlen( $string); $i < $j; $i++) 
    {
        // Get the ASCII character for the current character
        $char=ord($string[$i])+128;
        $char=$char>256?$char-256:$char;
        $string[$i]=chr($char); 
    }
    return $string;
}

Вы можете увидеть рабочийкод здесь: Альтернатива str_rot13 с использованием большего количества символов, чем az

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...