x64dbg, отладка для новичков

Доброго времени суток, друзья! Эта статья базовая и обзорная по возможностям современного отладчика x64dbg для новичков. Данное приложение свободное и доступное вы его можете скачать с официального сайта.

Содержание

Коротко о регистрах и флагах
Знакомство с интерфейсом x64dbg
Вкладка CPU
Вкладка «Граф» (Graph)
Вкладка «Журнал»
Вкладка «Заметки»
Вкладка «Точки останова» («Breakpoints»)
Вкладка «Карта памяти» («Memory map»)
Вкладка «Стек вызовов»
Вкладка «SEH» (Structured Exception Handler)
Вкладка «Сценарии»
Вкладка «Отладочные символы»
Вкладка «Ссылки» («Refs»)
Вкладка «Потоки» («Threads»)
Вкладка «Дескрипторы»
Написание приложения требующего ввода «секретной последовательности»
Получение правильного ключа

Визуализируем логику работы программы
Выводы

Начнем с главного вопроса для чего мы можем применить полученные знания про отладчик? На компьютере работает огромное количество программ. Не имея отладчика под рукой, вы только в общих чертах можете сформулировать функции приложений. Некоторую часть отладочных сообщений можно получить запустив приложение из консоли. В таком случае, если в графическом приложении предусмотрен вывод сообщений, тогда вы увидите их в консоли.

Однако подобного рода сообщения все же не способны пролить свет на функционирование приложения. Вы уверенны в том что приложение не соединяется с вредоносными узлами и не получает от них команды? Нет? — Тогда эта статья для вас.

Коротко о регистрах и флагах

Отладчик это словно скальпель в руках хирурга. Данный инструмент вскрывает для вас тело программы. Прыгая между последовательностью команд в реальном времени, модифицируя содержимое регистров и флагов вы меняете ход работы приложения. Регистры (регистровая память) это область где хранятся данные с которыми процессор в данный момент имеет дело. Изначально регистры были размером в 16 бит, например, ax — регистр аккамулятор (используется для складывания/вычитания величин), cx — регистр счетчик (используется для указания длинны цепочек данных), dx — регистр данных и так далее. Флаги это словно светофоры в реальной жизни. Флаг имеет два состояния 0 и 1. Флаги с которыми вы сталкиваетесь в повседневной жизни: флаг нуля zf, флаг переполнения of, флаг парности pf.

Также есть специальные флаги, например, когда ваш компьютер от начала своего включения работает в реальном режиме и не может воспользоватся всей оперативной памятью. Для того что бы это стало возможным выполняется комманда, которая устанавливает флаг PE (protected enabled) в 1. Процессорные флаги нельзя модифицировать явно. Для этого используются комманды. Не следует путать процессорные флаги и флаговые переменные в программах написанных на языках высокого уровня. Их в отличии от процессорных флагов можно модифицировать явно, например:

#include <iostream>
using namespace std;
// целочисленный тип состоить из 4 байтов.
// итого в одой целочисленной переменной 32 разных флага
// чтобы было видно наглядно продемонстрируем флаги в двоичном и шестнадцатичном
// виде:
// 00000000 00000000 00000000 00000001 — 0x1 первый флаг установлен в 1
// 00000000 00000000 00000000 00000010 — 0x2 второй флаг задан
// 00000000 00000000 00000000 00000100 — 0x4 третий флаг установлен в 1
// 00000000 00000000 00000000 00001000 — 0x8 четвертый флаг установлен в 1
// 00000000 00000000 00000000 00010000 — 0x10 пятый флаг установлен в 1
// ……………………………………………………………..
// 10000000 00000000 00000000 00000000 — 0x100000 32-ой флаг установлен в 1
int main() // главная функция консольного приложения
{
int state=0; // Пусть в начале не один флаг не задан
// Давайте установим второй и четвертый флаг
// Для этого выполним булевую операцию «ИЛИ»
// над нашей флаговой переменной state
state = state | 10; // 00000000 00000000 00000000 00001010 — 0xA
// Чтобы проверить установлен 4-ой флаг в единицу или нет
if(state & 8 == 1) cout<<«The 4th flag is set!»<<endl;
else cout<<«The 4th flag is not set!»<<endl;
// Чтобы выключить флаг необходимо проделать обратные операции
// «И» + «НЕТ». Выключим четвертый флаг
state = state & ( !8 );
// «И» — & (символ амперсанд), «ИЛИ» — | (вертикальная черта), «НЕТ» — !
// «ИСКЛЮЧАЮЩЕЕ ИЛИ» (другие названия: XOR, сумма по модулю 2) — ^
// Эти операторы языка программирования — называются функциями булевой алгебры.
// Элементов «И», «ИЛИ», «НЕ» достаточно чтобы построить компьютер.
// Физически данные элементы можно представить в виде электрических схем.
// Собственно процессор и есть множество транзисторов.
return 0; // ноль возвращается всегда в случае успеха
}
Пример обращения с флаговыми переменными в языке С++

Итак флаговая концепция очень удобна для комбинирования множества свойств объекта в одной целочисленной переменной.

Но, вернемся к регистрам и низкоуровневым процессорным флагам. Современные рабочие станции оснащены 64-битными процессорами. Это значит что максимальный размер регистра у них 64-бита. Несмотря на наличие регистров большего размера, можно использовать старые давно знакомые регистры.

Битность регистров приведена ниже:
al,ah,bl,bh,dl,dh,cl,ch — 8 битные регистровые пары формируют 16 битные ниже;
ax,bx,dx,cx — 16 бит
eax,ebx,edx,ecx — 32 бита
rax,rbx,rdx,rcx — 64 бита

Не трудно заметить, что в название 16-битных регистров добавили букву, но предназначение у них то же, по аналогии с ax,bx,cx. Если вы думаете что время 16-битных процессоров прошло — вы ошибаетесь. Их используют как правило для встраиваемых систем не требующих много ресурсов. Для примера, зачем для контроля освещения в комнате использовать мощьный процессор, если это можно собрать дешевле на менее мощьных чипах. И конечно не обязательно на архитектуре x86.

Знакомство с интерфейсом x64dbg

Не смотря на x64 в названии, в нем также присутствует и версия для 32 битных систем. Отладчик портабильный его можно записать на съемный носитель и перенести на другую машину. Кроме того существует возможность расширить возможности и удобство использования за счет плагинов.

Стандартный же вид состоит из панели инструментов сверху. Предназначена она для быстрого открытия файлов, манипуляций с ходом работы программы, вставки закладок (очень удобно если программа запутана множественным ветвлением). Одним из самых интересных, на мой взгляд, инструментов есть поиск строк и межмодульных вызовов.

Вкладка CPU

CPU tab
x64dbg

Под панелью инструментов мы можем увидеть вкладки. Главная из которых — CPU. В этой вкладке вы можете увидеть состояние работы приложения. Регистр RIP — для 64-битных ОС (или регистр eip для 32-битных) визуально представлен стрелочкой, что указывает на текущий адрес в котором содержится комманда. Адреса в оперативной памяти куда загружается программа даются операционной системой. Большинство пользовательских ОС используют защищенный режим. В защищенном режиме для каждой программы выделяются страницы памяти. Каждая страница обладает своими атрибутами (доступ, чтение, запись). Если вы попробуете записать что-либо на место в памяти доступное только для чтения, то получите ошибку memory access violation. Смотреть: Управления оперативной памятью в ОС .

Ниже мы видим серию вкладок dump 1-5. Можно просматривать до 5 разных фрагментов памяти не прыгая по разным адресам. Удобней переключатся между часто просматриваемыми дампами памяти. Также в серии вкладок есть «просмотр», «локальные переменные», «структура». Если программа включает отладочные символы эти вкладки очень пригодятся. Отладочные символы включаются в проект на начальном этапе разработки. При диагностирование неисправности приложения, удобней видеть не числовой адрес а соответствующую ему переменную. Однако, из конечного продукта отладочные символы убирают.

Справа сверху во вкладке CPU мы видим регистры процессора. При этом видны также специализованные регистры FPU (юнит для работы с числами с плавающей точкой). Содержимое регистров и флаги можно менять.

Вкладка «Граф» (Graph)

Данная вкладка полезна тем что визуально отображает ветвление приложения. Каждый блок с которого происходит переход озаглавлен названием приложения или модуля (библиотеки) и адреса.

application graph
Граф ветвления приложения

Это не блок-схема в классическом понимании, но все же очень удобная вещь. Вершины графа подписаны адресами (например 4A15A8).

Вкладка «Журнал», или «Log» в англоязычной версии

Log
Лог работы отладчика

Данная вкладка отражает журнал отладки приложения, загрузки и выгрузки ресурсов приложения. Также полезна тем что вы можете увидеть: адреса входа в программу, все установленные точки останова, аргументы с которыми запущенно приложение, состояние инициализации приложения.

Вкладка «Заметки» («Notes»)

Выбрав данную вкладку вы можете оставить заметку, чтобы продолжить разбор программы. Эта вкладка утилитарная и к процессу отладки не имеет отношения. Помогает организовать анализ приложения более эффективно.

Вкладка «Точки останова» («Breakpoints»)

breakpoints
Точки останова

По умолчанию точки останова ставятся на точку входа в программу, или модуль. Точки останова останавливают отладку программы при достижении выполнения определенной инструкции. Это удобно когда мы знаем что нас интересует например функция ввода символа scanf.

Вкладка «Карта памяти» («Memory map»)

Показывает как программа и сопутствующие модули раскладываются памяти на секции:

«.text» — секция испольняемого кода
«.rdata» — данные для инициализации (константы только для чтения)
«.data» — собственно переменные
«.pdata», «.xdata» — информация об исключениях
«.bss» — зарезервированное место для неинициализованных данных
«.idata» — таблица импорта функций
«.tls» — временное локальное хранилище для потока (в том случае если программа многопоточная)
«.rsrc» — секция ресурсов приложения (иконки, картинки, аудио и прочее)

sections of our app
Карта памяти исследуемого процесса

Если кликнуть правой кнопкой по секции можно сделать следующее:

  • перейти к дизассемблированному коду (переход на вкладку CPU)
  • перейти к дампу, рассмотреть секцию приложения или модуля более детально
  • направить дамп памяти в файл
  • оставить комментарий над секцией
  • поиск шаблона (поиск ascii, или юникод последовательностей)
  • найти ссылки на данные в данной секции
  • также можно выделить/освободить память под определенную секцию
  • перейти на необходимый адрес
  • задать права доступа
  • установить точку останова, чтобы наглядно видеть когда происходят обращения к секции
  • скопировать строку из таблицы, или же отдельную ячейку

Что касается установки точек останова на обращение к данным в определенной секции, то они могут быть разовыми и постоянными.

Вкладка «Стек вызовов»

В данной вкладке мы видим таблицу вызовов функций. При вызове функции, например командой call, следующий адресс после нее (адресс возврата) помещается в стек. Если в функции будет еще функция то аналогичное происходит и с ней. По умолчанию показывается состояние активного кадра вызовов на данный момент.

Контекстное меню в данной вкладке позволяет проследовать по адресу возврата и осмотреть дизассеблированный код. Также можно скопировать адрес возврата в буфер.

Вкладка «SEH» (Structured Exception Handler)

Данная вкладка отображает структуру исключений. Код приложения должен покрывать все возможные варианты поведения пользователя и программы. Нам пока данный функционал не нужен.

Вкладка «Сценарии»

automation
Сценарий

Модификация множества регистров вручную не всегда удобна. Для этих целей вы можете воспользоватся контекстным меню во вкладке сценарии, открыв файл или введя одну команду. Попробуйте ввести комманду inc rax (для x64) или inc eax (для x32). После выполнения соответствующей команды вы увидите что содержимое регистра увеличилось на 1.

Вкладка «Отладочные символы»

Смотреть на безликие адреса памяти неудобно. Для удобства при начальном этапе разработки включают отладочные символы. Это позволяет понять где совершена ошибка и быстро её исправить.

Отладочные символы

Как вы можете заметить кроме приложения здесь содержатся ещё библиотеки. Библиотека kernel32.dll одна из главных (Да, kernel32.dll присутствует на 64 битной машине). В ней содержатся функции создания и отладки процессов, управления консолью и прочие. msvcrt.dll — это runtime библиотека, стандартных с-функций функций. Справку по этим функциям можно просмотреть в msdn.

Вкладка «Ссылки» («Refs»)

В этой вкладке можно посмотреть все обращения к области в памяти. Из контекстного меню можно поставить точку останова на выбранную область, перейти к просмотру дампа, установить закладку, скопировать адрес и/или дизассеблированный код.

string references
Поиск ссылок на строки

Ссылки на строки можно искать как в отдельном модуле/приложении или во всех сразу.

Вкладка «Потоки» («Threads»)

Предоставляет информацию о наличии потоков. Позволяет перейти на первую инструкцию в потоке. Разделение приложения на потоки должно увеличить скорость его работы. Каждый поток имеет свой приоритет. Этот приоритет можно переопределить клацнув в контекстном меню на потоке. Также потоки можно терминировать.

Вкладка «Дескрипторы»

input output descriptors
Дескрипторы

Объектами ввода-вывода в ОС Виндовс могут быть файлы, потоки, сокеты. Для каждого файла/потока/сокета есть свой дескриптор. Данная вкладка дает нам представление о присутствующих операциях ввода-вывода.

Написание приложения требующего ввода «секретной последовательности»

Начнем с того, что харкодить секретную последовательность в приложении нельзя (вы в этом убедитесь). Во всяком случае так явно как будет сделано в этом обзорном курсе. Как правило, проверка лицензии осуществляется серверами проверки лицензий, которые после прохождения у них валидации высылают часть файла необходимого для работы приложения.

Я установил себе IDE Code Blocks. Он поставляется в нескольких вариантах, качайте тот что включает в себя компилятор mingw gcc для вашей архитектуры (чтоб не настраивать все вручную). Данная IDE содержит шестнадцатичный редактор. Примеры использования 16-ичного редактора вы можете найти в статье: Представление информации: язык программирования Python и кодировки .

Далее я создал проект обычного консольного приложения. В Settings->Compiler->Compiler settings включил опцию -static. Код приложения ниже:

#include <iostream>
using namespace std;
int main()
{
string some_secret_var=»sequence that is valid»;
string key=»»;
while (true)
{
cout << «Enter valid Key: «<< endl;
getline(cin,key);// Если напишете cin>>key, то занесете только первое слово
if(some_secret_var==key){break;}
else cout << «Key is wrong!»<<endl;
}
cout<<«Your key is valid!»<<endl;
system(«pause»);
return 0;
}
Простое приложение которое требует ключь

Как видите, приложение просто до невозможности. Переменная some_secret_var содержит последовательность что проходит валидацию. Цыкл while безконечен пока в переменную key не будет введен правильный код. В случае ввода неправильного кода получим «Key is wrong!», в противном случае «Your key is valid».

Получение правильного ключа

Для начала нам нужно протестировать приложение (можно без отладчика). В общем виде алгоритм тестирования выглядит следующим образом:

  1. Запускаем приложение
  2. В зависимости от того что оно нам предлагает делаем действие
  3. Смотрим на реакцию на наше действие (в нашем случае пользовательский ввод)

Визуально мы видим цыкл который снова и снова заставляет нас ввести правильную последовательность, в случае неуспеха. Но мы же крепкие ребята))). Один из самых простых способов попытатся найти ключ — это осуществить поиск уже известных нам переменных или констант. Правой кнопкой клацаем во вкладке CPU и выбираем «Поиск в»->»Все модули»->»Ссылки на строки». В строку поиска вбиваем знакомую нам строку «key is» и видим следующе:

Адрес=00000000004A1562
Дизассемблированный код=lea rdx,qword ptr ds:[4A5054]
Строка=»Key is wrong!»

По адрессу 4A5062 у нас содержится искомая строка. Если перейдете во вкладку «Карта памяти» вы увидите что указанная строка находится в секции приложения «.rdata»

Адрес=00000000004A5000
Размер=000000000000F000
Информация о странице=».rdata»
Содержимое секции=Инициализированные данные только для чтения
Тип выделения=IMG
Текущие права доступа=-R—
Защита при выделении=ERWC-

Поскольку переменная string some_secret_var не меняет своего значения она занесена компилятором в секцию где хранятся константы (независимо от того объявите вы константу, или просто создадите переменную — компилятор сделает это за вас). Правой кнопкой в этой же вкладке клацаем «Перейти к дампу». Мы перешли к дампу и видим все текстовые константы.

00000000004A5000 basic_string::_M_construct null not valid.sequence that is valid
00000000004A5040 ..Enter valid Key: .Key is wrong!.Your key is valid!.pause……

Пробуем константу «sequence is valid». Это то то что нам надо. Мы нашли ключь.

Визуализируем логику работы программы

Теперь давайте снова перейдем на тот фрагмент что отвечает за вывод «Key is wrong», адрес 4A5000 в нашей программе. Нажимаем кнопку «G» и наслаждаемся визуализацией работы программы. Мы видим цыкл который начинается с адреса 4A15A8.

code branching
Функция memcmp

Программа в ассемлерных инструкциях выглядит длиннее не правда ли? Нажав кнопку «о» вы увидите несколько сжатый вид. А теперь вопрос где же происходит сравнение и какой функцией?

call <JMP.&memcmp>
test eax,eax
jne crack_my_sequence.4A1555 ; если ключь не правильный переходим по этому адресу

