encryption — функция php возвращает неожиданное значение possibly (возможно, вызвано unicode или bytecode)

Простая функция шифрования cezar cipher

Прямо сейчас, шифрование строки «g» приведет к « ». Между тем шифрование «g» возвращает ожидаемое «G». Почему может быть причиной символа ? Если входная строка «g», ожидаемый результат: «G».

фрагмент кода:

function encrypt($plaintext, $n, $key1, $key2, $L1, $L2) {
$result = '';
// encrypt first half of input
$array_key1 = preg_split('//u', $key1, -1, PREG_SPLIT_NO_EMPTY);
for ($k=0; $k < (int)(mb_strlen($plaintext)/2); $k++) {
$char = $plaintext[$k];
if (in_array($char, $array_key1)) {
$i = (strpos($key1, $char) + $n) % $L1;
$result .= $key1[$i];
} else {
$result .= $char;
}
};

полный код

0

Решение

Результирующая строка не кодируется должным образом в utf-8, вероятно, будет кодировкой по умолчанию в вашей конфигурации php.

ожидаемый результат показывает с

echo utf8_encode((string)$string . "\n");

вместо echo $string . "\n";

предполагая, что это ожидаемый результат вашей записи.

0

Другие решения

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

Некоторые заметки:

  • передавать только необходимые данные в качестве аргументов функции — пусть функция выполняет подсчет длины и соответствующую обработку
  • по упаковке $key1 а также $key2 в один массив, ваш процесс может быть более сухим.
  • осуществляя mb_ вызовы функций в нужных местах, я верить это работает как задумано.

Код: (демонстрация)

function encrypt($plaintext, $n, $keys, $encoding='UTF-8'){

$plain_chars = preg_split('//u', $plaintext, -1, PREG_SPLIT_NO_EMPTY);
$plain_halves = array_chunk($plain_chars, ceil(sizeof($plain_chars)/2));

$result='';

foreach($plain_halves as $i=>$chars){
$L=mb_strlen($keys[$i]);
foreach($chars as $char){
echo "i = $i, char = $char, ";
if(($offset = mb_strpos($keys[$i],$char,0,$encoding))!==false){
echo "offset $offset & calc: ($offset+$n)%$L = ",($offset+$n)%$L," \n";
$result .= mb_substr($keys[$i],($offset+$n)%$L,1,$encoding);
}else{
echo "no viable offset\n";
$result .= $char;
}
}
}
echo "Output is: ";
return $result;
}

$keys=[
'aA0!bBcC"1dDeE2f#Fg¤G3%hHi&I4/jJ(kK)5l=Lm?M6@nNoO7pPqQ8rRsS9tTuUvVwWxXyYzZ',
'1aAbBc2CdDeE3fFgG4hHjJ5kKlLm6iIwWMnNo7OpPq8QrRsS9tTuUvVxXyYzZ'
];

$string = 'g ';

var_export(encrypt($string, 1, $keys));

Выход:

i = 0, char = g, offset 18 & calc: (18+1)%74 = 19
i = 1, char =  , no viable offset
Output is: '¤ '

постскриптум Вот альтернатива без регулярных выражений:

function encrypt($plaintext, $n, $keys, $encoding='UTF-8'){
$length=mb_strlen($plaintext);
$key_lengths=[mb_strlen($keys[0]),mb_strlen($keys[1])];
$midpoint=floor($length/2);
$result='';
for($x=0; $x<$length; ++$x){
$i = $x<$midpoint?0:1;
$char=mb_substr($plaintext,$x,1,$encoding);
$result .= (($offset=mb_strpos($keys[$i],$char,0,$encoding))!==false)?mb_substr($keys[$i],($offset+$n)%$key_lengths[$i],1,$encoding):$char;
}
return $result;
}
0