Сходство некоторых русских и английских букв достаточно часто используется как средство защиты. Типичный пример, сайты тестирования. Отвечая на вопрос, а что выдаст программа:
Встаёт вопрос: а как закодировать и декодировать подобное содержимое.
Основной приём в программах производящих (де-) кодирование - это замена одних букв на другие. Ниже я привожу какие буквы выглядят схоже (набор может быть расширен):
Используя эту простую идею, можно написать программу-фильтр, которая производит замену. Поскольку я часто использую perl для подобных целей, то привожу код соответствующего скрипта:
#include <stdio.h>
int main()
{
unsignеd int а, b, с;
а = 1; b = 2; с = 3;
рrintf("%d %d", а < b + с, а - b < с);
}
так и хочется открыть online-компилятор и проверить. Но открыв, например, liveworkspace.org, запустив данную программу мы получим кучу ошибок:Compilation finished with errors: source.cpp:4:4: error: stray '\320' in program source.cpp:4:4: error: stray '\265' in program ... source.cpp:6:2: error: stray '\201' in program source.cpp: In function 'int main()': source.cpp:4:4: error: 'unsign' was not declared in this scope source.cpp:4:12: error: expected ';' before 'd' source.cpp:5:5: error: expected primary-expression before '=' token source.cpp:5:10: error: 'b' was not declared in this scope source.cpp:5:20: error: expected primary-expression before '=' token source.cpp:6:22: error: expected primary-expression before '<' token source.cpp:6:30: error: expected primary-expression before ',' token source.cpp:6:44: error: expected primary-expression before ')' token source.cpp:6:44: error: 'rintf' was not declared in this scopeИли найдите слово "Маша" на данной странице в следующем фрагменте (через поиск):
Maшa eлa кaшy.
Встаёт вопрос: а как закодировать и декодировать подобное содержимое.
Основной приём в программах производящих (де-) кодирование - это замена одних букв на другие. Ниже я привожу какие буквы выглядят схоже (набор может быть расширен):
| Русские буквы | аАВсСеЕНкКМоОрРТхХу |
| Английские буквы | aABcCeEHkKMoOpPTxXy |
Используя эту простую идею, можно написать программу-фильтр, которая производит замену. Поскольку я часто использую perl для подобных целей, то привожу код соответствующего скрипта:
#!/usr/bin/perl
use strict;
use warnings;
use Encode;
use Getopt::Long;
=comment
Программа позволяет преобразовать схожие английские буквы в русские и наоборот.
Параметр "--how" позволяет указать направление перевода:
rus2eng - заменить русские буквы английскими
eng2rus - заменить английские буквы русскими
Пример вызова:
perl -- d:\Проекты\Perl\similiar_letters.pl --how=rus2eng < e:\in.txt > e:\out.txt
perl -- d:\Проекты\Perl\similiar_letters.pl --how=eng2rus < e:\in.txt > e:\out.txt
Скрипт может вызываться из других программ. При вызове из Windows программ текст
в некоторых случаях передаётся в кодировке DOS (cp866) и читается в такой же.
Поэтому добавлен параметр "--dos" для предварительного преобразования.
Пример вызова:
perl -- d:\Проекты\Perl\similiar_letters.pl --dos --how=rus2eng < e:\in.txt > e:\out.txt
perl -- d:\Проекты\Perl\similiar_letters.pl --dos --how=eng2rus < e:\in.txt > e:\out.txt
=cut
my ($how, $dos) = ("", 0);
GetOptions(
"how=s" => \$how,
"dos" => \$dos,
);
my $rus = "аАВсСеЕНкКМоОрРТхХу";
my $eng = "aABcCeEHkKMoOpPTxXy";
my ($from, $to) = ("", "");
if ($how eq "rus2eng") {
$from = $rus;
$to = $eng;
} elsif ($how eq "eng2rus") {
$from = $eng;
$to = $rus;
} else {
print STDERR "unknown value of parameter 'how'\n";
}
undef $/;
$_ = <STDIN>; # не тоже самое, что <> поскольку во втором случае параметры скрипта влияют
$_ = Encode::encode("cp1251", Encode::decode("cp866",$_)) if ($dos);
eval "y/$from/$to/";
$_ = Encode::encode("cp866",Encode::decode("cp1251",$_)) if ($dos);
print STDOUT $_;
Комментариев нет:
Отправить комментарий