Ассемблерная команда test eax,eax эквивалентна команде cmp eax,0 (но работает немного быстрее потому что обращение к регистровой памяти быстрее чем к оперативной). Команда «cmp eax,0», в свою очередь, работает как команда sub с той разницей что не меняется содержимое одного из регистров. По сути это сравнение с нулем результата функции memcmp. Команды test/cmp/sub модифицируют флаг zf. Команда jne переходит по указанному адресу если флаг не равен нулю (то есть когда мы ввели неправильное значение).

Выводы

Итак подведем итоги. Сегодня мы с вами научились следующему:

1) Использованию процессором регистров и флагов
2) Познакомились с флаговой концепцией в высокоуровневых языках
3) Познакомились с интерфейсом x64dbg
4) Можем выявить приложение использующее операции ввода-вывода с файлами, сокетами, потоками
5) Написали простое приложение на языке с++ и захардкодили «секретную строку»
6) Провели анализ работы приложения и нашли текстовые константы
7) Визуализировали логику работы программы

Сборка приложения в Unity3d: gradle vs internal

Содержание:

Unity3d замечательный инструмент предназначенный для создания игровых приложений. Большая часть повседневных задач в нем автоматизирована. Если создание приложений для вас хобби, тогда нет нужды изобретать колесо. Возьмите Unity3d + 3ds Max, или Blender 3d. Однако тут есть некоторые подводные камни о которых поговорим. Я искренне надеюсь, что моя статья поможет начинающим энтузиастам.

Не так давно, мне понадобилось собрать код своего приложение на другой машине. Я установил последнюю на тот момент версию Unity 2019.1. Взял свой предыдущий проект в Unity 5.6, который я так и не решился опубликовать на Google Play. Открыл и увидел ошибку «Prefab is missing». Я внимательно проверил все папки в моем проекте и все 3d-модели были на своем месте. Этот факт очень меня удивил.

Я подумал что причина в том что я изменил версию. Для проверки этого предположения я установил такую же версию (2019.1) на свою машину и не увидел: «Prefab is missing». Причина в том что Unity3d поддерживает 3d-модели которые созданы в Blender3d только когда он установлен. В нем нет встроенной поддержки Blender-моделей. Я установил этот пакет, но ошибка не исчезла. И это меня ещё больше удивило.

В документации сказано что Unity3d все ресурсы кеширует и потом производит над ними необходимые операции. В кеш ресурсы попадают после импорта. Я осуществил повторный импорт ресурсов (Assets->Reimport All) и ошибка исчезла.

Автоматизированные системы сборки

Для сборки приложения не достаточно исходного кода. Необходимо указать директивы для правильной линковки всех компонентов. В Unity все динамические библиотеки помещаются в папку Assets/Plugins. Самые трудно обнаруживаемые ошибки происходят во время выполнения приложения. Если в управляемом коде ошибки обнаруживаются быстро, то для обнаружения ошибок в нативном коде требуется выполнение на целевой платформе.

Отсутствующие ссылки на требуемые функции в нативных библиотеках приведут к ошибкам во время выполнения приложения. Таким образом, при сборке приложения ошибок вы не увидите. Но во время выполнения требуемая функция не будет найдена и программа остановиться. Это не критично, но неприятно и раздражает пользователей.

Приложения это сжатые в формате zip «.aab» и «.apk» файлы. Автоматизированные системы сборки отвечают за формирования таких файлов. Содержимое данных файлов зависит от настроек системы сборки. По умолчанию в Unity3d использует свою внутреннюю (Internal) систему сборки. Данная система сборки позволяет формировать только apk файлы и автоматически включает все файлы находящиеся в каталоге Assets/Plugins в проект.

Недостатки внутренней автоматизированной системы сборки

Давайте представим что вы очень давно создали проект своего приложения. Вы следите за тенденциями в компьютерном мире и безопасностью в целом. Вы постоянно обновляете компоненты своего приложения. Это правильно и так должно быть.

Предположим, что ваш проект содержит библиотеку функций «mylib-1.0.dll», которая ссылается на функции библиотеки «libxml.so». Через два года работы вашего приложения вы узнали что появилась новая версия «mylib-2.1.dll». Новая версия для своей работы требует уже не «libxml.so», а «libcsv.so». Исключив из своего приложения libxml.so вы ничего не заметите, потому что в версии «2.1» вашей библиотеки он не используется. Тем не менее, если вы забудете исключить этот файл из проекта, тогда автоматизированная система сборки включит эту вещь в проект.

Относительно «.jar» и «.aar» файлов в папке Plugins действуют подобные принципы. Все файлы классов «.class» включаются в проект. Не имеет значения нужны они или нет. Внутренняя автоматизированная система сборки включит весь набор классов. Это удобно, но только для новичков. Которые не хотят вникать в тонкости сборки программных пакетов.

Способы устранения устаревших зависимостей

Одним из способов борьбы с устаревшими зависимостями является хорошая документация проекта. Документация на разработанный программный продукт должна включать морфологическую карту для каждой версии приложения.

Морфологическая карта для двух версий приложения

Каждая новая версия библиотеки содержит changelog.txt в котором содержится список изменений по версиям приложения. Однако если в проекте слишком много сторонних зависимостей, тогда прочтение огромного количества информации может изнурить вас.

Поскольку со временем сторонние зависимости могут изменить свой функционал рекомендуют составлять unit-тесты. Это проще чем читать огромное количество документации. Впрочем, читать документацию придется, но не очень много.

Как получить список методов в библиотеке?

Самый простой способ использовать обозреватель решений, справа в окне Microsoft Visual Studio. Для этого кликните по одному из объектов обозревателя решений, например «System.Net.Security.dll», и нажмите «Просмотр в обозревателе объектов».

System.Net.Security.dll
Библиотека содержащая методы шифрования

В обозревателе объектов вы увидите список всех доступных классов, с небольшой справкой. Таким образом, вы можете просмотреть какой функционал реализует библиотека.

KeyAgreeRecipientInfo
Свойство «OriginatorIdentifierOrKey» в классе содержащее информацию об инициаторе согласования ключей

Вы можете узнать информацию о классах, полях, методах библиотек .Net во время выполнения своего приложения. Список импортируемых методов из managed библиотек можно получить применив System.Reflection. В этом namespace присутствует класс MethodInfo. Для получения информации о методах входящих в класс «MyClass» из динамической managed библиотеки:

MethodInfo[] methodInfos = typeof(MyClass).GetMethods(BindingFlags.Public |
                                                      BindingFlags.Static);

GetMethods из пространства имен «System.Reflection» использует и Visual Studio. Но что если вам захочется увидеть список функций в нативных библиотеках. В таблице ниже написаны средства для разных динамических библиотек которые написаны для разных ОС [1].

ОСПакетПрограмма
Linuxbinutilsobjdump -T MyLib.so
WindowsVisual Studiodumpbin /exports MyLib.dll
MacOSbinutilsobjdump -T MyLib.so
Androidbinutilsobjdump -T libMyLib.so

Отличия нативных динамических двоичных файлов

Для каждой из аппаратных архитектур используются свои кросс-компиляторы и утилиты из пакета binutils. Так название кросс-компилятора gcc для архитектуры arm-v7a будет выглядеть как: armv7a-linux-androideabi-gcc. А для архитектуры arm-v8a: aarch64-linux-android.

Утилита «file» в Linux может показать файловые заголовки. Давайте посмотрим, чем отличается динамическая shared object библиотека для Linux от динамической библиотеки для Android. Выполните в командной строке Linux:

[Cubby dev@machine src]$ file libMyLib.so
libMyLib.so: ELF 64-bit LSB shared object,
ARM aarch64, version 1 (SYSV), dynamically linked,
interpreter /system/bin/linker64,
BuildID[sha1]=45b9548a4d5bed6f702ff1a2af5208ad6aec312b,
with debug_info, not stripped

Обратите внимание на расположение linker64. Если вместо директории /system/bin вы видите что-то иное, например /lib, тогда данная библиотека собрана не для Android. В Linux большая часть исполняемых файлов находится в директории /usr/bin, а библиотеки в /usr/lib. В Linux применяется стандартная библиотека языка Си libc, или uClibc для встраиваемых систем. В Android своя стандартная библиотека, которая называется Bionic. Единственная схожесть состоит в формате исполняемых файлов ELF [2].

Преимущества Gradle и Proguard оптимизация

Выберите Build system: Gradle вместо Internal. Теперь вы можете собирать приложения в файлах aab. Для этого поставьте галочку напротив «Build App Bundle».

gradle
Сборка Unity3d проектов

Использование Gradle и Proguard позволят уменьшить размер исполняемого файла. Однако, есть некоторые нюансы на которые следует обратить внимание. Особенно если у вас есть плагины для Android (.aar), или Jar-библиотеки. Приложение иногда можно собрать и запустить без проблем, но во время выполнения могут возникать ошибки. В таких случаях необходимо через USB подключить устройство к вашему PC и запустить отладку вашего приложения через adb следующим образом:

adb logcat -d com.your_company.your_app:I *:W

Вы можете перенаправить вывод в файл добавив «> warnings.txt». Это помогает найти нужную информацию. Впрочем, поступайте как вам удобно. Adb входит в состав android sdk и доступен для Windows, MacOS и Linux. Если после сборки при помощи Gradle вы видите ошибку ClassNotFoundException, тогда вам надо проверить наличие в aar или jar библиотеках наличие данного класса. Если он есть но ошибка не исчезает, тогда поставьте галочку напротив User Proguard File.

User proguard file

Предположим, что ошибка: java.lang.ClassNotFoundException: > Didn’t find class > «com.google.android.gms.ads.MobileAds». Но в папочке Asset/Plugins/Android есть файл com.google.android.gms.ads.jar в этом архиве присутствует файл «MobileAds.class». Чтобы включить этот класс откройте файл proguard-user.txt в любом редакторе и добавьте следующие строчки:

-keep class com.google.android.gms.ads.** {
*;
}

Сравнение apk и aab пакетов

Для понимания различий уместно привести следующую аналогию. Приложения которые хранятся в apk файлах напоминают огромный бургер. Маленький бургер может не понравится клиентам которые любят радовать свой желудок большим бургером, а большой бургер понравится даже тем кто любит маленький бургер. Если вы не можете съесть весь бургер оставьте его и шагайте дальше.

Файлы aab, как холодильник хранят в себе все компоненты для бургера. Если у вашего устройства небольшой dpi, вы не будете качать ресурсы с большим dpi. Вы возьмете только то что вам надо. Но вы же, не будете есть холодный кусок говядины. Его надо разогреть! Подобным образом устроен и aab файл. После того как все необходимые компоненты скачаны, они компонуются в apk на устройствах клиентов [3].

Proguard и обфускация методов

Самое большое преимущество, это обфускация полей и методов в классах. В релизе вы будите иметь, компактный бинарный файл без ничего лишнего. Алгоритм Бойера-Мура для эффективного поиска работает быстрее при нормальном распределении букв в названиях методов. Это должно привести к быстрой работе приложения.

Поэтому unity и многие движки имеют дело не с названиями ресурсов, а с неудобочитаемым хешкодом вида: «ab103628e47f1da0bcd». Gradle переопределяет название методов и таким образом ускоряется нахождения функции. После выполнения функции она попадает в кеш и при повторном вызове она выполнится ещё быстрее. Если вы еще не используете proguard подумайте об этом.

Выводы

Встроенная в Unity3d автоматизированная система сборки подходит начинающим. Для опытных пользователей рекомендуется использовать Gradle. Основное преимущество Gradle — возможность создавать aab файлы. Вместе с Gradle используется proguard оптимизация переопределяющая названия функций в классах. Это увеличивает отзывчивость вашего приложения. Для включения классов из aar и jar библиотек, необходимо внести их названия в файл proguard-user.txt.

Источники информации:

[1] https://developer.android.com/ndk/guides/other_build_systems
[2] https://android.googlesource.com/platform/bionic
[3] https://developer.android.com/guide/app-bundle

Улучшаем приложение: Миграция между версиями Unity3d

Содержание:

Итак друзья, сегодня мы поговорим про очень важное требование для разработчиков от корпорации Google к приложениям на Google Play. Не секрет, что с 1 августа 2019 года все приложения должны поддерживать 64-битную архитектуру. Многие люди, особенно энтузиасты, для которых создание приложений просто хобби забывают о поддержке своих приложений. Ну или просто откладывают важные обновления.

Кому будет полезна данная статья?

  • Тем кто интересуется миграцией своих проектов между разными версиями Unity3d фреймворка;
  • Тем кто создал приложения на Unity3d (для версий не поддерживающих архитектуру ARM64-v8a <=5.6, 2017.1, 2017.2, 2017.3);
  • Тем кто использует нативный код для процессорных архитектур ARM-v7 и ARM-v8;
  • Тем кто использует сторонние фреймворки для создания Android приложений;
  • Начинающим разработчикам приложений.

Кому нет необходимости читать статью дальше?

  • Если вы написали приложение на языках Java, или Kotlin и не использовали нативный код написанный на C/C++;
  • Если вы не используете сторонние библиотеки.

Корпорация Google всегда предупреждает заранее и у вас ещё есть время привести все в соответствие требованием. Поскольку все 32-битные приложения armeabi-v7a идут на 64-битной архитектуре arm-v8a вы могли создать приложение и забыть об этом. Будьте внимательны и проверьте поддерживает ли ваше приложение данное требование.

Архитектуры процессоров, возможные сложности и методы их решения

Производителей электронного оборудования и аппаратных платформ достаточно много. : x86, SPARC, ARM, ARMv8-A, Alpha, Arc, Itanium, SMIPS,MIPS-LE, PowerPC, TILE. Сейчас, практически невозможно знать все тонкости и нюансы аппаратных архитектур. Обычно, в университетские курсы входит знакомство с набором x86 инструкций. Кроме того, архитектуры со временем устаревают.

Если бы все процессоры имели одинаковую архитектуру, тогда это существенно упростило бы жизнь программистам. Но так не бывает и не будет из-за следующих причин:

  1. Не все архитектуры открытые, многие из них запатентованы и защищены законом об авторском праве;
  2. Архитектуры строятся с учетом специфики задач и данных с которыми они будут работать;
  3. Инструкции меняются, или добавляются вместе с появлением новых технологий.

Так MIPS архитектуры и PowerPC используются в роутерах, некоторых простых телефонах. Для мобильных устройств более типичной архитектурой является ARM. Для ПК основными архитектурами являются x86 и x86_64. Несмотря на то что Intel и AMD выпускают процессоры с одинаковой x86_64 архитектурой, реализация некоторых инструкций у них своя. В статье которая посвящена уязвимостям Meltdown и Spectre мы говорили об одной из таких инструкций PAUSE. Читайте также: Как улучшить производительность Linux?

Архитектуры графических процессоров ориентированны на работу с числами с плавающей точкой. Эта их особенность особенно хороша когда вы тренируете искусственную нейронную сеть. Поскольку значения интенсивности цветов на изображениях перед их подачей на сверточную нейронную сеть нормализуют в промежутке от [-0.5;0.5], то использование графических карт ускоряет тренировку. В реальной жизни скорость тренировки нейронной сети зависит не только от количества графических ядер, но и от архитектуры СНС и выбора активационных функций.

Что такое нативный код?

Как вы угадали, количество машинных инструкций очень большое и невозможно их всех держать в голове. Что бы не потеряться в огромном разнообразии знаний, инженеры компании Sun создали виртуальную машину Java. Через некоторое время компанию Sun Microsystems приобрела корпорация Oracle.

Виртуальная машина Java выполняет промежуточный код компилируя его в машинный код. Машинных инструкций много, а промежуточных инструкций меньше. Это все похоже на архитектуру созданную поверх существующей архитектуры и упрощает жизнь программиста. Вам достаточно быть Java программистом, чтобы ваши программы запускались на множестве аппаратных архитектур. Вам не нужно углубляться в суть аппаратных архитектур, просто используйте Java.

Машинный код называется нативным кодом, потому что он будет работать только на одной аппаратной архитектуре. Нативный код рекомендуют избегать, но бывают случаи, когда без его применения не обойтись. Например, когда вам необходимо использовать специфические аппаратные возможности какой-нибудь архитектуры. Во всех остальных случаях рекомендуют использовать промежуточный код.

Какие языки программирования поддерживают промежуточное кодирование?

Кроме технологии Java Virtual Machine, похожие вещи применяет Microsoft. Корпорация Microsoft создала свою реализацию виртуальной машины которая выполняет промежуточный код и назвала технологию dot Net. Такими действиями они хотели получить преимущество в сегменте мобильных ОС. Рынок мобильных приложений огромен и они не хотели уступать источник своего обогащения другим конкурентам.

Unity3d применяет технологию промежуточного кодирования от корпорации Microsoft. Если вы откроете приложение созданное при помощи технологии Net, тогда в шестнадцатиричном редакторе вы увидите вначале метку MSIL. MSIL — это аббревиатура от слов Microsoft Intermediate Language (промежуточный язык Microsoft). Если приложение нативное, тогда вы увидите метку MZ, или другую метку.

Все языки входящие в набор Microsoft Visual Studio позволяют создать MSIL бинарный выполняемый файл. Таким образом, приложения могут работать на MacOS и Linux. В Linux есть своя реализация технологии Net. Библиотека Mono позволяет выполнять промежуточный код от Microsoft на Linux и MacOS.

Python в режиме интерпретации

