Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2014, 20:38   #1
Taner
Пользователь
 
Регистрация: 05.04.2014
Сообщений: 54
По умолчанию программа для стеганографии (LSB метод, Lazarus)

Интересно попробовать сделать программу для стеганографии. Не знаю функций для работы с байтами как текста так и рисунка(bmp). Подскажите как можно взять последние 2 бита текста( нашел функцию shr - сдвиг вправо на n бит) и записать в изображение( тут совсем не понятно). Где можно посмотреть инфу на это, киньте ссылки пожалуйста.
Вот сделал с теми знаниями что были.
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  Buttons, ExtDlgs, StdCtrls;
type

  { TForm1 }

  TForm1 = class(TForm)
    bbClearImage: TBitBtn;
    bbClearText: TBitBtn;
    bbClose: TBitBtn;
    bbLoadImage: TBitBtn;
    bbLoadText: TBitBtn;
    bbLSB: TBitBtn;
    bbSave: TButton;
    BeforeImage: TImage;
    AfterImage: TImage;
    LbMaxSizeTextFile: TLabel;
    LbNumberPixels: TLabel;
    LbVolumeImage: TLabel;
    LbPass: TLabel;
    LbAfter: TLabel;
    LbBefore: TLabel;
    mmText: TMemo;
    OpenDialog1: TOpenDialog;
    OpenPictureDialog1: TOpenPictureDialog;
    SavePictureDialog1: TSavePictureDialog;
    procedure bbClearImageClick(Sender: TObject);
    procedure bbClearTextClick(Sender: TObject);
    procedure bbCloseClick(Sender: TObject);
    procedure bbLoadImageClick(Sender: TObject);
    procedure bbLoadTextClick(Sender: TObject);
    procedure bbLSBClick(Sender: TObject);
    procedure bbSaveClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.bbLoadImageClick(Sender: TObject);
var
  Pixels: integer;
begin
  if OpenPictureDialog1.Execute then
   begin
     {Выводим изображение на компонент TImage}
     BeforeImage.Picture.LoadFromFile(OpenPictureDialog1.FileName);
     AfterImage.Picture:= nil;
     {Вычислим количество пикселей в изображении}
     Pixels:= BeforeImage.Picture.Bitmap.Width * BeforeImage.Picture.Bitmap.Height;
     {Выведем информацию об объеме изображения, о кол-ве пикселей, максимальном размере текстового файла}
     LbMaxSizeTextFile.Caption:= 'Максимальный размер текстового файла ' +
     IntToStr(Pixels div 8) + ' байт';
     LbNumberPixels.Caption:= 'Количество пикселей ' +
     IntToStr(Pixels);
     LbVolumeImage.Caption:= 'Объем изображения ' +
     IntToStr((Pixels * (8 + 8 + 8))  div 8) + ' байт';
   end
  else
   exit;
end;

procedure TForm1.bbLoadTextClick(Sender: TObject);
var
  FileName, str: string;
  Pixels: integer;
  TFile: TStringList;
begin
  Pixels:= BeforeImage.Picture.Bitmap.Width * BeforeImage.Picture.Bitmap.Height;
  TFile:= TStringList.Create; //создание списка строк
  if OpenDialog1.Execute then FileName:= OpenDialog1.FileName;
  {Преобразование в системную кодировку}
  FileName:= UTF8ToSys(FileName);
  TFile.LoadFromFile(FileName);
  If (FileSize(FileName) > (Pixels div 8)) then
   begin
     ShowMessage('Слишком большой документ!');
     exit;
   end;
  str:= SysToUTF8(TFile.Text);
  mmText.Lines.Add(str);
  TFile.Free;
end;


{LSB метод встраивания информации в изображение}
procedure TForm1.bbLSBClick(Sender: TObject);
var
  m_bmp: TBitMap;
  str: string;
  r: byte;
  i: integer;
begin
  mmText.Clear;
   {Изображение из формы в переменную m_bmp}
   m_bmp:= TBitMap.Create;
   m_bmp.Assign(BeforeImage.Picture.Bitmap);
   {Читаем информацию с формы в переменную str}
   str:= mmText.Text;
   {проверка есть ли текстовая информация в поле mmText}
   if (str = ' ') then
    begin
      ShowMessage('Текст не найден!');
      exit;
    end;
   {проверка есть ли изображение в BeforeImage}
   if (BeforeImage.Picture.Graphic = nil) then
    begin
      ShowMessage('Изображение не выбрано!');
      exit;
    end;
  For i:= 1 to Length(str) do
   begin
     r:= byte(str[i]) shr 6; //двоичный сдвиг числа вправо
  
   end;
end;

procedure TForm1.bbSaveClick(Sender: TObject);
begin
  if SavePictureDialog1.Execute then
     AfterImage.Picture.SaveToFile(SavePictureDialog1.Filename);
end;

procedure TForm1.bbClearImageClick(Sender: TObject);
begin
  BeforeImage.Picture.Bitmap:= nil;
  LbVolumeImage.Caption:='';
