Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Преобразование чисел


Автор: KSURi 11.2.2008, 01:36
Хотелось бы услышать ваши предложения по поводу обфускации чисел. Т.е. нужно превратить данное число в сложное, визуально "пугающее" выражение, которое в итоге все равно дает это заданное число.
Чем больше вариантов, тем лучше)

Вопрос может быть даже скорее алгоритмический, чем перловый, однако, будет плюсом задействовать какие-то перловые "фишки" (japh, особенности синтаксиса и т.п.), собственно поэтому он здесь.

PS: у меня почему-то фантазия в данном направлении работать отказалась =(

Автор: amg 11.2.2008, 09:19
Цитата(KSURi @  11.2.2008,  01:36 Найти цитируемый пост)
визуально "пугающее" выражение
Код

$code = '25 + 42';
$obf_code = obf($code);

print $code, "\n", eval($code), "\n";
print $obf_code, "\n", eval($obf_code), "\n";

sub obf {
  my $code = shift;
  $code =~ s/(\d+)/
    ($_=$1) =~ tr|0-9|"-+|;
    s|'|\\'|g;
    "\${[\$_='$_',y;!-,;\/-:;]}[0]";
  /eg;
  return $code;
}
Я бы испугался smile Хотя расшифровать эти варажения большого труда не составит, но немного подумать придется.

Автор: KSURi 11.2.2008, 13:19
amg, спасибо, пригодится.

Тема все еще актуальна, буду рад вашим предложениям (не только JAPH, но и математическим манипуляциям)

UPDATE2:
на 9ой строке варианта amg лучше будет заменить регулярку вот на эту: 
Код

^(\d+\.?\d*)

чтобы правильно обрабатывать вещественные числа

Автор: AlexPet 11.2.2008, 13:36
Цитата(KSURi @  11.2.2008,  01:36 Найти цитируемый пост)
Т.е. нужно превратить данное число в сложное, визуально "пугающее" выражение, которое в итоге все равно дает это заданное число.

Правильно ли я понимаю, что нужно построить некую биекцию (взаимно-однозначное соответствие) между любым числом и неким "пугающим выражением"?

Автор: KSURi 11.2.2008, 13:58
Прочитал в вики, что такое биекция...) Да, вы правильно поняли.

Автор: amg 11.2.2008, 14:05
Цитата(KSURi @  11.2.2008,  13:19 Найти цитируемый пост)
на 9ой строке варианта amg лучше будет заменить регулярку вот на эту
Там еще много чего надо предусмотреть. Например, обработку переменных типа $var123. Нужно рассматривать этот вариант лишь как набросок идеи.

Добавлено через 3 минуты и 50 секунд
Цитата(AlexPet @  11.2.2008,  13:36 Найти цитируемый пост)
взаимно-однозначное соответствие
А я понял, что, кроме этого, скрипт должен правильно исполниться без применения внешних средств (а то можно зазиповать, будет максимально нечитабельно, и взаимно-однозначное соответствие тоже будет)

Добавлено через 14 минут и 47 секунд
Еще одна мысль. Переопределить какой нибудь оператор так, чтобы он, например, декодировал base64, и, соответственно, операндом ему давать закодированное число. Правда, при этом придется к скрипту модуль прилагать.

Автор: AlexPet 11.2.2008, 14:24
Тогда еще вопрос по математическому преобразованию (безо всяких хитрых обфукаторов и JAPH):
Допустимо ли выдавать вместо числа X функцию F(X), при условии, что известна обратная функция F^{-1}(X), т.ч. F^{-1}(F(X)) = X?
Если да (т.е. не требуется выдавать некое выражение, после применения eval к которому получим исходное число), то таких хитрых функций можно придумать великое множество.
Простейший пример:
F(X) = X*X
F^{-1}(X) = sqrt(X)
(здесь в силу машинной погрешности рискуем не получить исходный икс)
Или так:
F(X) = X + 1
F^{-1} = X - 1

Думаю, в этом направлении можно копать для целочисленных функций, в т.ч. поциферно.
Если, конечно, я правильно понял...

Автор: under_sun 11.2.2008, 21:55
Цитата(KSURi @  11.2.2008,  13:19 Найти цитируемый пост)
не только JAPH, но и математическим манипуляциям

Вариант с мат. манипуляциями:
Код

$x = 12.34; #0!
$ob = O_o ($x) ;
print "x = $x\nx = $ob = ", eval $ob;

sub O_o {
  my ($n, $a, $b) = shift;
  $n < 0 ? ( $b = ($a = rand -$n) - $n ) : ( $a = $n + ($b = rand $n) ); 
  my $s = "(($a*($a-2) - $b*($b+2) + sqrt($a*$b)*($b-$a+2))/($a + $b - sqrt($a*$b)))/(1 + 2 * ( ($a*$a + $b*$b + $a*$b)/($b*$b*$b - $a*$a*$a) ) )";
  return $s;
}
  
Конечно, не так "страшно", как у amg smile , вот еще примерчик:
Код

$x = 12; #0! 1! - ограничения.
$ob = O_o ($x) ;
print "x = $x\nx = $ob = ", eval $ob;

sub O_o {
  my ($m, $n, $s) = shift;
  $n = sqrt(abs $m) - 1;
  $s = ($m < 0) ? "-exp( log($n) + 0.5*log(4) ) - exp( log(8) * log($n * $n) / (3*log(2))) - 1" : "exp( log($n) + 0.5*log(4) ) + exp( log(8) * log($n * $n) / (3*log(2))) + 1";
  return $s;
}

Автор: KSURi 11.2.2008, 23:11
under_sun, спасибо, результат очень похож на то, на что я нацелился изначально. Осталось внедрить случайную расстановку скобок без влияния на конечный результат, но это я уж сам)

Если можно, вопрос: каким образом вы подбирали цепочку мат. вычислений?

Автор: AlexPet 12.2.2008, 09:53
KSURi, 
under_sun изящно подобрал математические тождества. Знаете, часто в учебниках бывают задачи: "Докажите тождество". Или: "Упростите выражение". Здесь именно это.
В первом случае формулы сокращенного умножения + разложение на множители (и получаем в итоге a - b), во втором случае - свойства натурального логарифма (и получаем в итоге то же m).
Совет - посмотреть учебники 9-11 классов в области преобразований и упрощений ;)

Автор: under_sun 12.2.2008, 16:59
AlexPet абсолютно прав, каждое из выражений упрощается с использованием школьных формул.

Автор: KSURi 12.2.2008, 18:06
Ну застыдили прям) Спасибо, не обратил внимания.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)