Язык программирования Python также имеет виртуальную машину Python и использует свою технологию промежуточного кодирования. Поскольку виртуальная машина Python открыта и доступна для большинства архитектур, её используют в роутерах Cisco. Чтобы применять Python не нужно быть программистом, достаточно уметь пользоваться справкой help() и dir(). Введите название объекта в качестве аргумента чтобы получить справку и список доступных функций.

Разрушаем мифы: Насколько страшен переход к новым правилам

В большинстве новостных ресурсов все настолько драматизировали, что пошли страшилки касательно удаления приложений. Особенно это относится к русскоязычным ресурсам. Давайте вместе с вами найдем ответы на все вопросы и устраним все спекуляции.

Google Play roadmap
Roadmap для Google Play
(Источник: Google)

Кого августовский переворот не коснется? Чем старше ваш проект, тем сложнее будет мигрировать. Поэтому это не коснется приложений созданных в Unity <=5.6. Как вы видите, Unity разработчикам пошли на встречу и до 2021 года ничего страшного не случится. Этого периода вполне достаточно, чтобы переписать весь код своего приложения и пересобрать все сторонние зависимости.

Указанные изменения не коснутся приложений явно предназначенных для Wear OS и Android TV. Этот сегмент рынка не настолько насыщен разнообразием архитектур, как рынок смартфонов и планшетов. Кроме всего, это не коснется приложений не распространяемых на устройства под управлением Android Pie и следующих версий (уровень API 28+).

Google Play will stop serving apps without 64-bit versions on 64-bit capable devices, meaning they will no longer be available in the Play Store on those devices.

android-developers.googleblog.com

Что же будет на самом деле? Ваше приложение не будет видно в Google Play на устройствах с 64-битной архитектурой ARM-v8a. Это повлияет на позицию в поисковой выдаче на Google Play. На всех остальных, устройствах оно будет доступно. Собственно, новые ОС от Google и так ориентированны в основном под 64-битные архитектуры. Разработчики приложений, в любом случае, добавят поддержку 64-битных архитектур. Охват большей аудитории в их интересах. Cocos2d, Unity3d и Unreal все поддерживают 64-битный режим. На кого же рассчитана эта новость?

Такими действиями Google провоцирует потребителей к покупке новых устройств. Заголовки в СМИ послужили поводом для огромного количества спекуляций среди обычных людей. Самое печальное, что прочитав такие заголовки люди ошибочно думают что в Google Play исчезнут все приложения под 32-битные устройства. Нет не исчезнут, можете не торопится покупать новые устройства. Для обычного пользователя пока ничего не изменится.

Все трудности миграции Unity3d проектов

Кажется что все просто, когда есть исходный код и кросскомпилятор. Однако, сторонние зависимости могут замедлить вашу миграцию. Чем больше стороннего кода и возможностей которые он предлагает, тем больше неожиданных проблем могут возникнуть. Из версии в версию происходит отказ от некоторых устаревших возможностей и создание новых возможностей. Новые возможности не всегда оперативно поддерживаются другими программными продуктами.

Для примера, Cocos2d поддерживал архитектуру ARM64-v8 ещё с 2015 года. Unity3d на то время этой возможности не поддерживала. В итоге, в тройке лидеров по созданию мобильных игр она стала последней внедрившей данную технологию после Unreal и Cocos2d. У каждого из этих движков есть свои преимущества и недостатки. Если вы не знакомы с ними и планируете написать свое приложение, тогда рекомендую ознакомится с пользовательскими форумами.

Как упростить миграционный процесс?

Во всех крупных компаниях и проектах создают план (Roadmap). Люди ответственные за развитие проектов излагают свое видение развития программных продуктов. Если вы собрались интегрировать одно из существующих решений реализующих требуемый функционал, тогда внимательно ознакомьтесь с ним. Но для начала, ответьте себе на важные вопросы.

  1. Ваше приложение будет многопользовательским, или однопользовательским?
  2. На какую группу людей рассчитано ваше приложение?
  3. На каких аппаратных платформах оно будет функционировать?
  4. Какие возможности вы будете реализовывать в будущем?
  5. Каким образом будет осуществляться контроль качества и внедрения приложения на целевой рынок?

Четвертый вопрос один из самых важных для людей ответственных за интеграцию решений. Представьте, что вы написали код реализующий некоторую возможность, а потом эту возможность исключили. Это очень печально, правда? Вам придется переписывать код. Поэтому не спешите создавать приложения и хорошо обдумайте все возможные нюансы прежде чем что-либо реализовывать.

Трудности миграции проекта Cube Mixer

Экспериментальную поддержку архитектуры ARM64-v8 внедрили в Unity 2018.1. Но вместе с внедрением новых возможностей они убрали старый добрый механизм создания многопользовательских игр. Раньше для создания многопользовательской игры использовалась комбинация высокоуровневого HLAPI и низкоуровневого LLAPI. По просьбам и жалобам трудящихся в компании решили отказаться от этого API. Ниже приведен план дорожная-карта развития Unity3d.

Unity3d unet deprecation
Переход от старого Unet к CGS

Старый добрый Unet меня, как и множество других разработчиков вполне устраивал. О нем, я не могу сказать ничего плохого. Это была хорошая вещь. Начиная с версии 2018.2 убран класс Network, поэтому применить Network.time уже не получится. Некоторые использовали его для синхронизации времени.

В Unity3d 2018.2 убрали HLAPI, а LLAPI был помечен как устаревший. Через некоторое время его также убрали. Сейчас разработчики вынуждены переписывать код под новое решение. Как вы видите на изображении выше, ещё не все готово в CGS. Интерфейс ещё достаточно сырой и приходится ждать конца 2019 года. Ко всему прочему, отсутствует адекватная документация по новым функциям. Без документации очень трудно разрабатывать приложение. Я внимательно слежу за блогами разработчиков Unity3d и постараюсь вас порадовать настолько быстро, насколько это возможно.

Сторонние библиотеки: Firebase

Разные сторонние библиотеки собираются на разных версиях Net Framework. Так в версии платформы Net 4.0, появилась динамическая типизация. Если вы попробуете скомпилировать код содержащий переменные типа «dynamic» для платформы Net 2.0, или Net 3.5, вы получите ошибку. В старых версиях такой поддержки не было и собрать современную библиотеку, без внесения правок в исходный код, на них не получится.

Так Firebase конфликтовал со старой версией Unity3d 2017.1. Через некоторое время это исправили. Сторонние зависимости не должны быть слишком старыми, но и переход на полностью новые не протестированные решения достаточно проблематичен. Для разработчика главное выбирать золотую середину.

Во всяком случае, есть средства тестирования приложений Firebase Test Lab. Поскольку я пока не являюсь счастливым обладателем устройства на базе архитектуры ARM64-v8a, я не могу оперативно исправлять приложение для этой архитектуры. Сейчас благодаря облачному тестированию я могу тестировать свое приложение на самом современном оборудовании. Очень жаль что там установлена квота 5 тестирований за день, но мне этого достаточно.

Unity3d и API compatibility level

Unity3d начал поддерживать платформу Net 4.x с 2017 года. Хотя данная платформа существовала задолго до 2017 года. Людям которые любят динамическую типизацию в Python изменения в Net 4.0 очень понравились. Я имею ввиду новый тип переменных «dynamic».

Unity3d .Net API compatibility
Поддержка .Net 4.x в Unity3d

Почему они не спешили переходить на эту платформу? Во первых, код применяющий возможности новой платформы не скомпилируеться для старой платформы. Все их действия предназначены для удобства разработчиков. Повторная сборка библиотек под новую платформу отнимает время.

Библиотеки компилируемые в промежуточный MSIL-код называются управляемыми (Managed). Они могут выполнятся на любых процессорах (AnyCPU). Существует очень важный нюанс, на который я хочу обратить ваше внимание, это дополнительный подтип «Any CPU 32-bit preffered» введенный в платформу Net начиная с версии 4.5 [1].

Target Architecture
Unity3d не предоставляет выбор «Any CPU 32-bit preffered», только «Any CPU»

Чтобы посмотреть какие флаги используют dll файлы в вашем проекте воспользуйтесь CorFlags.exe, которая лежит где-то в подпапках каталога Program Files. Эта утилита позволяет поменять флаги для Managed библиотек. Без опций она просто покажет текущее состояние флагов.

Version   : v4.0.30319 
CLR Header: 2.5 
PE        : PE32 
CorFlags  : 131075 
ILONLY    : 1 
32BITREQ  : 0 
32BITPREF : 1
Signed    : 0

Как я уже говорил, без нативного кода обойтись не всегда получается. Бывает такое, что нативный код под 64-битную платформу не собран. Временно можно обойтись 32-битным кодом. Если 32BITPREF для управляемого кода установлен в 1, тогда ваша библиотека будет искать нативную 32-битную dll даже на машине с 64-битной архитектурой. Для этого введите:

CorFlags.exe /32BITPREF+ name_of_your_lib.dll

Выводы

Все меняется и в современном мире достаточно тяжело успевать за технологиями. Но для разработчиков присутствуют инструменты способные упростить разработку приложений. Одно из таких решений — Firebase TestLab. Это решение помогает оптимизировать приложение под огромное количество устройств.

Источники информации:

  1. What AnyCPU Really Means As Of .NET 4.5 and Visual Studio, Microsoft blogs.

Cube Mixer 1.14 версия для 64-битных архитектур

Поскольку я не имел устройства на базе архитектуры ARM64 (набор инструкций AArch64), я не видел ошибки. Сегодня я открыл средство облачного тестирования Firebase TestLab и обнаружил ошибку. Там установлен бесплатный лимит на количество тестов 5 раз в день. И теперь я могу тестировать свое приложение на самом современном железе. Очень хочу исправить приложение и работаю над этим. Простите за неудобства, я работаю над устранением неисправности. Благодарю за терпение!

Видеоинструкция: Сокрытие информации в mp3 файлах

Содержание:

В предыдущей статье, мы разобрали способы сокрытия информации в изображениях, аудио и видео файлах. Все перечисленные способы просты для понимания, но я бы хотел продемонстрировать это визуально. Читайте также: Стеганография в аудиовизуальных образах.

Мы попробуем закодировать сообщение в фрагмент из произведения норвежского классика Эдуарда Грига — Wedding day at Troldhaugen. Для этого прекрасно подойдет LSB — метод. Собственно, передать сообщение можно всюду и всем, даже в поэзии путем чередования поэтических стилей. С точки зрения теории информации, разные стили — это разные состояния.Чем больше возможных состояний, тем больше полезной информации можно выразить.

Кодирование информации

Для начала вам нужно скачать midi-файл с классическим произведением. Древнюю музыку никто не слушает, поэтому это самый лучший выбор. Более того, медленный ритм 110-120 ударов в минуту прекрасно подойдет для пошагового анализа. Мы выберем ритм 120 ударов в минуту. Таким образом каждая порция 4/4 будет длится ровно 2 секунды. Для демонстрации это хорошее решение, и классическая музыка будет весьма кстати.

Ниже представлено таблицу ритмов и временные промежутки для наиболее распространенных тактовых размеров: 4/4, 2/2, 2/4, 3/4, 6/8. Числитель определяет количество долей в такте. Знаменатель определяет относительную длительность ноты (не в секундах, не путайте). Длительность описывается формулой: 60/bps * 4 * количество_долей/относительную_длину. Длительность одного такта размером 6/8 и ритма который равен 90 ударам будет равна: 60/90 * 4 * 6/8=2 c.

Ритмы,
bps
4/42/43/4
902.6661.3332.000
1002.4001.2001,800
1102.1811.0901,636
1202.0001.0001,500
1301.8460.9231,384
1401.7140.8571,285

Продолжительность звучания тактов размером 4/4 и 2/2 равна. 3/4 и 6/8 также имеют равную длину звучания в секундах. Разница в расстановке музыкальных акцентов. Акцент — это выделение сильных долей путем увеличения их громкости. Это стоит учитывать при анализе звуковых файлов на стеганографические последовательности. Даже если звук для каждого инструмента установлен на уровне 100%. Он все равно будет скакать.

Кроме классики можно выбрать военный марш. Солдатам на параде удобно шагать под ритм от 110 до 130 ударов в минуту. Ритм 120 ударов применяется для синхронного шагания солдат. Траурный марш пишется в режиме медленного шага (90-105 ударов в минуту) и тоже подходит. Но это выглядит неэстетично, неромантично и слишком мизантропично. Для хороших слов мы выберем более веселую мелодию.

Создание стеганографической схемы

Первое что необходимо выбрать это носитель информации. Носителями информации могут быть: смена высоты ноты, смена ритма, смена громкости, смена источника звука при помощи балансировки (слева, или справа). В качестве носителя информации будет использован звуковой градиент.

Для создания стеганографического сообщения в аудио файле было использовано приложение LMMS. Сколько бы аудио дорожек мы в нем не создали, но после сохранения в формат mp3 все они объединятся в одну стереодорожку. В приложении для работы с mp3, эти дорожки можно разделить на две моно дорожки и проанализировать звуковые скачки.

Audacity
Audacity — разделение стерео на две моно доорожки

Верхняя часть стереодорожки выводится на левый динамик, а нижняя на правый динамик. Что это означает? Это означает, что можно применить несколько схем кодирования.

  1. Если оригинал файла известен получателю, тогда можно сравнивать уровень звука на заданном проверочном интервале для оригинального файла и файла со скрытой информацией сразу по двум дорожкам (2 дорожки файле оригинала и 2 дорожки носители сообщения в стеганографическом файле).
  2. Если оригинал файла неизвестен получателю сообщения, тогда одну из дорожек стеганографического файла можно использовать как эталон для измерения разницы громкости, а вторую для сокрытия информации.
  3. Если оригинал файла неизвестен получателю сообщения, тогда можно использовать две дорожки как в пункте 2, но по очереди меняя роль каждой дорожки. Например, в первом такте дорожка 1 показывает истинный уровень звука, во втором такте она будет носителем информации. В первом такте дорожка 2 будет носителем информации, а во втором показывать истинный уровень звука.

Я выбрал первую схему, но она не практична с точки зрения защиты информации. А если существует несколько версий файла и получатель выберет не ту? Тогда наше скрытое сообщение будет неправильно интерпретировано. Поэтому вторая и третья схема более предпочтительны.

Создание звукового градиентного алфавита

Подобно тому как человеческий глаз не может различить все оттенки, так и ухо не способно различить небольшие звуковые скачки. Но не программы для звуковой обработки. Если каждую букву передавать падением громкости звука, тогда это может быть заметно. Особенно если в тексте будет много букв «a» и «z».

Падение на 26% очень заметно. Исходя из этого, можно считывать такты парами по 6 разных состояний на каждый, или использовать параллельно один такт на двух дорожках. Я применил первую схему кодирования, поэтому будем использовать в качестве носителя такты на двух дорожках. В таблице ниже представлен градиентный алфавит.

БукваДорожка 1, %Дорожка 2, %
A9494
B9495
C9496
D9497
E9498
F9499
G9594
H9595
I9596
J9597
K9598
L9599
M9694
N9695
O9696
P9697
Q9698
R9699
S9794
T9795
U9796
V9797
W9798
X9799
Y9894
Z9895

Для двух треков и шести состояний общее количество состояний будет 6^2=36. В алфавите 26 букв и это значит, что таблицу можно продолжить и закодировать ещё 10 символов. Для меньшей заметности часто встречающиеся буквы можно кодировать меньшей разницей. Однако это не спасет от математического анализа и быстрой расшифровки.

Настройка Linux Multimedia Studio

Количество ударов в минуту BPM должно быть одинаковым. В противном случае придется анализировать разные временные интервалы. Это усложнит задачу. Нажмите правую кнопку мыши по индикатору количества ударов (140). Выберите «изменить глобальную автоматизацию композиции». Появится окно как на рисунке ниже. Нам нужен постоянный темп 120 ударов в минуту и отсутствие автоматизации (прямая линия на графике).

Linux Multimedia Studio
Автоматизация дорожек в LMMS

Для того чтобы график был прямой линией сбросьте настройки автоматизации. Ритм 120 ударов и период 4/4 даст 2 секунды на каждый такт. Можете ставить другой интервал, но этот упростит декодирование скрытого сообщения.

Вставляем скрытое сообщение

Треков может быть много, но следует учитывать тот факт что в mp3 файле будет всего одна стереодорожка, или две моно дорожки. Если в вашем LMMS проекте присутствует много треков с разной балансировкой, тогда они накладутся на конечную стереодорожку и декодировать сообщение станет сложно.

Баланс распределяет звучание между динамиками в определенной пропорции. Пропорция 1/1 означает что звук в равной мере распределится между левым и правым динамиками. Пропорция 1/2 будет означать что громкость звука на правом динамике будет в 2 раза больше, чем на левом. Чтобы избежать запутанности, мы будем использовать противоположную балансировку для двух дорожек.

Кроме баланса требуется нормализовать громкость. На обоих дорожках должен быть одинаковый относительный уровень звука. После установки правильного баланса и относительной громкости дорожки, необходимо дважды кликнуть по каждой дорожке выделить все ноты комбинацией клавиш Ctrl+A и тоже установить звучание каждой ноты на уровне 100%. После этого для каждого кодирующего такта уменьшить уровень громкости звука на соответствующее число.

Экспорт mp3 файла и разница между mono, joint stereo, stereo

Выберите файл > экспорт, или нажмите Ctrl+E. Установите формат файла mp3 и нажмите кнопку сохранить. В появившемся окне выберите стерео режим Stereo. В нашем случае можно выбрать режим Joint Stereo, но для большего качества лучше выбрать Stereo. Установим битрейт на уровне 160 КБит/с. Интерполяцию можно не менять.

