stepic 0.3 использует простейший подход к стеганографии в изображениях. Цитирование непосредственно из модуля:
def decode_imdata(imdata):
'''Given a sequence of pixels, returns an iterator of characters
encoded in the image'''
imdata = iter(imdata)
while True:
pixels = list(imdata.next()[:3] + imdata.next()[:3] + imdata.next()[:3])
byte = 0
for c in xrange(7):
byte |= pixels[c] & 1
byte <<= 1
byte |= pixels[7] & 1
yield chr(byte)
if pixels[-1] & 1:
break
Каждого октет секретных данных, плюс флаг ли это последние байты, скрыто в трех последовательных пикселях. Точнее, stepic использует младшие значащие биты первых трех компонентов (часто RGB) каждого пикселя. Смотрите эту очень некрасиво схему, для потока RGBA с 4 бит на компонент (D
означает данные, E
означает истекшим поток):
| pixel 0 | pixel 1 | pixel 2 |
image viewer sees: | rrrr gggg bbbb aaaa | rrrr gggg bbbb aaaa | rrrr gggg bbbb aaaa |
stepic sees: | ___D ___D ___D ____ | ___D ___D ___D ____ | ___D ___D ___E ____ |
Поскольку шум, введенный это изменение мал в уже «шумный» изображений (один 256-й), вы часто не можете обнаружить это визуально. Это означает, что цель этой техники достигнута: данные скрыты на виду, потому что никто не может отличить ее от естественно возникающий шум.
Это работает. По крайней мере, он работает в форматах без потерь, таких как PNG. Увы, JPG не является без потерь, и его сжатие, скорее всего, изменит хотя бы один из кодированных битов. Достаточно изменить девятый бит, чтобы сделать этот метод довольно бесполезным, так как скрытые данные будут усечены до одного байта.
Стеганография в JPG-изображениях по-прежнему возможна во многих формах, но вы не можете просто настроить значения декодированного пикселя. Лучшим (но более сложным) методом может быть спрятать данные в параметрах, оцененных компрессором.
Возможно, проблема заключается в том, что JPG является форматом с потерями, а стеганографическая схема в stepic не может справиться с ошибками, возникающими при сжатии. Например, он работает с изображениями PNG. –
Да, это было так. Странно, потому что я видел несколько примеров использования файлов .jpg. Работал безупречно с .png Изображения! Благодаря! – user2436704