суббота, 5 мая 2012 г.

Текстовая стеганография: Метод знаков одинакового начертания


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

// формируем таблицу замен с английского на русский
exEngTable.Add('a', 'а');
exEngTable.Add('e','е');
exEngTable.Add('k','к');
exEngTable.Add('o','о');
exEngTable.Add('p','р');
exEngTable.Add('c','с');
exEngTable.Add('y','у');
exEngTable.Add('x','х');
exEngTable.Add('A','А');
exEngTable.Add('B','В');
exEngTable.Add('E','Е');
exEngTable.Add('K','К');
exEngTable.Add('M','М');
exEngTable.Add('O','О');
exEngTable.Add('P','Р');
exEngTable.Add('C','С');
exEngTable.Add('Y','У');
exEngTable.Add('X','Х');

Для скрытия стего файл-контейнер считывается посимвольно. Если текущий символ является буквой, осуществляется его замена на латинский символ из таблицы замен (если нужно закодировать бит 1 стеганосообщения). Если же нужно закодировать бит 0, символ просто пропускается. Приведу фрагмент программы, реализующий замену символов:

// читаем символ
currentChar = (char)sr.Read();

if (exEngTable.ContainsKey(currentChar)) // возможна замена
{

// если нужно закодировать очередной символ стего
if (k == 0)
{
encoding = false;

           

if (encoding)
{
// получаем сладший бит текущего символа стего
if ((c & 1) == 1)
// будем кодировать "единицу"
{
currentChar = (char)exEngTable[currentChar];
}
else
// будем кодировать "ноль"
{
// ничего не делаем
}


// переходим к следующему биту
c = c >> 1;
}

                                    
} // exEngTable.ContainsKey(currentChar)

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

// читаем символ
currentChar = (char)sr.Read();

if (exEngTable.ContainsKey(currentChar) || exEngTable.ContainsValue(currentChar))
{

// раскодируем бит
if (exEngTable.ContainsValue(currentChar))
{
// раскодируем единицу
c = c | 0x80; // 1000 0000
decoding = true;
}
else if (exEngTable.ContainsKey(currentChar))
{
// раскодируем ноль
c = c & 0x7F; // 0111 1111
decoding = true;
}
else
decoding = false;


// переходим к следующему биту
c = c >> 1;

} // char.IsLetter

            Пропускная способность стеганосистемы при использовании метода знаков одинакового начертания доходит до 3.2%. Единственная проблема поджидает нас в том случае, если противник пользуется для просмотра текстовых файлов программой Microsoft Office Word или другим средством с автоматической проверкой орфографии. Благодаря ей он сможет быстро заметить подозрительные замены и заподозрить наличие стего в файле.

8 комментариев:

  1. Спасибо за комментарий (на http://gr1g0ry.blogspot.com/2011/08/steganographysoftfoxsecret.html?showComment=1336373970164#c3717220270174818550)! Я немного сменил вид деятельности (потому давно не писал). Надеюсь возобновить постинг немного в другом формате - появятся и другие темы кроме стеганографии. А по-поводу дружить домами - я только за!

    ОтветитьУдалить
    Ответы
    1. А я стараюсь популяризовать, пишу по этой теме диссертацию

      Удалить
  2. Анонимный10 мая 2012 г., 1:01

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

    ОтветитьУдалить
    Ответы
    1. Ну тут пропускная способность метода небольшая - 3.2%, то есть таких символов в среднем тексте чуть более 3%.
      По поводу количества текстов - подойдет любой русский или английский текст. Если текст русский - вы меняете русские буквы на английские и наоборот. Вы разбиваете сове сообщение побитно и скрываете каждый бит отдельно. Тогда если у вас например буква а - английская вы выставляете в качестве бита 1, иначе 0. Набираете 8 битов - это одна буква сообщения. То есть для сокрытия одной буквы сообщения надо 8 букв текста - контейнера

      Удалить
    2. Анонимный10 мая 2012 г., 19:25

      И все же я никак не могу понять. Вот у меня есть текст, который я шифрую, я нахожу ASCII-код каждого символа, перевожу в двоичное число, дальше совмещаю с текстом, в который прячу информацию. Я прохожу по тексту, смотрю, если это одна из подменяемых букв (то бишь A,Р,С и так далее), то
      1) если мне надо шифровать 1, то меняю на противоположный язык;
      2) если мне надо шифровать 0, то оставляю как есть.

      Т.о., если мои рассуждения верны, то получается, если я буду шифровать, допустим, 8 слов, то текст, в котором я прячу должен содержать 64 подменяемые буквы? Или не так?

      Удалить
    3. Да все верно, единственно что мы при сокрытии информации говорим не о байтах, а о битах. То есть в каждой букве будет по 8 бит 0 или 1. После того, как мы разбили скрываемое сообщение на биты начинает работать алгоритм замены символов.
      Пример:
      Допустим вам надо скрыть методом символов одинакового начертания английскую букву F. Код ASCII буквы F - 0x46h что соответствует в двоичном формате коду 0100 0110. Получив эти биты, вы прячете сообщение методом букв одинакового начертание, как вы сами написали коментом выше. То есть идете последовательно 0-> оставляете русскую букву, 1-> меняете на английскую. Тогда при применении метода буквы из списка подмены будут располагаться следующим образом:

      русская
      английская
      русская
      русская


      русская
      английская
      английская
      русская

      Удалить
    4. Анонимный10 мая 2012 г., 20:22

      Спасибо большое! Теперь мне всё ясно. Получается, что сложность только в том, чтобы правильно подобрать текст)

      Удалить
  3. Алгоритм выявляется статистическим анализом. Но если его немного доработать, то он станет более устойчив к анализу.

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


    Например:
    Был некоторый текст (1000 байт). В нем было "a". Выходит количество пар - 8. Количество отсчетов 16, но вкладываем данные только в первые 8.
    Вкладываем "01101000" (1 - английская, 0 - русская). Для компенсации статистики "мусорный" код должен содержать 5 единиц и 3 нуля, например "10110101".
    После обработки в тексте осталось по прежнему 17 русских "а" и 8 английских.

    Плюсы: Данный статистический метод уже не будет реагировать.
    Минус: Используется только половина пропускной стопобности канала. Если в тексте используются только русские или только английские символы, то емкость текста равна нулю!
    Слабое место: Локальный статистический анализ (внутри каждого слова).

    ОтветитьУдалить