Моно дорожки могут проигрываться сразу по двум динамикам, но это не сделает файл стерео. В реальной жизни звучание объемное и для улучшения качества восприятия используют stereo, или joint stereo. Stereo mp3 будет иметь размер больший, чем mono mp3.

Так как разница между стерео каналами не велика, то для уменьшения размера конечного файла хранят только разницу. Этот режим создания mp3 называется Joint Stereo. Он не сильно исказит скрытую информацию и дорожку по прежнему можно будет разделить на две mono дорожки.

Анализ временных интервалов

Анализ временных интервалов можно провести в программе Audacity. Мы выбрали первую схему однотактного двухполосного кодирования. Поэтому откроем оригинальный файл и импортируем файл со стеганографическим сообщением. Далее разделим 2 стереодорожки и получим 4 моно дорожки.

Чтоб не путать дорожки определим зеленый цвет для первой дорожки. Далее попарно сравним дорожки двух файлов. Чем точнее будет выбранный интервал, тем точнее разницу мы получим. В LMMS мы указывали относительную громкость в процентах. В оригинальном файле отсутствует информация и уровень звука на всех стерео каналах равен 100%. В Audacity разность получим в децибелах. Она будет находится в пределах указанных ниже. Это особенность формата mp3 и настроек интерполяции.

Состояние, %Разность, Дб
94[0.46;0.54]
95[0.39;0.45]
96[0.31;0.38]
97[0.23;0.30]
98[0.15;0.22]
99[0.08;0.14]
100[0.00;0.07]

Закодированное сообщение: «I LOVE YOU» после декодирования будет выглядеть как в таблице ниже. Пробел имеет одинаковый уровень громкости на двух дорожках, но так как я захватил чуть больший интервал это повлияло на разницу. Смотрите на интервал в который попадает разница.

T1/T295
96
100
100
95
99
96
96
97
97
94
98
100
100
98
94
96
96
97
96
ТекстILOVEYOU
Разность 10.450.000.400.380.260.540.050.150.380.28
Разность 20.340.000.080.370.270.540.010.480.370.35

Видеоинструкция

Выводы

Не нужно скачивать особые стеганографические приложения. Можно воспользоватся существующими программными пакетами. Такими как: Libre Office Calc, Linux Multimedia Studio, Audacity. Вы можете использовать другие приложения, но единственное необходимое требование это знание формата и режимов mp3. В этой статье вы познакомились с режимами: mono, stereo и joint stereo.

Стереодорожки содержат два аудио канала. Это можно и нужно использовать для увеличения эффективности сокрытия данных. Кроме всего, их можно разделить на две монодорожки. Приложение Audacity позволяет назначить каждой дорожке свой цвет. Указанная особенность не позволит спутать дорожку и упростит аудио анализ.

Несмотря на большое разнообразие методов, вы можете придумать и внедрить собственную схему сокрытия информации. Однако стеганография не защищает информацию, а только скрывает. Простая смена порядка букв также не увеличит безопасность. В любом тексте присутствует постоянная составляющая. Математическая статистика позволяет выявить сокрытую информацию даже если вы будете использовать другой порядок букв.

Стеганография в аудиовизуальных образах

Содержание:

Как было сказано в предыдущих статьях, защита информации путем её сокрытия возможна всюду где есть n разных отличимых состояний. Аудиовизуальные образы содержат в себе, картинку или видео и звуковые дорожки. И как вы догадались, могут хранить существенно большее количество полезной информации.

Для примера, файлы изображений хранят блок метаинформации и блок информации. Метаинформация это вспомогательная информация про информацию. Вставлять метаинформацию или нет, зависит от вас. По умолчанию, все приложения вставляют её в конечный файл. Информация — в визуальных образах это описание графических представлений.

Метаинформация может содержать следующие поля: модель камеры, фокусное расстояние, название приложения которым она обрабатывалась, информация об авторстве, электронно-цифровые подписи, контрольные суммы и другие вещи. Если вы когда-нибудь монтировали ролики для YouTube и пользовались библиотекой royalty free аудиозаписей, вы могли заметить что метаинформационное поле «Software:» содержит значение «Google».

Создание и воспроизведение аудиовизуальных образов

Изображение и видео

Информация в простых несжатых изображениях это положение пикселя и его цвет. Цвет пикселя можно описать тремя байтами для красного, зеленого и синего компонентов (RGB), или четырьмя байтами для указания прозрачности (RGBA). Положение пикселей описывается массивом целых чисел.

Некоторые иллюстрации содержат повторяющиеся цвета, что приводит к избыточности информации. Нет смысла выделять три байта, если в изображении очень мало разных цветов и оттенков. Чтобы не тратить 3 байта на каждый пиксель в большинстве современных форматов используют палитры цветов и оттенков. Тогда цвет пикселя можно описать одним байтом. Этот байт будет указывать индекс цвета в палитре.

Для ещё большей экономии, используют сжатие. Вы можете описать состояние каждого пикселя, но это не имеет смысла. Легче просто сказать: «красный круг с радиусом R и центром [x1;y1]». Подобным образом работают алгоритмы сжатия данных. Несжатые данные анализируются на предмет повторяющихся функциональных закономерностей. Для сжатия изображений прекрасно подходят ряды Фурье. В результате, вы экономите пространство для хранения данных.

Для хранения видео применяют контейнера: webm, avi, mpeg-2, vob, matroska, или mp4. Для кодирования и декодирования информации применяют кодеки H.264, H.265, VP8, VP9 и так далее.

Видеокодек H.264: эксплуатация и тюнинг

Для хранения и обработки видео в современных форматах применяется аддитивное кодирования. При смене уровня освещения и угла поворота камеры меняются все цвета в следующем кадре, но большая часть относительно статичных объектов не меняется. Для устранения избыточности информации в видео придумали кодеки.

Одним из самых популярных кодеков сейчас является H.264. Для этих целей кодек H.264 использует несколько типов кадров:

  1. Ключевой кадр (I-FRM) — сжимается независимо;
  2. Предиктивный разностный кадр (P-FRM) — хранит только разницу между текущим и ключевым кадром;
  3. Двунаправленный предиктивный разностный кадр (B-FRM) — также хранит разницу между кадрами но в двух направлениях.

Skype использует кодек H.264 для кодирования видео. В данном кодеке есть параметр тюнинг. Он определяет сложность кодирования. Чем сложнее процесс кодирования, тем больше это требует аппаратных ресурсов. Самый быстрый параметр «fastdecode». Когда скорость передачи видеопотоков падает, тогда происходит их перенастройка и пропуск кадров. Большинство популярных приложений и видеохостингов используют искусственный интеллект для оптимизации кодирования видео.

H.264
Редактирование видео в Avidemux

Во время подготовки и монтажа видео мной использовано MP4 видео мультиплексор. Я хотел удалить часть видео и получил предупреждение на рисунке выше. Дело в том, что начальный кадр A и конечный кадр B промежутка AB это двунаправленные предиктивные кадры (B-FRM). Если я удалю промежуток AB и сохраню такой файл, тогда видео можно будет просмотреть, но оно не будет правильно интерпретировано декодером. Вы увидите искажения. Если A и B ключевые кадры (I-FRM) и я удалю кадры между ними, тогда искажений не будет.

Кодирование визуальных образов и проблемы стеганографии

Чем больше информационная избыточность визуальных образов, тем больше возможных скрытых последовательностей данных можно вложить в них. Сжатие частично устраняет избыточность информации и усложняет стеганографический процесс. Записать скрытое сообщение в изображение и видео возможно, но следует брать во внимание особенности форматов.

Впрочем, даже учитывая перечисленные особенности можно столкнутся с трудностями. После загрузки видео со скрытым содержанием на YouTube оно будет перекодировано при помощи кодека H.264. Рекомендации Google касательно формата заливаемого видео https://support.google.com/youtube/answer/1722171.

Рекомендации желательно выполнять. Стеганографическое сообщение можно залить на YouTube, но будьте внимательны, они периодически меняют алгоритмы на своих серверах. Иногда это приводит к смещению цвета и смене гаммы. Через некоторое время ваше скрытое сообщение может потеряться. Последний известный мне случай, случился в ноябре 2018 года. Они обновили свои алгоритмы и цвета съехали.

Какие кодеки применяет YouTube?

На сегодняшний день, они применяют адаптивные алгоритмы. Что это значит? Это значит, что выбор кодека зависит от популярности и размера вашего видео, количества ваших подписчиков.

После того как вы залили видео на YouTube, алгоритмы проверяют его на соответствие рекомендациям в предыдущем пункте. Если вы залили видео в формате и кодировке не входящих в список рекомендаций, тогда YouTube преобразует видео применив кодировку H.264. Что касается контейнера, то для устройств с разрешением ниже 720p, YouTube будет вещать видео в контейнере flv, а для 720p и выше в контейнере mp4.

Указанные выше трудности усложняют стеганографический процесс, но не делают его невозможным. Ниже будут представлены методы не зависящие от кодеков. Смотрите общие стеганографические методы.

Как перекодировать видео из одного формата в другой в Windows, MacOS и Linux?

Существует кроссплатформенная утилита ffmpeg. Она позволяет конвертировать видео из одного формата кодирования в другой. Можете поэкспериментировать с параметрами и посмотреть на результат.

Если видео (input.mkv) использует контейнер Matroska и кодировщик H.264, тогда для перекодирования в кодек VP8 зайдите в каталог с приложением, откройте командную строку и введите следующее: ffmpeg -i input.mkv -c:v vp8 output.mp4. Файл output.mp4 перекодирован кодеком vp8 [1].

Аудио дорожки

С математической точки зрения, звук это непрерывная (аналоговая) функция. Но в цифровой технике его хранят только в дискретной форме. То есть значения непрерывной функции снимают через целочисленные интервалы времени и получают дискретную функцию. Частота снятия звуковых характеристик звукозаписывающим оборудованием называется частотой дискретизации. Чем меньше частота дискретизации тем больше потерь. Минимальная допустимая частота дискретизации 8 килогерц. Ниже этого порога человеческий голос нельзя будет разобрать.

Для преобразования аналогового сигнала в дискретный применяют аналогово-цифровой преобразователь (АЦП). Тем кому данная тема очень интересна, я рекомендую почитать книги про основы теории информации и кодирования [2].

В одном видео могут быть несколько дорожек. Дорожки могут быть моно и стерео. Каждая дорожка имеет собственный уровень звука и балансировку. Балансом звуковоспроизведения называется пропорциональное разделение звука между левым и правым динамиками. Баланс который равен 100% означает что звук равномерно распределяется (отношение 1/1).

Разрушение мифов про качество звука

Некоторые ошибочно полагают, что купив усилитель звука они получат качественный звук. Усилитель только усилит звук и внесет новую погрешность в звуковой тракт. Если вы хотите выбрать качественный усилитель, тогда смотрите на его диапазон операционных частот. Чем он шире, тем лучше. Каждый усилитель имеет свою погрешность искажающую звук. Для каждой из частот эта погрешность разная.

На самом деле, качество звука зависит от многих факторов. Если звукозаписывающее оборудование имеет АЦП с частотой дискретизации 20 килогерц, тогда вы легко сможете уменьшить качество дискретизации для записанного звука при помощи программ. Но если вы захотите, увеличить качество до 44 килогерц, тогда вам придется купить новое звукозаписывающее оборудование. Но даже это не защищает от всех помех. Температура также незначительно влияет на частоту дискретизации.

Качество звука зависит от выбранной среды передачи. В звуковом тракте это играет огромную роль. Электромагнитное излучение создает помехи. Самая низкая помехоустойчивость у беспроводной передачи. Оптическая среда передачи защищена от помех такого рода лучше других.

искажение формы синусоиды
Дискретизация (квантование) сигнала

Квантование сигнала также вносит дополнительные искажения. На рисунке выше, показано как исказится форма синусоидального сигнала после дискретизации на АЦП. Такие искажения называются шумом квантования.

Стеганографические методы подсвечивания информации

Производители музыкального оборудования Yamaha создали приложение Vocaloid имитирующее людской голос. С точки зрения стеганографии, широкий выбор голосов может использоваться в методе подсвечивания. Однако, смена акцентов может испортить эстетическое удовольствие от прослушивания музыки.

Хотя, если использовать хор вокалоидов в mp3 файле со многими дорожками, тогда смену акцента можно скрыть. Секретную информацию, таким образом, можно будет извлечь после обработки звуковых дорожек в редакторе: 1) дорожки без стеганографического содержания заглушить; 2) увеличить звук стеганографической дорожки и извлечь слова [3].

Результат применения вокалоидов для стеганографического сокрытия секретной информации, иногда превосходит все ожидания. Энергичная музыка на фоне также может отвлечь внимание слушателя к смене акцента слов. Тон произношения и скорость тоже могут нести дополнительную смысловую нагрузку.

Метод метронома

Метод метронома прекрасно подходит для подсвечивания слов в открытом тексте. Если у вас очень хороший музыкальный слух и чувство ритма и времени, тогда этот метод вам понравится. Суть метода состоит в применении пауз разной длинны.

Так пауза равная одной четверти указывает что скрытого слова нет, а пауза равная двум четвертям что следующее слово входит в секретное сообщение. Это очень заметно, особенно если выбрать ритм равный 100 ударов в минуту. Выбирать значения ритма следует из промежутка 120-135 ударов в минуту.

Общие методы

Одним из общих стеганографических методов является метод LSB. LSB — это английская аббревиатура которая означает «наименьший значащий бит» (Least Significant Bit). Суть LSB-методов состоит в смене последних значащих бит в каждом байте информации.

Метод шаговых градиентов является частью LSB-методов применяемых к визуальным образам. Шаг градиента выбирают небольшой. Таким образом, трудно будет отличить смену цвета объекта.

step gradient method
Фруктовый алфавит

Приложения уменьшающие размер файла могут убирать из палитры цветов неразличимые оттенки. Все цветовые индексы сместятся и сокрытое значение потеряется. Если в Adobe Photoshop выбрать «сохранить рисунок для веб», тогда вы потеряете скрытое сообщение.

Для видео я рекомендую использовать lossless опции (без потерь) для кодеков. Если вы решили залить видео со скрытым содержимым на видеохостинг, тогда лучше использовать Vimeo. Этот видеохостинг предоставляет несколько тарифных планов. Начиная с Pro подписки (20$ в месяц) вы получаете возможность устанавливать необходимые цвета. Они не будут смещаться.

Стеганография и YouTube

YouTube перекодирует ваше видео и цвета сместятся. Во избежание этого используйте следующий алгоритм действий:

  1. Увеличьте шаг градиента и проверьте цвета на соответствие;
  2. Если цвета сместились и не соответствуют первоначальным повторите пункт 1.

Если буква «A» представлена цветным RGB вектором [255,102,0], тогда буква «B» будет представлена не так как на рисунке выше, а вектором [255,100,0]. В этом случае шаг зеленого компонента вектора равен двум.

Стоит учитывать и то, что у разных людей разное восприятие цветов и разные мониторы. Чем лучше матрица вашего экрана, тем больше оттенков вы сможете различить визуально. Большой шаг увеличит различие между оттенками.

Аналогичный совет вы можете применить для аудио файлов. В аудио можно использовать звуковой градиент для различения скрытого смысла. Также можно использовать смену баланса звукового вывода на дорожках. Смену инструментов и так далее.

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

Самый действенный способ для коротких сообщений — это использование динамических объектов, или динамического замещения объектов. Этот способ позволяет скрыть короткие слова или текстовые матрицы при помощи коротких визуально отличимых состояний. Суть состоит в том, что объекты последовательно выстраиваются в ассоциативную связь и могут быть интерпретированы.

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

Выводы

Сокрытие информации в аудио и видео файлах эффективнее, чем в текстовых данных. Однако, оно на порядок сложнее и требует навыков работы со звуком и видео. При постобработке аудио и видео материалов разными приложениями часть скрытой информации может быть потеряна. Во избежание этого предложено использовать градиенты с большим шагом.

Как альтернативу предложено использовать методы динамического замещения объектов. Основное преимущество данного способа в том, что он не всем понятен. Ассоциативную связь может выстроить человек с определенным набором знаний, увлечений и так далее. Основной недостаток состоит в возможной неправильной интерпретации.

Источники информации:

  1. RFC 6386.
  2. И.В. Кузьмин, В.А. Кедрус. «Основы теории информации и кодирования»
  3. https://www.vocaloid.com/en/learn/

Стеганографические таблицы и создание шарад

Содержание:

Знаете ли вы, что таблица символов Unicode содержит большое количество букв которые похожи на кириллические, греческие, латинские? Более того, в расширенную кириллицу внесены некоторые латинские буквы. Все эти буквы имеют разные числовые коды. Это позволяет скрыть в тексте стеганографические сообщения.

Здесь и далее будут приведены вспомогательные таблицы и некоторые другие данные позволяющие эффективно реализовать стеганографическое сокрытие информации.

Основные европейские языки

Алфавиты большинства европейских стран построены латинскими, греческими и кириллическими символами. Ниже приведена таблица символов для латинского, кириллического, международного фонетического алфавита (МФА) и греческого.

