Статейка не полностью готова! Как будет время допишу, что нибудь полезное
.Это пример работы с 24-разрядной bmp картинкой размером 30x30 без сжатия. Пример этот был сделан, чтобы начинающему можно было понять, что такое cтеганография.
Код |
Option Explicit
Type PALETTE rgbBlue As Byte rgbGreen As Byte rgbRed As Byte ' rgbReserved As Byte End Type
Type BMPFILEHEADER Type As Integer Size As Long Reserved1 As Integer Reserved2 As Integer OffBits As Long End Type
Type BMPINFOHEADER Size As Long Width As Long Height As Long Planes As Integer BitCount As Integer Compression As Long SizeImage As Long XPelsPerMeter As Long YPelsPerMeter As Long ClrUsed As Long ClrImportant As Long End Type |
Это всякие структуры, которые нужны, чтобы определить, что это за файл и с чем его едят.
Теперь копируешь этот код в форму:
Код |
Option Explicit
Private Sub Command1_Click()
Dim fHeader As BMPFILEHEADER ' заголовок файла Dim iHeader As BMPINFOHEADER ' информационный заголовок файла 'Dim Pal(256) As PALETTE ' палитра Dim BmpWidth As Long ' ширина bmp в байтах Dim BmpHeight As Long ' высота bmp в точках Dim WritePos As Long ' указатель для записи Dim StringToHide As String ' строка, которую будем прятать Dim Jump As Long ' прыжок с конца строки в начало следующей Dim Blue As Byte ' синий канал Dim Green As Byte ' зеленый канал Dim Red As Byte ' красный канал Dim Mask(8) As Byte ' маска Dim CodeLength As Long ' строка, которую будем прятать Dim FirstByte As Byte ' первый байт файла Dim SecondByte As Byte ' второй байт файла Dim i As Long ' счетчик рядов Dim j As Long ' cчетчик битов измененных в текущей строке Dim k As Long ' cчетчик всех измененных битов Dim m As Byte ' сдвиг маски влево
StringToHide = "cardinal"
Mask(0) = &H1 ' 00000001 Mask(1) = &H2 ' 00000010 Mask(2) = &H4 ' 00000100 Mask(3) = &H8 ' 00001000 Mask(4) = &H10 ' 00010000 Mask(5) = &H20 ' 00100000 Mask(6) = &H40 ' 01000000 Mask(7) = &H80 ' 10000000
m = 7 ' начальное значение маски 0x80
Open App.Path & "/" & "secret.bmp" For Binary As #1
Get #1, 1, FirstByte Get #1, 2, SecondByte
If (FirstByte <> 66) Or (SecondByte <> 77) Then MsgBox "Неправильный формат файла!", vbCritical, "Ошибка!" Close #1 Exit Sub End If
Get #1, 1, fHeader ' заголовок файла Get #1, 15, iHeader ' информационный заголовок файла 'Get #1, 55, Pal ' палитра If iHeader.Compression <> 0 Then MsgBox "Ваш рисунок сжат!", vbCritical, "Ошибка!" Close #1 Exit Sub End If
If iHeader.BitCount <> 24 Then MsgBox "У Вас не 24-разрядный рисунок!", vbCritical, "Ошибка!" Close #1 Exit Sub End If
If iHeader.Height * iHeader.Width < Len(StringToHide) * 8 Then ' прячем именно в картинку MsgBox "Вам не хватит места, чтобы спрятать весь текст!", vbCritical, "Ошибка!" Close #1 Exit Sub End If
BmpWidth = iHeader.SizeImage / iHeader.Height ' ширина bmp картинки в байтах BmpHeight = iHeader.Height ' высота bmp картинки в точках Jump = iHeader.Width * 3 + BmpWidth WritePos = fHeader.OffBits + iHeader.SizeImage - BmpWidth + 1 ' начало первой строки
Dim hj As Long CodeLength = Len(StringToHide) * 8 ' длина кодa
Do While (i < iHeader.Height) And (k < CodeLength) Do While (j < iHeader.Width) And (k < CodeLength) ' Get #1, WritePos, Blue ' читаем синий канал ' Get #1, WritePos + 1, Green ' читаем зеленый канал Get #1, WritePos + 2, Red ' читаем красный канал If Mask(m) And Asc(Left(StringToHide, 1)) Then ' прячем в Red Red = Red Or &H1 Else Red = Red And &HFE End If ' Put #1, WritePos, Blue ' записываем синий канал ' Put #1, WritePos + 1, Green ' записываем зеленый канал Put #1, WritePos + 2, Red ' записываем красный канал If m = &H0 Then m = &H8 StringToHide = Split(StringToHide, Left(StringToHide, 1), 2)(1) End If WritePos = WritePos + 3 ' идем к следующему цвету m = m - 1 ' сдвиг маски влево k = k + 1 ' cчетчик всех измененных битов j = j + 1 ' cчетчик битов измененных в текущей строке Loop j = 0 ' сброс счетчика битов измененных в строке i = i + 1 ' счетчик рядов WritePos = WritePos - Jump ' идем в следующую строку Loop Close #1
End Sub |
Ну а теперь можешь начинать думать над тем, как все это работает. Сделал я все по принципу, который описан ниже. Прятал я все только в красный канал цвета, таким образом изменение цвета минимально и на глаз хоть с лупой, хоть без - ничего не увидишь. Но если с пипеткой в хорошем редакторе поизучаешь значения пикселей, то увидишь, что из чисто красного цвета получилось, что-то типа RGB(255,0,0), RGB(254,0,0), RGB(254,0,0), RGB(255,0,0) и т.д. То есть последний битик - это и есть тот битик, из которого ты лепишь Ascii-код буквы.
Самым хорошим заданием теперь является следующее:
Взять картинку, в которую что-то записано и расшифровать содержание. Как только ты сделал правильную "читалку", то считай ты въехал в смысл стеганографии и организации bmp файлов.
Успехов!