ОБНОВЛЕНИЕ: Спасибо за вашу помощь! После некоторой работы над гибридной концепцией ROT13 я придумал что-то, что работает для меня. Прошу прощения за хромоту и выложу свое решение, но вот оно:
function ROT_by_strpos($s,$type='in'){
$index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for ($n = 0; $n<strlen($index); $n++){
$k[] = substr( $index,$n ,1);
}
if($type == 'out'){
$k = array_reverse($k);
}
$rot = '';
$count = 1;
$len = strlen($s);
for ($n = 0; $n<strlen($s); $n++){
$key_in[] = substr( $s,$n ,1);
}
for ( $i = 0; $i < $len; $i++ ){
$key = array_search($key_in[$i], $k)+1;
if($type == 'in'){
if($key+$i > count($k)){
$rev = $key+$i - count($k);
$new_key = $rev;
}else{
$new_key = $key+$i;
}
}else{
if($key+$i >= count($k)){
$adv = $key+$i - count($k);
$new_key = $adv;
}else{
$new_key = $key+$i;
}
}
$rot .= $k[$new_key];
}
return $rot;
}
Предполагается, что возможные символы взяты из $ index и длина строки кода <= 10 символов. </p>
Использование:
$ key = "Bd333333d";
$ in = ROT_by_strpos ($ key, 'in');
$ out = ROT_by_strpos ($ in, 'out');
echo "$ key - $ in - $ out"; // Bd333333d - Cf6789ABm - Bd333333d
Возможно, есть более элегантный способ сделать это, но он работает. Любые отзывы или улучшения будут оценены, если вы хотите что-то добавить. :)