Латиница
Кириллица
МФАГреческий
ЛисуППФ
A,aА,аɑΑ,αA,a
B,b,ƄВ,в,Ь,ьʙ,ɓΒ,ϸ,βB,b
C,Ⅽ,ⅽ,cС,сʗ,ɕϹ,ϲC,c
D,Ⅾ,Ɗ,dԀ,ԁɖ,ɗꓓ,ꓒD,d
E,eЕ,еɐΕ,ΈE,e
F,fϜF,f
G,gԌɢ,ɡG,g
H,hН,Ң,һʜ,ɦΗH,h
I,Ⅰ,i,ⅰІ,іɪ,ɨΙ,Ί,ίI,i
J,jɟ,ʝͿ,ϳJ,j
K,k,ĸК,Ԟ,Ҡ,Ҝ,к,ԟΚ,κK,k
L,Ⅼ,lʟ,ɩ,ɭL,l
M,Ⅿ,m,ⅿМ,мʍ,ɱ Μ,ϺM,m
N,nɴ,ɲ,ɳΝ,ηN,n
O,oО,оʘΟ,οO,o
P,pР,рΡ,Ϸ,ρP,p
Q,qԚ,ԛʠϘ,ϥ,ϥQ,q
R,Ɍ,Ʀ,rГ,Ґ,г,ґʀΓR,r
S,sЅ,ѕS,s
T,tТ,тʈΤ,Ͳ,ͳ,ϯT,t
U,uЏ,џU,u
V,Ⅴ,vѴ,ѵʋγ,νV,v
W,wԜ,ԝW,w
X,x,ⅹХ,хΧ,χX,x
Y,yУ,Ү,ү,уΥ,γY,y
Z,zʐ,ʑΖZ,z
ƃБ,б ɓ
Д,д
ëЁ,ё
Ж,ж,Җ,җ
З,з,Ӡ,ӡɜ,ʒ,ʓ
И,иͶ,ͷ
Є,єϵ
ïЇ,їΪ,ϊ
Й,й,ӣ,ҋ
ɅЛ,л,Ԓ,ԓʌΛ,
П,п,Ԥ,ԥΠ,π
Ў,ў,Ӯ,ӯ
ȹФ,фɸΦ,ϕ
Ц,ц
Ч,чʮ,ɥ,
ƜШ,шɯ
Щ,щɰ
Ъ,ъ
Ы,ы
Э,э϶
Ю,ю
Я,я
  • МФА — международный фонетический алфавит
  • Лису — алфавит Фрэйзера
  • ППФ — полуширинные и полноширинные формы

Разные шрифты, могут отличатся формой букв. Впрочем, сейчас имеется тенденция к упрощению формы букв во многих языках мира. Выбирайте простые шрифты без закорючек: Serif, Times New Roman, Arial. Идеальным выбором будет моноширинные шрифты: Ubuntu mono, Monospaced и другие.

Пример стеганографического сообщения

Ниже приведен стих, который выбран не случайно. Обратите внимание на третий рядок. Все строки начинаются одинаково, а третья строка немного длиннее. Кроме того, во второй строчке неслучайная опечатка, присмотритесь внимательней. И буква «о» в слове «out» шире. Если бы строки не начинались одинаково, этого трудно было бы заметить. К тому же, многие считают поэзию скучным и унылым увлечением одиноких людей. Большая часть молодых людей прокрутила бы эту страницу до самого низа и ничего бы не заметила. Похоже, что я среди них всего лишь исключение.

І have been one acquainted with the night.
l have walked оut in rain — and back in rain.
I haѵе outwalked the furthest citу light.
I have lоoked down the saddest city lane.
I have passed by the watchman on his beat
And dropped my eyes, џnwilling to explain.

Роберт Фрост, известный американский поэт
стеганографическое сообщение
Любой шестнадцатиричный редактор покажет секрет

Просто скопируйте и сохраните этот стих в текстовый файл (в кодировку utf-8). Откройте шестнадцатиричный редактор и посмотрите на коды символов. Да, это оно! Наше предположение оказалось верным. Секретное сообщение здесь закодировано методом подсвечивания. Содержимое секретного сообщения: «I love you». А теперь, позвольте мне вставить свой собственный стих:

Есть слова, что нет смысла скрывать
Их достаточно просто сказать,
И один на один с собой
Не коверкать рядков тяжких строй

Ведь слова не приходят одни
Они разных эмоций полны
И в печатных словах не видны
Жизнью скрыты, так часто они

Невозможно их всех угадать
Продолжая все дальше читать
Их достаточно просто сказать
Их достаточно просто забыть

Разминутся и дальше плыть
Волны пеной морской облекут
Тяжесть сказанных слов уберут
Те слова, никогда не найдут…

В моем стихе стеганографического сообщения и скрытых интерпретаций нет. Конечно, мне будет приятно что вы нашли время его прочитать. Но это просто красивые слова человека, который пропустил одну остановку в общественном транспорте желая доставить эстетическое удовольствие своим читателям.

Cube Mixer screenshot
Cube Mixer

Источником моего вдохновения стало приложение «Cube Mixer». Оно помогло мне найти рифму для перевода этого стиха на английский язык. Если вы хотите выразить себя, если вам нужно найти слова для ваших близких, если вам нечего делать, тогда воспользуйтесь шансом подаренным вам судьбой. Установить приложение Cube Mixer с Google Play.

Увеличение эффективности хранения информации

Этот способ более изощренный чем предыдущий. Методы подсвечивания для европейских языков имеют небольшую эффективность. В недавней статье мы показали что данная группа методов эффективна только для китайского. Основным недостатком данных методов является необходимость знания языка в котором будет сокрыто сообщение. То есть, если текст который несет стеганографическое сообщения на английском, тогда и стеганографическое сообщение должно быть на английском.

Если одну букву можно написать похожими символами, но имеющими разное числовое значение, тогда количество этих символов будет определять скрытую полезную нагрузку. Существует 14 разных способов написания буквы «K». Если вы применяете 14 разных способов написания, тогда общее количество состояний для двух символов «K» будет достаточно для представления 14^2=196 символов. Знаете что это означает? Это означает, что двумя позициями содержащими все возможные символы похожие на «K» можно закодировать алфавиты нескольких языков!

Если не различать большие и маленькие буквы, тогда в число возможных языков мы можем включить:

  • Австрийский, Английский, Датский, Венгерский, Испанский, Латвийский, Литовский, Молдавский, Немецкий, Румынский, Польский, Португальский, Финский, Французский, Эстонский — около 50 латинских символов;
  • Абхазский, Азербайджанский, Белорусский, Болгарский, Боснийский, Казахский, Киргизский, Македонский, Монгольский, Русский, Сербский, Туркменский, Узбекский, Украинский — около 50 кириллических символов;
  • Арабский, Хауса, Фарси, Уйгурский, Урду — около 50 символов;
  • Идиш, Иврит — 22 буквы.

Все перечисленные языки имеют похожие алфавиты. Китайский язык также можно выразить через пиньинь латинскими буквами. В число перечисленных языков входит шесть основных языков ООН: английский, арабский, испанский, китайский, русский, французский. На этих языках общается большая часть жителей земли.

Символы диакритики

Вы можете сказать: «Не все латинские буквы буквы имеют аналоги в кириллице и наоборот». Да, конечно. Существуют ещё специальные символы диакритики. Таким образом русскую букву «ё» можно представить как латинскую букву «e» с двойным диэрезисом. Белорусскую букву «ў», представит как латинскую «y» с макроном «ӯ». Вы можете создать свою схему для увеличения полезной нагрузки. Существует огромное количество возможных вариантов представления букв и их невозможно перечислить. Все ограничивается только вашей фантазией.

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

Если к каждому возможному символу похожему на букву «К» добавить символы диакритики, тогда общее количество возможных скрытых состояний двух букв существенно увеличится: (14+50)^2=4096. Если каждое из этих состояний интерпретировать отдельно, тогда можно представить индексы 4096 слов в словаре. Более того таким образом можно представить каждую инструкцию процессоров Intel и AMD. В одном стихотворении Пушкина «Евгений Онегин», можно передать скрытую в виде процессорных инструкций программу «hello world».

Один из первых успешных серийных процессоров от Intel (8086) имел около 100 документированных инструкций и некоторое количество недокументированных инструкций. Машинная команда (опкод, операционный код) может иметь следующие размеры: 1 байт, 2 байта, 3 байта. Среди всех возможных машинных инструкций 8086-го в обычной программе можно было встретить от 20 до 35 инструкций разного вида. Представьте, что каждую из инструкций процессора мы можем передать в виде двух печатных символов с диакритикой. Это будет более удобно, чем кодировка Base64 которой мы представили бинарную информацию (смотреть статью Представление информации: язык программирования Python и кодировки).

Полуширинные и полноширинные формы символов

Все китайские иероглифы полноширинные. Если применять пробелы, тогда текст сдвигается. Символ пробела занимает не полную ширину места для знака. Иногда требуется вставить слово на другом языке, тогда пробелы применяются и текст сдвигается. Чтобы сохранить эстетическую красоту китайцы используют полноширинный вариант латинских символов (ППФ).

Каждая буква и цифра в ППФ центрирована. Это немного растягивает предложение. Так предложение «I love you!» представленное символами ППФ будет иметь вид: «I love you!». Я не ставил пробелы и не менял шрифт.

Как применить указанную особенность?

Whatabig cat? Iwanna pet it!

В данном тексте содержится стеганографическое сообщение. Посмотрите внимательно на все буквы «a». Два символа ППФ написаны без пробелов. В предложении «Какой большой кот? Я хочу его погладить!» скрыта аббревиатура AI (англ. artificial intelligence — искусственный интеллект). Самое интересное в этом то, что текстовый процессор Libre Office показывает, что в этом предложении 8 слов. Мы не ставили пробелы рядом с артиклем «a». С точки зрения посимвольной обработки первые три слова написаны слитно. Проверить это очень просто, кликните два раза по слову и оно выделится все.

Цифры и знаки

Если вы думаете что цифры нельзя заменить на похожие символы, тогда вы очень ошибаетесь. Что касается цифр, то их можно представить следующим образом:

Представление
00 (ППФ);
߀ (НКО, языки манде);
Օ (армянское «O», в некоторых шрифтах рисуется как 0);
11,イ,l (ППФ);
⌉ (разнообразные технические символы);
22 (ППФ);
33(ППФ);
Ʒ (МФА, буква «ezh»);
З,з (кириллические буквы «Ze»);
ℨ (готические буквоподобные символы);
44(ППФ);
կ, Կ (армянские буквы «Ken»);
ⴗ (грузинская буква «Qar»);
55(ППФ);
Ƽ, ƽ, (расширенная латиница);
ⴝ (грузинская буква «Char»);
66(ППФ);
77(ППФ);
ל (иврит буква «Lamed»);
88(ППФ);
Ց (армянская буква «Tso»);
99(ППФ);
ց (армянская буква «Sо»);

Недостатком данного метода является то, что не все шрифты содержат графическое представления для таких знаков. Что касается знаков препинания, они также имеют похожие символы. В качестве примера, возьмите символы ППФ.

Искусственный интеллект и подбор шрифтов для стеганографии

Шрифтов существует огромное количество. Более того, существует огромное количество стилей написания букв. Невозможно просмотреть тысячи символов Unicode. Как выбрать самый удобный для стеганографических целей шрифт? Для этого можно применить возможности нейронных сетей.

Вы можете создать свою архитектуру нейронных сетей. Но я вас предупреждаю, тренировка и тестирование занимает огромное количество времени. Небольшой набор обучающих данных может не позволить получить результат который мы хотим получить. Лучше применять готовую архитектуру и готовый набор образцов для обучения такой как: базу данных рукописных образцов MNIST, или что-то подобное.

Примерный алгоритм действий после тренировки и тестирования нейронной сети:

  1. Создать скрипт который по очереди выводил все символы шрифта;
  2. Получить скриншоты с экрана;
  3. Подать на входы нейронной сети нормализованное изображения;
  4. Получить результат (вектора меры подобия образцов для классификации).

Шарады, буллинг и известные люди

Вам нравится разгадывать шарады? Мне тоже. Вы знаете что в Индии, в штате Пенджаб, есть свой пенджабский язык. Этот язык раньше использовал сложную систему письменности которая называлась «Шарада». Первый сикхский гуру Нанак упростил пенджабский и создал современную систему письменности Гурмукхи. Эта система письменности заменила Шараду. Слово «шарада» до сих пор используется как синоним для слова загадка.

Индусы создали шахматы. Индусы много чего разработали и придумали. Они занимают ключевые должности во многих известных мировых корпорациях и странах. Например, глава корпорации Google Пичаи Сундарараджан, министр обороны Канады Харджит Сингх Саджан. Последний получил орден за военные заслуги. Почему все они такие умные? Возможно, в детстве все известные индусы разгадывали шарады и играли в шахматы.

В Индии, 22 разных официальных государственных языка. Представляете, как тяжело местным чиновникам. Конечно, в индийских школах все изучают хинди. Но жизнь вынуждает знать хотя-бы несколько государственных языков. Ниже приведен список наиболее распространенных языков Индии, среди миллионов людей:

государственные языки Индии
Разнообразие языков полуострова Индостан
1. Хинди — 551.4
2. Английский — 125.3
3. Бенгальский — 91.1
4. Телугу — 84.9
5. Маратхи — 84.1
6. Тамильский — 66.7
7. Урду — 59.1
8. Каннада (дравидийский) — 50.7
9. Гуджарати — 50.2
10. Ория, или Одия — 36.6
11. Малаялам — 33.7

Согласно другой гипотезе, буллинг в детстве вынуждает людей становится хитрее и умные других. Если люди не останавливаются и продолжают жить не обращая на это внимание, тогда они становится лучше других и получают преимущество. Почитайте биографию Илона Маска, почитайте биографию Сергея Брина. Не знаю нравятся ли им шарады, но в логотипе компании Tesla спрятан кошачий нос. Люди получившие преимущество наслаждаются своей уникальностью и создают такие же уникальные вещи достойные похвалы.

Выводы

Языки общения, также как и языки программирования, являются инструментами. Умные и находчивые люди могут использовать их для получения преимущества. Стеганография это лишь одно из них. Уникальность и разнообразие людей дает нам новые символы. Иногда, люди становятся символами эпохи. У нашей эпохи много символов и создаем их мы прямо или косвенно.

Не останавливайтесь, находите время для личного развития и приносите людям пользу, вдохновляя других поступать также. И мир станет лучше, мир станет совершеннее! Оставайтесь с нами, читайте наши статьи, узнавайте новое.

Представление информации: язык программирования Python и кодировки

После прочтения данной статьи, вы узнаете почему буквы во многих языках мира занимают два байта памяти, а английские буквы занимают только один байт памяти и многое другое. Я надеюсь эта статья будет интересной для вас.

Содержание:

Как было сказано в предыдущих статьях, любое различимое состояние можно использовать для кодирования информации. В электронных приборах таких состояний всего 2: «включено», «выключено». В английском алфавите 26 букв, а это значит, что достаточно 5 бит для представления каждой буквы. Общее количество состояний которые могут быть интерпретированы 2^5=32. Если учитывать большие и малые буквы, тогда для 52 символов требуется 6 бит.

Однако, кроме основных печатных символов существуют ещё и управляющие символы. Каждый раз когда вы нажимаете клавишу энтер при печати текста, вы вставляете невидимый управляющий символ конца строки. В операционных системах Windows конец строки обозначается двумя символами. Ребята из Microsoft любят отнимать место на вашем жестком диске. Это конечно шутка, просто старые принтеры требовали присутствия символа возврат печатающей каретки.

Большие буквы английского алфавита
Представление больших букв в кодировке ASCII

Семи лампочек достаточно для того чтобы закодировать английскую букву и некоторые другие дополнительные символы которые не имеют графического представления. Вместо лампочек для кодирования информации можно использовать все что угодно. Для представления информации можно применять какой-либо физический процесс из n состояний. Компьютер построен преимущественно из полупроводниковых элементов и поэтому состояний всего два. Один бит — 2^1 состояния, один байт (8 бит) — 2^8=256 состояний, два байта — 2^16=65536 состояний.

английский алфавит
Представление малых букв в кодировке ASCII

Впрочем, даже если вы применяете кодировку ASCII для представления символов, хранение одного символа требует 8 бит. Это объясняется размерами регистров центрального процессора, ведь так удобнее обрабатывать информацию. Если вам понравились анимированные иллюстрации и вы хотите распечатать плакат для компьютерного класса, тогда можете скачать его с сайта openclipart (poster1, poster2).

Восьмой бит в символах ASCII использован для представления символов других алфавитов и элементов псевдографики: черточки, угольники, кружочки и так далее. В операционных системах Windows подобные кодировки называются следующим образом: Windows-XXXX. Вместо символов XXXX употребляется номер закрепленный за каким-то из национальных алфавитов, или его вариаций. Кодировка Windows-1251 представляет символы русского алфавита. В операционных системах Linux эта кодировка называется CP-1251. CP — это английская аббревиатура «code page» (страница кодировки). Символы рассмотренных кодировок имеют размер 1 байт.

Недостатки и преимущества однобайтовых кодировок

Кодировка — это таблица интерпретации состояний. Поскольку восьмой бит использован, то для представления символов других алфавитов осталось 7-бит. Следовательно, возможно представить 2^7=128 символов, букв и знаков. Представьте, что вы живете в Камбодже и в вашем алфавите 74 буквы. Кроме них, присутствуют ещё и другие символы и знаки которые также надо представить. Совершенно ясно что одного байта не хватит.