end;

procedure TForm1.bbClearTextClick(Sender: TObject);
begin
  mmText.Clear;
end;

procedure TForm1.bbCloseClick(Sender: TObject);
begin
  Close;
end;

end.

Последний раз редактировалось Taner; 21.04.2014 в 21:05.
Taner вне форума Ответить с цитированием
Старый 22.04.2014, 17:44   #2
Taner
Пользователь
 
Регистрация: 05.04.2014
Сообщений: 54
По умолчанию

Кто-нибудь что-нибудь посоветовать может?
Taner вне форума Ответить с цитированием
Старый 22.04.2014, 21:16   #3
Taner
Пользователь
 
Регистрация: 05.04.2014
Сообщений: 54
По умолчанию

Сделал перевод текста в бинарный код, вопрос как перевести bmp изображение в бинарный код?
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  Buttons, ExtDlgs, StdCtrls;
type

  { TForm1 }

  TForm1 = class(TForm)
    ...
    Function StrToBin(TextValue:String):String;
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  str: string;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.bbLoadImageClick(Sender: TObject);
var
  Pixels: integer;
begin
  if OpenPictureDialog1.Execute then
   begin
     {Выводим изображение на компонент TImage}
     BeforeImage.Picture.LoadFromFile(OpenPictureDialog1.FileName);
     AfterImage.Picture:= nil;
     {Вычислим количество пикселей в изображении}
     Pixels:= BeforeImage.Picture.Bitmap.Width * BeforeImage.Picture.Bitmap.Height;
     {Выведем информацию об объеме изображения, о кол-ве пикселей, максимальном размере текстового файла}
     LbMaxSizeTextFile.Caption:= 'Максимальный вес текстового файла: ' +
     IntToStr(((Pixels * (8 + 8 + 8)) div 8) div 4) + ' байт';
     LbNumberPixels.Caption:= 'Количество пикселей: ' +
     IntToStr(Pixels);
     LbVolumeImage.Caption:= 'Объем изображения: ' +
     IntToStr((Pixels * (8 + 8 + 8)) div 8) + ' байт';
   end
  else
   exit;
end;

procedure TForm1.bbLoadTextClick(Sender: TObject);
var
  Pixels: integer;
  TFile: TStringList;
  FileName: string;
begin
  Pixels:= BeforeImage.Picture.Bitmap.Width * BeforeImage.Picture.Bitmap.Height;
  TFile:= TStringList.Create; //создание списка строк
  if OpenDialog1.Execute then FileName:= OpenDialog1.FileName;
  {Преобразование в системную кодировку}
  FileName:= UTF8ToSys(FileName);
  TFile.LoadFromFile(FileName);
  If (FileSize(FileName) > (Pixels div 8)) then
   begin
     ShowMessage('Слишком большой документ!');
     exit;
   end;
  str:= TFile.Text;
  mmText.Lines.Add(SysToUTF8(str));
  TFile.Free;
end;


{LSB метод встраивания информации в изображение}
procedure TForm1.bbLSBClick(Sender: TObject);
var
  m_bmp: TBitMap;
begin
  mmText.Clear;
   {Изображение из формы в переменную m_bmp}
   m_bmp:= TBitMap.Create;
   m_bmp.Assign(BeforeImage.Picture.Bitmap);
   {проверка есть ли текстовая информация в поле mmText}
   if (str = ' ') then
    begin
      ShowMessage('Текст не найден!');
      exit;
    end;
   {проверка есть ли изображение в BeforeImage}
   if (BeforeImage.Picture.Graphic = nil) then
    begin
      ShowMessage('Изображение не выбрано!');
      exit;
    end;
 {текст в бинарный код}
 StrToBin(Str);
 {==}

end;

Function TForm1.DecToBin(Int:Longint):String;
var
 StringConst:String[2];
begin
 StringConst:= '01';
 Result:='';//Обнуляем результат функции
    repeat
     //Если Int Mod 2 = 0(т.е. остаток 0) пишем первый элемент,
     //Если Int Mod 2 = 1, то второй пишем элемент
     Result:= StringConst[(Int Mod 2)+1] + Result;
     Int:= Int Div 2;//Делим десятичное число на 2
    until Int = 0;
End;


Function TForm1.StrToBin(TextValue:String):String;
Var
TempString: String;
OctString: String;
BinString: String;
i, k: SmallInt;
Begin
BinString:= '';
for i:= 1 to Length(TextValue) do
  begin
    TempString:= DecToBin(Ord(TextValue[i]));//переводим i-й элемент в двоичную систему
    OctString:='';
      if (Length(TempString) < 8) then
       begin//если длина TempString<8
        for k:= 1 to 8 - Length(TempString) do
          begin//то создаем строку
           OctString:=OctString+'0';//длиной 8-Length(TempString) состоящую из нулей
          end;
       end;
     TempString:= OctString + TempString;//дополняем нулями TempSting
     BinString:= BinString + TempString;//Записываем все в одну строку
     Result:= BinString;//Присваиваем всё функции
   End;
