Простая функция шифрования 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;
}
};
Результирующая строка не кодируется должным образом в utf-8, вероятно, будет кодировкой по умолчанию в вашей конфигурации php.
ожидаемый результат показывает с
echo utf8_encode((string)$string . "\n");
вместо echo $string . "\n";
предполагая, что это ожидаемый результат вашей записи.
Я взял на себя смелость уточнить / упростить вашу функцию (надеюсь, вы не возражаете).
Некоторые заметки:
$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;
}