Некоторые страны такие как Чехия, Словакия, Венгрия, Польша, Румыния используют кодировку Window-1250 для однобайтовых символов. Если русскоязычный пользователь захочет посмотреть румынский сайт который применяет данную кодировку для представления символов, тогда он увидит на экране бессмыслицу не содержащую румынских символов. Скорее всего данная бессмыслица будет интерпретирована браузером, как кодировка Windows-1251.

Кодировок можно создать очень много, но очень важно чтобы те кто будет читать написанный текст могли это интерпретировать. Для поддержки однобайтовых кодировок, в современных браузерах есть возможность их ручного выбора. Но это очень неудобно и занимает много времени. Современные люди не привыкли тратить время на подобные операции.

И тем не менее, их все ещё применяют. Так средство управления базами данных СУБД IBM DB2 позволяет определить однобайтовые кодировки для текстовых полей (Windows-1251, Windows-1250 и другие). Другие СУБД также позволяют сделать подобные вещи. Основное преимущество однобайтовых кодировок это размер одного символа. Это позволяет эффективно распоряжаться местом для хранения информации, особенно когда текстовых данных очень много. Однако, это не применяется в сфере управления государственными объектами. Не секрет, что все страны обмениваются информацией между собой. Есть специальные комиссии при ООН которые отвечают за сбор статистической информации. Например, комиссия по торговле — UN Comtrade.

Кроме всего вышесказанного, существуют Open Data проекты для реализации прозрачного управления государством. Смысл данных проектов в том, что каждый гражданин может видеть как происходит принятие решений каждым конкретным чиновником и если его не устраивает управленческие решения, отстранить его от управления. Согласно требованиям ISO и ICAO компьютерные сети и системы которые реализуют решение задач подобного рода должны хранить информацию в кодировке Unicode.

Unicode и его преимущества

Для того чтобы не переключатся между кодовыми страницами был придуман стандарт Unicode. Unicode консорциум отвечает за его развитие. Самым популярным, сейчас является способ представления символов Unicode — UTF-8. Для эффективного хранения данных он использует разный размер для символов и букв: 1 байт, 2 байта, 3 байта и 4 байта. Этот стандарт совместим со стандартом ASСII. Первые 128 символов это английские буквы, цифры, пунктуационные символы и управляющие знаки которые мы рассмотрели в самом начале. Каждая буква в русском, белорусском, польском и многих других языках имеет размер два байта. Это значит что для 4096 символов английского алфавита англичанин потратит 4 Кб, а жители других стран потратят 8 Кб памяти. Не обижайтесь, просто продолжайте жить дальше.

Двух байтов памяти достаточно, чтобы представить 65536 разных символов. Во множество таких символов включены алфавиты большинства языков мира и специфические знаки такие как: армянский знак вечности аревахач, стрелочки, математические символы и так далее. Редкие и не часто употребляемые символы имеют размер 3 байта. Во множество таких символов входит: значок «№», редкие китайские иероглифы, славянский астериск, кириллическая многоглазая буква «о (ꙮ)», и символы древнего славянского языка. Эмоджы, руны и дополнительные знаки имеют размер 4 байта. А вот это уже очень печально. Хранение текста состоящего из 4096 рун потребует наличия 16 Кб, это в 4 раза больше чем для английского текста!!!

Как компьютер интерпретирует символы Unicode?

Как браузер и другие приложения знают сколько байт занимает символ? Приложения обрабатывает символы байт за байтом. Если первый байт имеет числовое значение больше 192 (то есть, если два значащие биты слева в первом байте равны 1), тогда символ представляется двумя байтами и два значащих бита во втором байте равны 10. Если в значащих битах три единицы, тогда символ состоит из трех байт. Таблица описывающая принцип интерпретации Unicode представлена ниже.

Количество
байт
Шаблон
10XXXXXXX
211XXXXXX 10XXXXXX
3111XXXXX 10XXXXXX 10XXXXXX
41111XXXX 10XXXXXX 10XXXXXX 10XXXXXX

Вместо буквы «X» можно ставить 1, или 0. В самом начале, стандарт Unicode позволял использовать символы размером 6 байт (6 двоичных октетов)[1].

В 2003 году ситуация изменилась и для пользовательских нужд разрешают использовать только 4 октета. Этого вполне достаточно для всех мировых языков и даже для пиктограмм и символов Эмоджи. Возможно, в далеком будущем количество Эмоджи увеличится и у каждого человека будет свои собственные символы Эмоджи, тогда 6 октетов будут очень кстати [2].

Недостатки Unicode и алгоритм быстрого поиска

Чем больше байт информации, тем сложнее и медленнее происходит поиск. Члены сообществ по разработке стандартов RFC продумали все возможные трудности и нашли эффективное решение. Алгоритм Бойера-Мура (эвристика плохих символов) позволяет быстро находить текстовую информацию выраженную через символы Unicode. Именно этот алгоритм применяет ваш браузер при нажатии Ctrl+F. В научные интересы Бойера-Мура входило исследование и построение конечных цифровых автоматов.

Пусть длинна текста в котором осуществляется поиск равна N, а длинна шаблона для поиска равна M. Фаза предварительных вычислений займет O(M^2 + σ) операций, где σ — размер алфавита. Тогда в самом лучшем случае выполнение алгоритма займет O(N/M) сравнений. В самом худшем случае, когда текст состоит из одинаковых символов, например 100 букв «С», в которых осуществляется поиск 5 букв «С», тогда работа алгоритма займет O(N*M) сравнений.

В отношении безопасности, очень важно избегать ошибок переполнения буфера. В 2001 году были случаи использования запрещенных последовательностей октетов и неправильные парсеры привели к серьезным проблемам в безопасности. Поэтому при написании своего обработчика символов Unicode обратите внимание на стандарт RFC [RFC 3629, пункт 10].

Язык программирования и кодировки

Некоторые люди помнят, какой проблемной была интерпретация символов Unicode в древних языках программирования. Более того, существовало огромное количество таких же древних программ, которые не поддерживали данную кодировку. Если вместо букв вы видите квадратики, то это может означать следующее:

  1. Отсутствует поддержка Unicode;
  2. Выбранный шрифт не имеет графического представления для данного символа.

Случаев когда поддержка Unicode отсутствует практически нет. Все языки программирования и современные приложения по умолчанию поддерживают такую кодировку. Но не все шрифты имеют графическое представление для пиктограмм и символов Эмоджи. Это следует учитывать при разработке программ для работы с текстовыми данными.

Применение кодировщиков в Python и модуль Encodings

Python это кроссплатформенный язык портированный под Windows, Macos, Android. В большинстве дистрибутивов Linux он установлен по умолчанию. В ОС Виндовс, запустите Python Idle, чтобы воспользоватся интерпретатором. Также можете установить интегрированную среду разработки Visual Studio Community, или PyCharm, чтобы упростить разработку на данном языке программирования. С точки зрения удобства использования, язык Python занимает первое место. Его используют ученые, сетевые инженеры и просто энтузиасты. Он прост и его можно применять пошагово в режиме интерпретации. Для просмотра справки для модуля Encodings непосредственно из режима интерпретации по очереди введите две строки.

  1. import encodings
  2. help(encodings)

Если вы решили создать собственный кодек, прочитайте также справку по модулю codecs. Импортируйте модуль codecs и также воспользуйтесь методом help(). Можно создать свой собственный кодек и зарегистрировать особый метод для поиска информации. Чтобы просмотреть список всех доступных методов (функций) модуля, введите команду dir(encodings). Будьте внимательны, если вы не ввели директиву «import название_модуля», тогда метод dir возвратит ошибку:

NameError: name ‘encodings’ is not defined

Во многих языках есть функция ord(), которая позволяет узнать код символа в десятичной системе исчисления. Получить коды для множества символов, а не для одного символа, можно используя кодеки. Для шестнадцатиричного представления примените кодек «hex_codec», как на рисунке снизу.

кодеки в python
Применение кодировщиков в Python

Этот кодировщик получил в качестве аргумента строку которая состоит из 5 начальных букв английского алфавита и 5 начальных букв русского алфавита. Узнать длину данной строки можно функцией len(), только значение нужно разделить на 2, поскольку один двоичный октет представляется двумя шестнадцатиричными цифрами (от 0 до ‘f’). Как вы видите, длинна такой строки 15 байт: 5 байтов английских букв и 10 байтов русских букв. Обратите внимание, что первый байт в русских символах «d0» и английская буква «A» отличается числовым значением от русской буквы «А». Метод int() преобразовал шестнадцатиричное значение для английской буквы «A» в десятичное 65. Для конвертации в двоичную систему исчисления примените функцию bin().

5 английских букв (41-45) и 5 русских букв (80-84) в кодировке CP-866

Важное замечание! После копирования текста из приложения которое сохраняет файлы в формате Windows-XXXX (CP-XXXX) в интерпретатор Python, он автоматически конвертирует текст в UTF-8. Если вы хотите узнать коды символов в других кодировках возьмите утилиту hexdump (подойдет любой другой шестнадцатиричный редактор) и откройте файл сохраненный в другой кодировке, например в CP-866, как на рисунке выше.

Кодировщик punycode позволяет передать Unicode посредством ASCII символов. Закодированной строке вы можете придать первоначальный вид применив метод decode(). Для выхода из режима интерпретации наберите функцию quit().

Итеративные и инкрементальные кодеки

Существуют два вида кодировщиков: итеративные кодировщики и инкрементальные кодировщики. Если кодировщик обрабатывает символы длинна которых заранее известна, тогда он называется итеративным. К такому типу кодировщиков относятся кодировщик: ASCII и другие типы кодировщиков основанные на нем, например ROT-13. Пример применения кодировщика ROT-13 показан на рисунке ниже.

итеративный кодек rot-13
Использование кодировщика Rot-13 в Python

Как вы видите, он работает только с ASCII символами и если в качестве аргумента написать русскую букву он выдаст ошибку. Чтобы избавится от ошибки уберите все символы числовой код которых превышает 127. Таким образом, останутся только ASCII символы.

Как было сказано ранее, символы Unicode имеют разную длинну. Следовательно, они не могут быть обработаны итеративными кодировщиками. Для их обработки применяют инкрементальные кодировщики, которые содержат переменную-счетчик. Задача счетчика заключается в подсчете количества признаков, которые определят количество байтов в для каждого символа. В качестве такого признака употребляются значащие биты первого байта Unicode последовательности (смотреть таблицу выше).

С точки зрения безопасности компьютерных систем, инкрементальные кодировщики которые не осуществляют проверку количества символов опасны также как и массивы. Будьте внимательны, придерживайтесь принципов безопасного программирования. Разработка программ это большая ответственность и этим нельзя пренебрегать. Недостаточно просто быть просто кодером, нужно иметь знания и опыт в сфере компьютерной безопасности.

Base64, Big5 и обезьяны на Youtube

Знаете ли вы, что любую программу можно передать в виде текста? Некоторые сайты запрещают загружать исполняемые файлы в формате *.EXE, или бинарные файлы. Некоторые почтовые клиенты, могут не пропускать письма с вложенными исполняемыми файлами. Во избежание этого вы можете преобразовать содержимое исполняемого файла в текст, алфавит которого составляет 64 символа ASCII. Данная кодировка получила название Base64. Размер закодированного таким образом файла будет больше, чем размер оригинального исполняемого файла.

Base64 сообщение
Обезьяны на Youtube

С использованием Base64 связаны некоторые смешные моменты. Если вы пользуетесь Youtube, тогда вы могли видеть ошибку изображенную на рисунке выше. Как вы видите, это очень похоже на кодировку Base64, но отсутствует символ слеша и плюс. Кодировка Base64 существует в нескольких вариантах. На рисунке выше, изображена «urlsafe Base64» кодировка. Символы 62 и 63 («+» и «/») изменены на «-» и «_». После применения кодека Base64, вы можете получить зашифрованное содержимое стэка вашего браузера. Смешная обезьянка, на картинке выше, провоцирует поделится данным скриншотом с друзьями и добавить хэштег #youtubemonkeys. Не спешите смеяться, это не самоирония. Инженеры Youtube регулярно осуществляют поиск подобных скриншотов. Декодируют base64 и потом, расшифровывают секретное содержимое стэка вашего браузера и находят неисправность. Если бы они вас попросили поделится содержимым стэка, вы бы наверняка отказались. Не правда, ли?

Для передачи китайских письма, иногда не достаточно стандартных иероглифов. В Гонг Конге применяют дополнительные иероглифы. Для их ввода изобрели кодировку Big5. Кроме этой кодировки Python поддерживает и другие экзотические кодировки, которые входят в стандарты ISO [3].

Выводы

Мы рассмотрели стандартные способы представления символов. Несмотря на то, что в текстовом редакторе вы видите один символ он может иметь разный размер в байтах. Кодировок существует много, но Unicode среди их занимает доминирующую роль. Абсолютное большинство приложений и вебсайтов использует эту кодировку.

Некоторые буквы имеют одинаковую форму, но различный код. Эта особенность может быть использована для стеганографических целей. Мы рассмотрели, каким способом вы можете узнать код буквы: 1) посредством использования языка программирования Python; 2) посредством утилиты hexdump.

Источники информации:

[1] RFC 2279, «UTF-8, a transformation format of ISO 10646», устаревшая версия.
[2] RFC 3629, «UTF-8, a transformation format of ISO 10646».
[3] ISO 10646, Стандарт Unicode.

Секреты Китая: китайская электроника и стеганографические методы

Вам необязательно знать китайский язык для использования китайской стеганографии! Это конечно было бы неплохо, но смысл данной статьи не в том что бы научить вас китайскому.

Содержание:

В недавней статье было представлено много способов составления стеганографических сообщений. Как было сказано ранее, в европейских языках для таких целей могут служить символы диакритики, пробелы, умышленные опечатки и т.д. В арабском, урду, фарси и уйгурском можно использовать еще и таквили (смотреть статью Стеганография, арабский и немного математики (часть 1)).

метод инкрементальных указателей
Стеганографические сообщения
(метод инкрементальных указателей)

Вы можете меня спросить: «А как насчет китайского, корейского и японского?». Предыдущие методы подходят для китайского, но имеют собственную специфику и некоторые ограничения. Так пробелы в китайском языке не ставят для экономии места. Рассмотренный ранее метод инкрементальных указателей также применим для китайского языка, только указывать специальные символы будут не на букву а идеограмму представленную в виде иероглифа. Если вы хотите прочитать обычную газету, вам необходимо знать около 2000 иероглифов. Иероглифическая письменность требует особых методов ввода. В японском — анси (Anthy), в корейском — хангыль (Hangul), в китайском — женьма (ZhengMa), чжуинь (Zhuyin) и пиньинь (Pinyin). Пиньинь — наиболее распространенный метод ввода китайских иероглифов. Обычная qwerty клавиатура способна представить китайский иероглиф. Пиньинь заменил чжуинь и женьма. Английские буквы qwerty-клавиатуры передают звуки, а диакритические символы — тон.

Раскладка клавиатуры
(чжуинь)

Вступление

Куда бы вы не посмотрели и какой-бы товар не купили, вы всегда встретитесь с китайскими иероглифами. Невозможно за свою жизнь ни разу не узнать о Китае. Китай промышленная страна производящая большинство современной электронной техники. Большинство электронных приборов состоит из китайских полупроводниковых компонентов. В статистике международной торговли азиатские страны занимают доминирующую роль. Свободная экономическая зона в Гонконге представлена отдельно, но это тоже Китай. Итого, Китай продал в 2015 году полупроводников на 361597 миллионов долларов США!

объем продаж полупроводников
Статистика экспорта полупроводников на 2015, в млн. $ США
(источник ООН, UN Comtrade, категория товаров 776 и 772)

Производство полупроводниковых элементов есть в некоторых странах, но основная производственная мощность находится в Китае, Сингапуре, Корее и так далее. В России, в городе Зеленоград, компания Mikron производит полупроводники по технологическому процессу 65 нм. Чем меньше технологический процесс, тем больше плотность элементов на одном кварцевом кристалле. Например, в Республике Беларусь компания Интеграл в 2012 производила свои наилучшие полупроводниковые компоненты по технологическому процессу 350 нм. Китай производил подобное ещё в 1997 году, а сейчас Китай внедрил на своих самых продвинутых в мире заводах технологический процесс менее 5 нм!!!

Почему в Европе производство полупроводников не настолько развито как в Китае?

В демократических странах власти прислушиваются к мнению экологов. Более того, средства массовой информации постоянно говорят о вреде заводов по производству электроники. Общественность на таком информационном фоне протестует и власти которые ничего не понимают в физике и электронике принимают соответствующие решения, составляют регуляторные акты и прочее. В результате, если предприниматели захотят создать завод, то будут вынуждены заплатить огромные налоги в бюджеты этих стран. Заработанные деньги государство потратит на экологов, а экологи будут опять препятствовать развитию технологий. Это похоже на замкнутый цикл из которого не выйти.

В отношении Китая, все совсем иначе. Там также есть экологи, но их количество и роль совершенно иная. К государственному планированию там привлекают всех специалистов одновременно. Государство пользуясь средствами массовой информации детально объясняет своим гражданам суть своей политики. Если с неба падет кислотный дождь, тогда оно как заботливая мать, советует всем надеть защитные плащи и не парковать свои автомобили на улице чтобы краска не облезла. Если на улице легкий смог, тогда оно советует дышать через респиратор, противогаз, или влажную тряпочку. Простите меня за сарказм, но это лучше чем совсем не дышать.