mmText.Lines.Add('*****Текст в бинарном коде*****'+ ' ' + result);
End;

procedure TForm1.bbSaveClick(Sender: TObject);
begin
  if SavePictureDialog1.Execute then
     AfterImage.Picture.SaveToFile(SavePictureDialog1.Filename);
end;

procedure TForm1.bbClearImageClick(Sender: TObject);
begin
  BeforeImage.Picture.Bitmap:= nil;
  LbVolumeImage.Caption:='';
end;

procedure TForm1.bbClearTextClick(Sender: TObject);
begin
  mmText.Clear;
end;

procedure TForm1.bbCloseClick(Sender: TObject);
begin
  Close;
end;

end.
Taner вне форума Ответить с цитированием
Старый 22.04.2014, 22:05   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

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

Как верно Вы прочитали при стеганографии используются биты, т.к. искажение вносимые последним значащим битом байта, при цветности картинки 24 и выше бит на пиксель - ничтожны.
Биты устанавливаются и читаются обычными битовыми операциями and or not xor и сдвиговыми - shl shr советую по ним прочитать литературы, да и вообще по технологии хранения информации - системы счисления, файловые структуры и т.п.
phomm вне форума Ответить с цитированием
Старый 23.04.2014, 11:28   #5
Taner
Пользователь
 
Регистрация: 05.04.2014
Сообщений: 54
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Нет никакой ложки "бинарного кода".
В "компьютере" (оперативке, на диске, по сети) всё представляет из себя байты. В этом можно убедиться взяв любой шестнадцатеричный редактора.
И переводить ничего не надо. Если Вы хотите изобразить байты данных взятых файлов в шестнадцатеричном, двоичном или ином подобном виде - написать функцию несложно - прочитать весь файл (или частями) в поток/буфер и преобразовать каждый байт для вывода(отображения) на экран, другим он при этом ("более бинарным", как Вы, видимо, считаете) совсем не станет, это просто "показ" его человеку.

Как верно Вы прочитали при стеганографии используются биты, т.к. искажение вносимые последним значащим битом байта, при цветности картинки 24 и выше бит на пиксель - ничтожны.
Биты устанавливаются и читаются обычными битовыми операциями and or not xor и сдвиговыми - shl shr советую по ним прочитать литературы, да и вообще по технологии хранения информации - системы счисления, файловые структуры и т.п.
спасибо, почитаю
Taner вне форума Ответить с цитированием
Старый 23.04.2014, 12:49   #6
Taner
Пользователь
 
Регистрация: 05.04.2014
Сообщений: 54
По умолчанию

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

Следующий пример показывает, насколько просто копировать файл с помощью класса TFileStream.
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
  src, dest: TFileStream;
begin
  src := TFileStream.Create('sample.txt', fmOpenRead);
  try
    dest := TFileStream.Create('dest.txt', fmCreate);
    try
      // копирование файла
      dest.CopyFrom(src, src.Size)
    finally
      dest.Free;
    end;  // завершение конструкции try (dest)
  finally
    src.Free;
  end; // завершение конструкции try (src)
end;
т.е. взять пару байт из текста и записать в битмап, или я снова не то смотрю?
Taner вне форума Ответить с цитированием
Старый 23.04.2014, 21:42   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Записать байты можно и в сам поток файла картинки, CopyFrom тут ничего не решает, ибо просто инструмент, суть стеганографии не в этом.
Дело в том, что побайтная запись в файл картинки приведёт к заметным искажениям изображения, подумайте сами, если в ргб записи пикселя один из каналов изменится полностью - будет ли это заметно ? Например на ровном фоне будут разноцветные отдельные пиксели - это заметно, не говоря уж о том, что картинки со сжатием могут вообще плохо отреагировать на такие правки. Если же править биты , то на глаз в битмапе никак нельзя различить ргб254 254 254 от ргб 255 255 255, на этом и основывается работа, вы внедряете информацию незаметно, в микроколичестве подмешивая с источнику.
Для этой задачи достаточно только битовых операций над байтами данных файла, ну и знать структуру обрабатываемого файла надо бы (хотя бы просто битмапа), чтобы не повредить системные данные (т.к. они могут быть очень чувствительны к подмене).
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа для залипания кнопки мыши в Linux (Lazarus) BLACK_RAIN Lazarus, Free Pascal, CodeTyphon 2 11.10.2014 14:01
Программа на Pascal в Lazarus и программа для одномерного массива целых чисел Yegorka Lazarus, Free Pascal, CodeTyphon 13 20.12.2012 18:02
Программа для создания кроссвордов - Lazarus[Delphi]-версия xwicked Общие вопросы Delphi 3 24.09.2012 21:02
Ошибка в преобразовании типов (программа по стеганографии) DashaShirshova C# (си шарп) 1 03.06.2012 18:57
скрипты для стеганографии Ilitan Помощь студентам 1 21.03.2010 01:06