среда, 16 мая 2012 г.

Стеганография в XML, HTML: Метод изменения порядка следования атрибутов в файлах с разметкой


Метод изменения порядка следования атрибутов в файлах с разметкой основан на безразличии для интерпретатора HTML/XML порядка следования атрибутов открывающего тега.
При кодировании битовой последовательности стеганосообщения прежде всего имена атрибутов любого открывающего тега документа переставляются местами в алфавитном порядке. В соответствие с этим порядком переставляются и соответствующие им значения. Для кодирования стеганосообщения применяется особенный порядок следования атрибутов. Биту 0 стеганосообщения соответствует алфавитный порядок следования атрибутов, а биту 1 – обратный алфавитный. Таким образом, в теге с n атрибутами можно закодировать n-1 бит стеганосообщения.

tag = ReadOpeningTag(sr, ref data);

if (tag != string.Empty)
{
// обработка открывающего тэга
attributes = GetAttributeValueCollection(tag);

if (attributes.Count != 0)
{
tag = tag.Substring(0, tag.IndexOf(' ')); // формируем новый тэг


Array.Sort(keys, values); // сортируем атрибуты по именам, в соответствие с этим переставляем значения атрибутов
zeroIndex = 0;
oneIndex = keys.Length - 1;

for (int ci = 0; ci < keys.Length - 1; ci++)
{



if (encoding)
{
// получаем младший бит текущего символа стего
if ((c & 1) == 1)
// будем кодировать "единицу"
{
tag += " " + keys[oneIndex] + "=" + values[oneIndex];
oneIndex--;
}
else
// будем кодировать "ноль"
{
tag += " " + keys[zeroIndex] + "=" + values[zeroIndex];
zeroIndex++;
}

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

}


} // attributes.Count != 0
} // tag != string.Empty

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

tag = ReadOpeningTag(sr, ref data);

if (tag != string.Empty)
{
// обработка открывающего тэга
atts = GetAttributeValueCollectionDecoding(tag);
attributes = (string[])atts.ToArray(typeof(string));

if (attributes.Length != 0)
{
// раскодируем бит
attsCurrent = (string[])attributes.Clone();

Array.Sort(attributes); // эталонный (алфавитный) порядок следования следования имен атрибутов

zeroIndex = 0;
oneIndex = attributes.Length - 1;

for (int i = 0; i < attributes.Length - 1; i++)
{
if (attsCurrent[i] == attributes[oneIndex])
{
// раскодируем единицу
c = c | 0x80; // 1000 0000
oneIndex -= 1;
decoding = true;
}
else if (attsCurrent[i] == attributes[zeroIndex])
{
// раскодируем ноль
c = c & 0x7F; // 0111 1111
zeroIndex += 1;
decoding = true;
}
else
decoding = false;


// переходим к следующему биту
c = c >> 1;
}
} // attributes.Count != 0
} // tag != string.Empty

Этот метод довольно хорош, поскольку он фактически не изменяет документа. В то же время внимательный противник сможет заметить различный порядок следования атрибутов в одних и тех же открывающих тегах. Обычно автоматизированные средства создания HTML/XML -документов (да и человек) всегда используют одинаковый порядок следования атрибутов в тэгах. В то же время заметить различный порядок следования атрибутов довольно тяжело. Все зависит от конкретного файла с разметкой. Пропускная способность такой стеганосистемы может достигать 0.2%.

Комментариев нет:

Отправить комментарий