Кремниевые полупроводники в вашем iphone стоят не больше чем песок под вашими ногами. Основная сложность — это технологический процесс. Прибыль китайских компаний очень быстро превышает затраты, на производство. Сейчас Китай, Корея и прочие азиатские страны являются монополистами в сфере поставок электронных компонентов. Китайские запчасти всюду: в самолетах от Boeing и Airbus, в чайниках и микроволновках, в ракетах и спутниках, в дешевых брелках и дорогих автомобилях. Первый китайский Airbus A320 был построен в 2008 году [1].

Недокументированные возможности и запрет Huawei в США

Каждая деталь и каждый компонент имеет свою спецификацию (datasheet). Спецификация описывает работу устройства, режимы взаимодействия с другими устройствами, условия эксплуатации и так далее. Некоторые возможности современной техники утаивают от потребителя. Знание о таких возможностях имеют только некоторые люди и прежде всего военные.

Лев Сергеевич Термен в 1945 изобрел первое подслушивающее устройство без батареек. Для снятия информации с этого устройства достаточно было просто подогнать машину со специализированной аппаратурой под здание. Подобным образом работают утюги, микроволновки, брелки, браслеты на ваших руках. Разоблачение Эдуарда Сноудена это лишь малая часть всего, что известно о великой мощи Китая.

А теперь угадайте: «Кто победит в гипотетическом противостоянии между Китаем и США?» Конечно это будет Китай. Запрет продукции Huawei в 2018 году это только жалкая попытка избежать неизбежного. Благодаря глупым запретам экологов, собственного производства полупроводниковых компонентов которые были бы способны удовлетворить все внутренние потребности у США нет. Выход США из Парижского климатического соглашения в 2017 году, это попытка освободить предпринимателей от высоких налогов ограничивающих развитие технологий внутри страны.

Вы можете спросить: «Почему лидеры крупных корпораций не поддержали отказ США от подобного соглашения?» Все они зависят от китайских поставщиков электронных компонентов. Они боятся потерять доход который имеют и вынужденны так делать. Если поставки китайских запчастей прекратятся, то цены на технику взлетят и часть населения не сможет позволить её приобрести.

Почему китайскую культуру нужно знать?

Китай это непросто технологический гегемон, это будущее. Вы не найдете страну способную заменить Китай. Подобной страны нет и в ближайшей перспективе не будет. Сохраняйте спокойствие и учите китайский. Не стоит переживать насчет возможных перемен, ведь Китайцы очень прагматичный и миролюбивый народ. Они хранят древнюю мудрость в своей культуре и традициях.

Китайский это:

  • просто;
  • интересно;
  • увлекательно.

Разоблачение мифов про иероглиф две женщины под одной крышей

К сожалению, в интернете очень много лживых фактов о китайском. На одном из сайтов я нашел информацию что существует иероглиф две женщины под одной крышей, который переводится как «беда», или «несчастье». Это наглая ложь и такого иероглифа нет. Хотя, есть иероглиф «три женщины».

иероглиф две женщины под одной крышей
Китайская письменность

Если вы хотите убедится в этом, можете вставить иероглифы в Google Translate:

  • 女 — «женщина»;
  • 僉 — «единодушное»;
  • 險 — «риск» и «зловещий»;
  • 姦 — «зло», «изменник», «разврат».

Последний, иероглиф переводится на английский как «зло», «изменник», «предатель». Google Translate перевел это на русский как слово «вероломный». Конечно, понятие слово не подходит, ведь китайская письменность является идеографической. Эти иероглифы правильно называть не словами, а идеограммами. Идеограмма передает идею, или множество идей. Две, три или четыре идеограммы составляют слово.

Защита информации и китайская стеганография

Несмотря на кажущееся разнообразие символов в китайском языке, есть элементарные составляющие, которые являются основой для китайской письменности. Составляющие выглядят как горизонтальные, вертикальные и косые линии. Исключением является составляющий компонент в форме цифры 3, как в слове ребенок 子. Из нескольких идеограмм можно составить новый составной символ, как было показано выше.

Слово женщина на китайском будет написано: 女人, или 一個女人, или 一个女人. Последнее написание содержит два слова 一个 (одна сущность) и 女人 (женщина). Определим значение каждой идеограммы в последних двух словах. Горизонтальная черта означает единицу и применяется когда мы говорим о ком-то конкретном. Второй иероглиф указывает на то, что речь идет о личности. Третий иероглиф означает идеограмму женщина. Четвертый иероглиф — означает идеограмму человек. Эти четыре идеограммы полностью передают смысл слова, которое дословно можно интерпретировать как: «одна женщина человек». Переводчик переведет это, как слово «женщина». Тем не менее, последних двух иероглифов достаточно чтобы понять суть.

Слова могут быть описаны несколькими разными последовательностями иероглифов. Конечно, не все варианты подходят с точки зрения лингвистики и китайцев, но европейцы и американцы вставив эту фразу в Google Translate не найдут ничего подозрительного. Ниже приведены варианты перевода для фразы «один за другим»:

  1. 逐一
  2. 一一一
  3. 一逐一
  4. 一輛接一
  5. 一個接一個
  6. 一个接一个
  7. 一個接一个
  8. 一个接一個

В контексте с другими словами их смысл будет немного различаться. Например, 4 вариант дословно переводится как один после другого. В английском языке такого количества возможных альтернатив нет и можно сказать только: «один за одним», или «один за другим». Вот оно, богатство китайского языка.

Синонимический и омонимический методы подсвечивания в стеганографии

Предположим, что вы имеете огромный словарь содержащий синонимы для каждого слова. Если каждое слово (идеограмма, или последовательность идеограмм) W в секретном сообщении имеет хотя бы один синоним, или омоним S, тогда можно договорится что один из синонимов будет означать наличие данного слова в секретном сообщении. Единственное требование заключается в начальной обработке текста, в котором будет сокрыта информация, во избежание появления случайных слов S которые могут нарушить смысл секретного сообщения.

Теперь, представьте что китайскому шпиону понадобится сообщить о результате своих действий в центр координирования действий. За ним следят и он не может написать все открытым текстом. Чтобы избежать подозрений большая часть его переписки это пустая болтовня. Секретные слова он передает только с использованием синонимов подсвечивания. С точки зрения тех кто за ним следит это выглядит как невинный текст. Давайте представим что ему надо ответить в секретном сообщении где он был в указанное время. Он был в машине и ответить может следующими текстовыми сообщениями.

На китайскомсекрет
於车裡отсутствует
(текст пустая болтовня)
在车裡присутствует слово «в»
在車裡присутствуют слова
«в машине»

Первые два иероглифа называются маркерными идеограммами. Для всех перечисленных фраз Google Translate выдаст одинаковый по смыслу перевод. Разумеется короткая фраза «в машине» может показаться подозрительной. Этим фразам можно придать более невинный вид: «Я забыл свои ключи в машине и опоздал на работу». Текст на китайском с секретным сообщением: «我在車上忘記了鑰匙,上班遲到了。». Текст на китайском, но без секретного сообщения: «我於车上忘記了鑰匙,上班遲到了。».

Как вы видите в 16 иероглифах сокрыто 2 идеограммы. Эффективность сокрытия будет равна 2/16 * 100=12.5%. Избыточность информации будет 87.5%. На самом деле, эти показатели были бы лучше, если бы сообщение было таким коротким как в таблице. Для фраз в таблице эффективность 2/3 * 100=66.67%, а избыточность информации 33.33%. В обоих случаях мы получили приемлемые показатели. Это очень простой пример.

А теперь, давайте представим что шпион о котором мы говорим был в поезде. Ему надо сказать слово «поезд» в секретном сообщении. Это слово передается двумя иероглифами: огонь 火 и средство передвижения 车. Первый иероглиф существует только в одной форме, а второй может быть заменен на 車 (мы выбрали его как маркер, смотреть предыдущий пример). Предложение которое хранит в себе секретное сообщение может быть таким: «Он потушил огонь и уехал на своей машине». Тоже самое, но на китайском: «他撲滅了火,開著他的车開走了。». В этом предложении пока нет секретного сообщения. Синонимом слова огонь является слово пламя, которое можно написать как 火焰 (без маркировки), или 火燄 (последний иероглиф используется в качестве маркировки секретного сообщения). Но пламя 燄 и 車 в сообщении будет неверно истолковано как «пламя машины». Как вы можете увидеть, эта идеограмма нам не подходит.

Необходимо поставить рядом знак, который бы обратил внимание именно на иероглиф огонь 火, но не изменил смысла предложения. Для этого можно использовать пробел. Пробелы обычно не пишутся в китайском языке для экономии места, но если мы его напишем это не будет ошибкой. Запишем секретное сообщение в наше предложение так: «他撲滅了 火,開著他的車開走了。». Посмотрите как Google Translate перевел оба варианта предложений.

Перевод сообщения без скрытого содержания и сообщения со скрытым содержанием

Посмотрите на одинаковую транскрипцию под китайским текстом. Более того, они звучат одинаково и смысл у них одинаковый, не обращайте внимание на перевод в Google Translate. Друзья это восхитительно, мы только что закодировали слово поезд в предложении которое его не содержит.

Преимущества:

  1. Китайский позволяет выразить фразы по разному включая: «в», «один за одним» и так далее;
  2. Не все люди знают китайский;
  3. Используя маркерные идеограммы можно закодировать сообщение которое имеет другой смысл, отличающийся от смысла предложения которое этот секрет несет;
  4. Высокая эффективность (плотность) сокрытия информации.

Недостатки:

  1. Если синонимов мало, тогда это приведет к повтору слов в тексте;
  2. Не все слова имеют подходящие синонимы (в основном это простые слова из одного иероглифа, например слово «огонь»);
  3. Тот кто это прочитает должен знать словарь маркерных идеограмм и иметь хорошую память.

Другие методы подсвечивания

Маркерными символами можно передавать скрытое содержание. Помните как пишется слово женщина ( на самом деле два слова 一个 и 女人) на китайском? Первый иероглиф в нем это горизонтальная черта. Вместо этой черты можно вставить длинное тире которое будет использоваться как маркер указывающий на скрытое слово. Внимательный читатель может заметить небольшую разницу в толщине черты.

два словапредложениеприсутствие
подсвечивающего
маркера
一个女人我看到穿蓝色连衣裙的一个女人。без тире
маркер отсутствует
—个女人我看到穿蓝色连衣裙的—个女人。с тире
маркер присутствует
скрытое слово «женщина»

Перевод обоих предложений одинаковый: «Я видел женщину в голубом платье». В дословном переводе: «Я видел личность одной женщины в голубом платье». Одна личность —个 употребляется, когда мы говорим о том кого хорошо знаем, или значимой персоне. Конечно, иногда это можно расценивать как сарказм. В китайском языке это звучит корректно, но не в русском или английском. Именно поэтому переводчик, пропускает слова одна личность.

Следующий пример это слово друг 朋友. Большой китайско-русский словарь содержит пример применения слова 一个 и 朋友: «作为一个朋友, 我劝你们。». На русский это переводится как: «Я советую вам, как друг». Слово 一个 не переводится и подходит чтобы применять его как маркер который подсвечивает скрытые слова [2].

Преимущества:

  1. Очень простой способ для подсвечивания скрытых слов.

Недостатки:

  1. Китайский шрифт всегда моноширинный. Если заменить очень много горизонтальных иероглифов на тире, тогда текст с тире сместится влево, по сравнению с текстом содержащим горизонтальный иероглиф;
  2. Это вносит незначительный другой смысл в предложение.

Методы инкрементальных указателей

Как было сказано в самом начале, эти методы не подходят для сокрытия текста который написан на китайском. Никто не говорил что пробелы нельзя применять, но предыдущие методы больше подходят для китайской письменности. Очень много пробелов в текстовом файле могут внушить подозрения о сокрытой информации.

Методы множества шрифтов

С точки зрения защиты информации, китайский идеальный язык для сокрытия информации, особенно если рисовать иероглифы вручную. Один китайский иероглиф может состоять из 13 компонентов. Эти 13 компонентов вы можете нарисовать используя разную толщину.

Секретную информацию в сообщение вложить можно только в том случае, когда существует n разных различимых состояний. Представим, что у нас есть 5 знакомест, тогда общее количество состояний n^5. Так, восьми битами (n=2), можно представить 2^8=256 разных символов. Если вы вручную создаете концепцию дизайна ваших иероглифов, тогда вы можете воспользоватся кистью в векторных редакторах таких как Adobe Illustrator, Corel Draw, Inkscape. Одно из полезных свойств таких приложений — это возможность выбора угла пера, массы и коэффициента сужения.

Векторные графические редакторы и стеганография

Прежде всего задайте коэффициент масштабирования равным 100%. Для аккуратного написания иероглифа задайте большую массу (меру инерции) для кисти. Перо стало более послушным и рисует очень плавно и аккуратно. Не округляйте концы и оставьте их острыми. Установите фиксацию в промежутке от 64 до 81. Выберите разные углы наклона пера и посмотрите как будут выглядеть нарисованные линии.

Линии нарисованные кистью для углов наклона 90° и -90°
(приложение Inkscape)

На рисунке выше изображены 4 пары вертикальных и горизонтальных линий. Угол наклона кромки на концах линии обозначен красными числами — для угла наклона пера α=90° и синими числами — для угла наклона пера α=-90°. Обратите внимания на отличия толщины линий и кромок на их концах. Для вертикальных линий порядок рисование сверху-вниз (рисунок a) и снизу-вверх (рисунок b) имеет значения. Для горизонтальных линий (рисунки c,d) это не имеет значения и кромка на краях одинаковая. Если угол наклона пера α=0° и вы рисуете вертикальные линии то порядок рисования не имеет значения.

Давайте нарисуем иероглиф счастье для разных углов наклона пера. Угол кромки на концах линий можно определить в тех случаях, когда линия не соприкасается с другими линиями. Этого конечно можно не делать, но шрифт получится неаккуратным. Посмотрите на рисунок ниже и вы увидите, что угол наклона пера влияет на толщину линий.

стеганография и китайские иероглифы
Китайский иероглиф fú — счастье и благополучие

Допустим, каждый компонент иероглифа может быть либо толстым, либо тонким. В этом случае, мы имеем 2^1 разных состояния для каждого компонента. Какое общее количество всех возможных состояний для 13 компонентов? Верным ответом будет 2^13= 8192. А что если каждый компонент рисовать ещё немного вогнутым, выпуклым или ровным? Тогда каждый компонент будет иметь 2^1*3^1=6 состояний. Перечислим все состояния в таблице.

НомерСостояние
1тонкий и вогнутый
2тонкий и ровный
3тонкий и выпуклый
4толстый и вогнутый
5толстый и ровный
6толстый и выпуклый

Общее количество состояний для 13 компонентов будет 6^13=13060694016. Это восхитительно, ведь тринадцати миллиардов хватит чтобы передать индексы слов в английском и русском словарях. А если учитывать угол кромки на концах линий, то один иероглиф может теоретически скрыть индексы слов для словарей всех существующих языков.

Китайский и семейные шифры

У каждой китайской семьи есть свои традиции написания иероглифов. Эти традиции позволяют знающему человеку понять больше, чем написано в тексте. Если вы знаете немного китайский язык, тогда вы можете создать свою личную тайну. Выберите свой иероглиф, создайте свой уникальный стиль. Если у вас нет времени, мы можем вам помочь и создать для вас уникальный логотип со скрытым смыслом.

В недавней статье, мы говорили об армии Александра Македонского и о том, как он однажды разрешил отправить солдатам письма к их родным. Во вторую мировую войну был также интересный случай использования семейного шифра. Солдат посылал письма семье и в поле отправитель указывал разные инициалы. Таким путем он хотел сказать родителям, где он находится. Но письма пришли не в порядке их отправления и его родители не поняли где он находится (читать больше в статье Эволюция шифров и их стойкость).

Выводы

Мы рассмотрели Китай как великое промышленное государство способное изменить ход истории. Мы одеты в китайские технологии, у нас в кармане смартфон с китайскими деталями. Даже если это не так, то патенты на технологии согласно которым производят электронные детали принадлежат китайцам. Только эту страну можно назвать мировым электронным гегемоном. Это является достаточно серьезным поводом чтобы учить китайский.

Китайский язык идеально подходит для сокрытия информации. Он имеет свои особенности, которые могут усложнить процесс сокрытия информации. Тем не менее, он помог увеличить эффективность сокрытия информации существенно лучше, чем это было бы возможно путем применения европейских языков.

Источники информации:

[1] Michael Pecht, университет Мериленда, «Китай как гегемон глобальной электронной индустрии: как это получилось и почему не изменится», 2009 год.

[2] Левина О.В. «Большой китайско-русский словарь», 2009 год.

Стеганография, арабский и немного математики (часть 1)

Содержание:

Восточная цивилизация произвела огромное количество великих поэтов, ученых, философов и мудрецов. Собственно, у них было для этого достаточно времени. В предыдущей статье мы говорили об одном из них, великом арабском криптоаналитике Аль-Кинди (смотреть Эволюция шифров и их стойкость)[1].

Пока жители средневековой Европы искали дрова чтоб согреться, жители востока делали музыку, писали красивые стихи, рисовали картины, вышивали гобелены, ну и конечно воевали. Правители и законы менялись очень часто. Из-за строгой цензуры некоторые вещи нужно было скрывать. Стеганография сделала это возможным.

