Конференция "Основная" » Помогите со стегоалгоритмом
 
  • Ampleyev © (08.04.08 21:06) [0]
    Помогите! уже 10 раз с книги алгоритм перебил не пашет(
    Прога должна прятать текст в картинку, но после шифровки картинка умирает
    Кто может помогите! зарание СПАСИБО

    type
    ab=array [0..3] of byte;
    wordp=^word;
    longp=^dword;
    bytep=^byte;
    abp=^ab;

    var
     Form1: TForm1;
     fnamep,fnamet,st,sttext:string;
     fipic,fopic,ftext:file;
     i,j,picsize,textsize,picoffs:integer;
     xb,tb,ib:byte;
     xw,yw:word;
     plong:longp;
     pword:wordp;
     pab:abp;
     pp:pointer;
     pb:bytep;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      OpenDialog1.InitialDir:=ExtractFileDir(Application.ExeName);
      picsize:=0;
      textsize:=0;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin  {открыть картинку}
      OpenDialog1.FileName:=''; {очистим}
      if OpenDialog1.Execute then
      fnamep:=OpenDialog1.FileName else exit;
      try
        Image1.Picture.LoadFromFile(fnamep);
      except
        exit; {если не открывается - на выход}
      end;
      assignfile(fipic,fnamep); {задали исходный файл с картинкой}
      reset(fipic,1);
      {проверка:}
      New(pab);
      seek(fipic,18); {начиная с 18-го байта - размеры}
      for i:=0 to 3 do blockread(fipic,pab^[i],1);
      plong:=longp(integer(pab));
      picsize:=plong^; {ширина}
      for i:=0 to 3 do blockread(fipic,pab^[i],1);
      plong:=longp(integer(pab));
      picsize:=picsize*plong^; {ширина*длину в пикселах}
      seek(fipic,28); {начиная с 28-го байта - бит на пиксел, потом компрессия по два байта}
      for i:=0 to 3 do blockread(fipic,pab^[i],1);
      pword:=wordp(integer(pab));
      xw:=pword^; {бит на пиксел}
      pword:=wordp(integer(pab)+2);
      yw:=pword^; {компрессия}
      if (xw<8) or (yw<>0) then
      begin
        st:='В файле '+ExtractFileName(fnamep)+' используется сжатие'+
        #10+'изображения или в нем слишком мало цветов.'+#10+
        'Подберите другой BMP-файл.';
        Application.MessageBox(Pchar(st),'Ошибка',mb_OK);
        picsize:=0;
        closefile(fipic);
        exit;
      end;
      {проверяем размер, если текст уже открыт:}
      if textsize<>0 then
      begin
       if (picsize*xw)<(textsize*8) then
       begin
        st:='Файл '+ExtractFileName(fnamep)+' имеет недостаточный размер'+
        #10+'Подберите другой BMP-файл.';
        Application.MessageBox(Pchar(st),'Ошибка',mb_OK);
        picsize:=0;
        Button3.Enabled:=False; {кнопка шифрации недоступна}
        closefile(fipic);
        exit;
       end else Button3.Enabled:=True; {кнопка шифрации доступна}
      end;
      Button4.Enabled:=True; {кнопка дешифрации доступна, когда открыта картинка}
      seek(fipic,10); {начиная с 10-го байта - смещение}
      for i:=0 to 3 do blockread(fipic,pab^[i],1);
      plong:=longp(integer(pab));
      picoffs:=plong^; {в picoffs - смещение массива пикселов от начала файла}
      Dispose(pab);
      closefile(fipic);
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin   {открыть текст}
      OpenDialog1.FileName:=''; {очистим}
      if OpenDialog1.Execute then
      fnamet:=OpenDialog1.FileName else exit;
      assignfile(ftext,fnamet); {задали исходный файл с текстом}
      reset(ftext,1);
      textsize:=filesize(ftext);
      {проверяем размер, если картинка уже открыта:}
      if picsize<>0 then
      begin
       if (picsize*xw)<(textsize*8) then
       begin
        st:='Файл '+ExtractFileName(fnamet)+' слишком велик для выбранного изображения.'+
        #10+'Подберите другой BMP-файл.';
        Application.MessageBox(Pchar(st),'Ошибка',mb_OK);
        textsize:=0;
        Button3.Enabled:=False; {кнопка шифрации недоступна}
        closefile(ftext);
        exit;
       end else Button3.Enabled:=True; {кнопка шифрации доступна}
      end;
      getmem(pp,textsize);
      blockread(ftext,pp^,textsize,j);{прочтем текст за один прием}
      for i:=0 to textsize-1 do  {и переведем в строку}
      begin
        pb:=bytep(integer(pp)+i);
        sttext:=sttext+chr(pb^);
      end;
      freemem(pp,textsize);
      Memo1.Text:=sttext; {выведем в Memo}
      closefile(ftext);
    end;

    procedure TForm1.Button3Click(Sender: TObject);
    begin   {зашифровать текст}
      assignfile(fipic,fnamep); {исходный файл с картинкой}
      reset(fipic,1);
      ChDir(ExtractFileDir(fnamep));{на вский случай устанавливаем папку}
      assignfile(fopic,'0'+ExtractFileName(fnamep)); {имя выходного файла}
      rewrite(fopic,1);
      seek(fipic,picoffs); {все до picoffs игнорируем}
      st:=IntToStr(length(sttext));
      while length(st)<10 do st:='0'+st; {числовое поле 10 знаков}
      sttext:='steganographia'+st+sttext; {добавляем сигнатуру и размер записи,
      всего 24 байт заголовок}
      for i:=1 to length(sttext) do {основная процедура}
      begin
        tb:=ord(sttext[i]); {очередной байт текста}
        for j:=0 to 7 do
        begin
          blockread(fipic,ib,1); {очередной байт изображения}
          ib:=ib and $FE; {обнуляем младщий бит изображения}
          xb:=tb shr j; {сдвигаем до нужного ьита}
          xb:=xb and $01; {обнуляем все, кроме младшего бита}
          ib:=ib or xb; {записываем младший бит}
          blockwrite(fopic,ib,1);
        end;
      end;
      {записываем остаток сразу куском:}
      j:=filesize(fipic)-filepos(fipic);
      getmem(pp,j+1);
        blockread(fipic,pp^,j,i);
        blockwrite(fopic,pp^,i,i);
      freemem(pp,j+1);
      closefile(fipic);
      closefile(fopic);
      st:='Текст зашифрован в файле '+'0'+ExtractFileName(fnamep);
      Application.MessageBox(Pchar(st),'Все отлично',mb_OK);
    end;

    procedure TForm1.Button4Click(Sender: TObject);
    begin {расшифровать картинку}
      Memo1.Lines.Clear;  {очищаем Memo}
      textsize:=0; {как будто текстового файла не было}
      Button3.Enabled:=False; {кнопка шифрации недоступна}
      assignfile(fipic,fnamep); {исходный файл с картинкой}
      reset(fipic,1);
      seek(fipic,picoffs); {все до picoffs игнорируем}
      st:='';
      for i:=1 to 24 do {чтение заголовка}
      begin
        tb:=0;
        for j:=0 to 7 do
        begin
          blockread(fipic,ib,1); {очередной байт изображения}
          ib:=ib and $01;{обнуляем все, кроме младшего бита}
          ib:=ib shl j; {сдвигаем до нужного бита}
          tb:=tb or ib; {записываем младший бит}
        end;
        st:=st+chr(tb); {очередной байт заголовка}
      end;
      if pos('steganographia',st)=0 then {если там нет информации}
      begin
        st:='В файле '+ExtractFileName(fnamep)+' отсутствует текст.';
        Application.MessageBox(Pchar(st),'Ошибка',mb_OK);
        exit;
      end;
      delete(st,1,14);
      j:=StrToIntDef(st,0); {извлекаем длину}
      if j=0 then
      begin
        st:='В файле '+ExtractFileName(fnamep)+' длина сообщения равна 0.';
        Application.MessageBox(Pchar(st),'Ошибка',mb_OK);
        exit;
      end;
      sttext:='';
      for i:=1 to j do {чтение сообщения}
      begin
        tb:=0;
        for j:=0 to 7 do
        begin
          blockread(fipic,ib,1); {очередной байт изображения}
          ib:=ib and $01;{обнуляем все, кроме младшего бита}
          ib:=ib shl j; {сдвигаем до нужного бита}
          tb:=tb or ib; {записываем младший бит}
        end;
        sttext:=sttext+chr(tb); {очередной байт сообщения}
      end;
      Memo1.Text:=sttext; {выведем в Memo}
      closefile(fipic);
    end;

    procedure TForm1.Button5Click(Sender: TObject);
    begin  {очистить текст}
     Memo1.Lines.Clear;
     textsize:=0;
     Button3.Enabled:=False; {кнопка шифрации недоступна}
    end;

    end.
  • Сергей М, (08.04.08 21:43) [1]

    > Кто может помогите!


    Чем же помочь тебе, убогий ?
  • sniknik © (08.04.08 22:20) [2]
    спам
 
Конференция "Основная" » Помогите со стегоалгоритмом
Есть новые Нет новых   [134484   +49][b:0][p:0]