Стеганография — это наука о сокрытии информации. Носителем информации может быть все что меняет свою форму, внутренне или внешнее состояние. Это может быть надпись невидимым чернилом, прическа и даже борода. Это звучит странно, но бороду использовали для сокрытия татуировок с тайным содержанием.

Когда персы в пятом веке до нашей эры захватили Гистиея, который был правителем Греции, они постоянно следили чтобы он ничего не передал своим союзникам. Тем не менее, хитрый грек послал сообщение своему двоюродному брату Аристагору. Сообщение было доставлено в Милет в виде татуировки на волосатой голове его раба [2].

Арабский текст как способ скрыть информацию

Здесь и далее мы будем говорить о сокрытии текстовой информации в тексте. Вам не нужно знать арабский язык для этого, хотя это было бы отлично. Основной смысл его применения — это его восхитительные свойства.

Семь фактов об арабском языке

Арабский очень важен и включен в шесть основных языков ООН. Культурное наследие оставленное нам арабами очень огромное. Знание арабского, также как и других языков, помогает лучше понять восточную культуру, историю и так далее. Основные факты об арабском языке изложены ниже:

  1. Написание слов начинается с правой стороны и заканчивается на левой стороне (это очень удобно и рука не пачкается, особенно если вы левша);
  2. Не все буквы в одном слове пишутся слитно;
  3. Буквы делятся на солнечные и лунные;
  4. Алфавит содержит 28 букв;
  5. 22 буквы имеют 4 формы написания;
  6. 6 букв имеют только 2 формы написания;
  7. В арабском отсутствуют заглавные буквы.

Если вы UI-дизайнер, или работали с консолью в Linux, то вы наверняка знаете, что шрифты могут иметь разную ширину. Шрифты в которых буквы имеют одинаковую ширину — называются моноширинными (англ. monospace). Для выравнивания слов в арабском языке добавляют специальный символ, который называют татвиль, или кашида. Слова можно растягивать как баян, добавляя татвили много раз.

СловоЗначениеНормальное
написание
Татвиль
аль-малуденьгиالمالالــــمــــال
аль-хамдупохвалаالحمدالحمــــــد
слитное написание
Лигатура риал — символ арабских валют

Существует много способов слитного написания букв (лигатур). Одна лигатура может содержать несколько букв. На зеленом кружке нарисована лигатура риал. Слово может быть растянуто (ريال), или чересчур сплюснуто как риал (﷼).

В каскадной таблице стилей CSS3 раньше можно было определять стили с выравниванием при помощи кашиды. Добавление кашиды может усложнить поиск слов и поэтому обычно не используется в основном тексте. Конечно, если вы не преследуете эту цель. Его использование имеет смысл когда вы создаете навигационное меню на сайте. Данные символы есть на сайте сетевой академии Cisco в навигационном меню при выборе арабского языка в качестве основного.

Использование информативных и неинформативных символов

Информативные символы несут основную смысловую информацию. Неинформативные символы такой информации не несут. Неинформативными символами является символ пробела и вышеупомянутый символ татвиль. Отличие арабского языка от группы европейских языков состоит в том, что он позволяет вставить в слово любое количество неинформативных символов. В европейских языках подобных символов мало. Обычно это диакритические символы, знаки препинания, и другие особые символы.

Для сокрытия текстовой информации в текстах, которые написаны на европейских языках приходится использовать смену регистра букв, умышленные опечатки, добавление лишних символов. Но все эти операции очень заметны. Ниже приведен стих Роберта Фроста в который вложено сообщение: «I love you».

i have been one acquainted with the night.
I have waLked Out in rain — and back in rain.
I haVE outwalked the furthest citY light.

I have lOoked down the saddest city lane.
I have passed by the watchman on his beat
And dropped my eyes, Unwilling to explain.

Роберт Фрост, известный американский поэт

Если вы посмотрите на данный текст, то вы обратите внимание на измененный регистр букв. В других, более незаметных схемах сокрытия, используется лишние пропуски между словами для указания индекса буквы. Каждый лишний символ пробела указывает порядок буквы в следующем слове. Смысл стеганографии в незаметности для большинства людей.

Как вы видите, для 8 символов скрытого текста требуется 256 символов открытого текста. Эффективность сокрытия выражается как отношение количества символов скрытых данных к количеству символов открытого текста. Для наших слов эффективность составляет 3,125%.

Избыточность информации равна 96,875%. Эта величина показывает неэффективность сокрытия информации. Данный показатель неприемлемый для информационного обмена. Для передачи одной статьи на этом сайте потребовалось бы около 320 000 символов.

Урду, уйгурский, фарси и белорусский арабский алфавит

Арабский оказал огромное влияние на другие языки такие как: урду, уйгурский и фарси. В иранском фарси, кроме 28 букв арабского алфавита присутствуют ещё 4 буквы. В урду также могут использоваться арабские буквы для написания слов.

Татары использовали символы арабского алфавита для передачи символов белорусского алфавита. В библиотеках Вильнюса, а также в библиотеках Минска хранятся книги написанные на белорусском при помощи арабских символов.

Собственно, текст на английском также можно выразить при помощи арабских символов. Арабские 28 букв могут быть использованы для передачи 26 букв английского алфавита. Если кто-то вставит данный текст в переводчик Google Translate, то он ничего не поймет.

Впрочем, для передачи символов русского языка можно применить арабский алфавит, ведь каждая буква имеет несколько форм. Это конечно будет очень заметно. Для русского языка лучше использовать фарси, который содержит 32 символа (букву «ё» в русском алфавите можно просто пропустить).

Стеганография и преимущества арабского

Размещение букв с повторениями в слове аль-малу

Самое главное преимущество это 4 формы написания букв: обособленная, начальная, конечная и промежуточная. В арабском слове аль-малу 3 буквы (две буквы «лям» и одна «мим») имеют 4 формы написания, а остальные 2 буквы «алеф» только 2 формы.

Давайте подсчитаем, сколько возможных размещений букв можно получить для этого слова. Максимальное количество разных состояний которое может хранить это 5-буквенное слово равно 256. Но это самый идеальный случай и он подходит только если каждое из состояний можно интерпретировать отдельно. Например, если все пять позиций занимают «обособленные» формы букв это соответствует числу 256 и означает, что требуется посмотреть на слово с индексом 256 в словаре.

Таблица соответствия для сокрытия символов
(только для букв «алеф», «лям» и «мим»)

Теперь подсчитаем сколько состояний нам необходимо чтоб передать каждую букву английского алфавита. Если каждый кружок на рисунке может пребывать в двух состояниях, то количество кружков которое требуется для одной английской буквы равно логарифму с основой 2, где аргумент равен 26 (количество букв алфавита). Значение этого логарифма равно 4.7, то есть для сокрытия одного символа нужно 5 кружков.

Если арабский текст применить для сокрытия информации достаточно только 3 кружечка для букв «алеф», «лям» и «мим» Количество разных состояний: 4^2*2^1=32 — возможных символа. Количество лишних состояний для трех букв: 32-26=6. Шести состояний не хватит чтобы закодировать английскую букву. Найти для них применение мы больше не сможем. Остальные две буквы оставляют нам 8 возможных состояний (4^1*2^1=8), но и их тоже не хватит.

А сейчас, давайте подсчитаем эффективность: 1/5*100=20%. Один английский символ который прячется в пяти буквах дает двадцатипроцентную эффективность!!! Избыточность равна 80%, но это лучше чем для стиха Роберта Фроста.

Если вы считаете, что эти операции заметны также как сокрытие информации сменой регистра символов, то вы ошибаетесь. Впрочем, для того чтобы оригинальное слово выглядело более органично можно добавить татвили. Это конечно увеличит количество избыточной информации.

Перевод нескольких одинаковых арабских слов в Google Translate

Вначале второго и третьего слова незаметно вставили оконечную форму буквы «алеф». Вконце третьего слова оконечная форма буквы «лям» стала промежуточной формой. Однако, смысл слов не изменился и переводчик по-прежнему показывает один и тот же перевод.

Стеганографический алгоритм

В общем случае, алгоритм включает следующие шаги:

  1. Создайте текст, который вы будете скрывать;
  2. Найдите или напишите некоторый открытый текст;
  3. Проведите математический анализ обоих текстов;
  4. Определите стеганографический метод который наиболее вам подходит;
  5. Если подходящие методы отсутствуют, то перейдите на шаг 2;
  6. Создайте стеганографическое сообщение.

Как было сказано ранее, арабы оставили огромное культурное наследие, которое выражено в песнях, книгах, музыке. С поиском сказок и поэзии никаких проблем нет. А содержимое секретного сообщения зависит от вас.

Математический анализ

Эта часть требует много времени, поэтому возьмите какой-либо программный пакет для математического анализа Matlab, Mathcad, Excel, LibreOffice Calc, Jupiter notebook, или интерпретатор языка Python. Имейте ввиду, что для языка Python вам потребуется дополнительные библиотеки:

  • numpy — для работы с массивами;
  • scipy — для использования статистических функций;
  • matplotlib — для построения графиков и сравнения эффективности;
  • другие библиотеки.

Первое, что вам следует сделать, это это провести частотный анализ букв и символов пунктуации. Для этого строят символьную таблицу, содержащую символы и количество их повторений для открытого и скрытого сообщений. В предыдущей статье, это сделано посредством LibreOffice Calc (смотреть Эволюция шифров и их стойкость).

Основные рекомендации к тексту в котором мы спрячем другой текст:

  1. Количество символов имеющих 4 формы написания должно быть больше;
  2. В начале и конце каждого слова желательно избегать букв с двумя формами написания;
  3. Попытайтесь избегать двух букв идущих подряд, которые имеют только две формы написания.

Стеганографические методы

Методы подсвечивания

Данный метод требует специального символа рядом со скрытым символом. Для европейских языков — это могут быть символы диакритики, или умышленно допущенные опечатки и смена регистра символов. В арабском, для указания буквы можно использовать татвиль после скрытой буквы или перед ней.

Исполнение первой и второй рекомендации особенно важно если в качестве указателя на скрытую букву вы решили использовать символ татвиль. Таким образом, татвиль можно незаметно состыковать с буквой.Символы диакритики очень заметны, в отличие от символов татвиль. Поэтому арабский язык, урду и фарси, с точки зрения стеганографии, очень удобны для применения в таких целях. Метод подсвечивания очень прост и прекрасно подходит в нашем случае.

Методы инкрементальных указателей

В методе инкрементальных указателей в качестве основы используются в основном символы-разделители. К существующему тексту добавляются «лишние» пробелы, которые указывают на секретную букву. Фиолетовым кружком выделен отступ между словами, где один пробел уже есть. Этот пробел не входит в подсчет.

Метод инкрементальных указателей
Стеганографические сообщения

В арабском языке можно использовать символ татвиль в качестве инкрементального указателя. Также можно применить пробел и татвиль как множитель для позиции указателя. Например, два пробела и три татвиля указывают на 6 символ в слове. Количество самих татвилей в слове, в подсчет индекса искомой буквы не входят. Это очень удобно, не так ли?

Если документ который содержит скрытое сообщение хранится в электронном виде, тогда вы без особых стараний найдете все символы. А что делать, когда вы хотите разместить скрытое сообщение на вывеске магазина? Используйте только моноширинные шрифты, иначе извлечь сообщение будет проблематично.

Вернее, извлечение информации будет возможно, но вы же не будете стоять рядом с вывеской измеряя расстояние между словами. Конечно, вы сможете сфотографировать вывеску и извлечь сообщение из фото. Но моноширинный шрифт существенно ускорит этот процесс.

Методы множества шрифтов

Этот метод самый простой и имеет много вариаций. Например, метод множества шрифтов может применяться вместе с методом подсвечивания. Для этого шрифты необходимых букв в тексте меняют на другой очень похожий шрифт. Потом все буквы объединяют (конкатенируют) и получают искомое сообщение.

Кроме всего, можно использовать непосредственно название самого шрифта, как скрытое сообщение. Но этот метод ещё хуже, ведь при печати вы не сможете найти название шрифта в электронном виде. И к тому же, ему не свойственна переносимость. Данный метод требует наличие такого же шрифта на компьютере получателя, иначе информация потеряется.

Мета-информационные методы

Приставка мета означает информацию об информации. Многие современные форматы хранят в себе дополнительную информацию. Такая информация содержит упоминание об авторе, времени создания, дате модификации документа и другие сведения. Подобного рода сведения, можно использовать как подсказку для интерпретации скрытого сообщения.

Например, в качестве автора можно указать известную историческую личность. Вместо реальной даты создания, указать дату какого-то знаменательного события. И это также будет считаться стеганографическим сообщением.

Методы множественного смысла

Слова произнесенные в разном обществе могут иметь разный смысл. Так в информационных технологиях слово «мама» означает материнскую плату. Будьте осторожны, когда ругаете компоненты компьютера вашего знакомого. В таком случае, вы рискуете получить синяк под глазом.

Если вы весьма эрудированная личность и знаете множество исторических фактов, интересных культурных особенностей, специфику произношения слов и другие вещи, тогда этот метод для вас подойдет. Более того, данный метод пригодится при составлении и разгадывании запутанных квестов, головоломок, ребусов.

Выбор способа сокрытия информации

Универсального метода для выбора способа сокрытия информации не существует. Способ можно определить ответив на вопросы ниже.

  1. Что будет использовано в качестве носителя информации?
  2. Какие символы будут сокрыты?
  3. Будет ли текст со скрытым сообщением потом обработан в других программах?
  4. Какие шрифты, программы, устройства, использует получатель информации?
  5. Какими знаниями и опытом обладает получатель секретного сообщения?

После ответа на данные вопросы обратите внимание на возможные проблемы и способы рационализации представления информации.

Возможные проблемы

Текстовые процессоры (Microsoft Office Word, LibreOffice Writer и некоторые другие) могут автоматически исправлять ввод, поэтому скрытое сообщение не всегда будет интерпретировано правильно. Например, редактор векторной графики Inkscape, изменяет формы арабских букв даже если сами буквы вставлять посимвольно.

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

При переносе текстовых файлов в электронном формате, обратите внимание на версии приложений. Это очень важно поскольку может повлиять на содержимое текстового документа. Как альтернативу, вы можете выбрать обычный блокнот и формат txt.

С блокнотом в ОС Windows также могут возникать проблемы. После переноса текстового файла из ОС Linux в Windows, обычный блокнот в Windows неправильно интерпретирует конец строки. В Linux конец строки выражается ASCII символом «подача рядка» (Line feed, 0x0A). В Windows новая строка начинается после символов «возврат каретки» (Carriage return, 0x0D) и «подача рядка».

В результате, в Windows вы можете увидеть текст размещенный на одном рядке. Во избежание этого, подойдет любой блокнот который поддерживает два формата конца строки. Приложения, которые подходят для этих целей: notepad++, Editpad, Visual Studio Code, Brackets, Sublime Text, и так далее.

Способы рационализации стеганографических процессов

Схем рационализации представлений скрытого сообщения очень много. Для каждого из языков они разные. Для русского языка характерна высокая избыточность состояний. Одну из 33 букв русского алфавита можно передать минимум шестью кружочками, все из которых, находятся в двух разных состояниях.

Как вы видите, количество всех состояний для этих кружков равно: 2^6=64. Количество неиспользуемых состояний равно: 64-33=31. Если сократить алфавит до 32 символов, тогда будет достаточно пяти кружков. В таком случае, количество всех состояний будет: 2^5=32. Количество неиспользуемых состояний будет: 32-32=0.

Исходя из вышеизложенных особенностей, мы пришли к выводу что оптимизировать процесс сокрытия можно:

  1. Увеличением количества состояний букв открытого сообщения (которое переносит секретную информацию);
  2. Уменьшением количества символов в алфавите скрытого сообщения.

Если вы решили использовать европейские языки в качестве носителя секретной информации, то увеличить количество состояний можно за счет символов диакритики, смены регистра символов и умышленных опечатков. Такие манипуляции будут выглядеть очень странно и заметно.

Алфавит скрытого сообщения для сокрытия информации в двух состояниях должен иметь от 2^4 до 2^5 букв (2 означает количество состояний для каждой позиции). Тратить 6 позиций (кружочков) для символов нецелесообразно, поэтому для русского языка рекомендуют использовать укороченный вариант алфавита.

Русскую букву «ё» заменяют на похожую на неё букву «е». Буква которая выпала из алфавита применяется не так часто. Пусть n — количество позиций для символа. Если секретное сообщение написано на других языках, количество символов в алфавите которых немного превышает 2^n и значительно меньше 2^(n+1), тогда такой алфавит нужно сократить для увеличения плотности передачи.

Если изначально планируется передавать только две фразы «ДА» и»НЕТ», то множество символов секретного алфавита можно сократить до 5 символов: {‘А’,’Д’,’Е’,’Н’,’Т’}. Это очень упрощенный пример, но он объясняет почему следует использовать статистический анализ.

Выводы

Проанализировано свойства арабского, латинского и русского алфавитов. Показано превосходные свойства арабского для незаметного сокрытия информации. Приведены основные методы сокрытия информации. На их примере показано способы оптимизации процессов сокрытия информации.

Количество способов сокрытия информации не ограничивается приведенными примерами. Основная сложность применения таких подходов состоит в разном стиле текстов. Каждый стиль требует своего уникального подхода. Тексты с огромным количеством повторений наименее подходят для сокрытия информации.

Источники информации:

[1] Аль-Кинди «Трактат о дешифровке криптографических сообщений»

[2] Геродот «История в 9 книгах»