Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.01;
Скачать: CL | DM;

Вниз

Помогите со стегоалгоритмом   Найти похожие ветки 

 
Ampleyev ©   (2008-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.


 
Сергей М,   (2008-04-08 21:43) [1]


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


Чем же помочь тебе, убогий ?


 
sniknik ©   (2008-04-08 22:20) [2]

спам



Страницы: 1 вся ветка

Текущий архив: 2009.02.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
1-1206708636
Jolik
2008-03-28 15:50
2009.02.01
какие накладные расходы у try except end?


2-1229690059
ParaSenok
2008-12-19 15:34
2009.02.01
Запуск консольного приложения


6-1197880578
brother
2007-12-17 11:36
2009.02.01
TIdPOP3 просмотр содержимого в разных кодировках...


3-1214040475
Tab
2008-06-21 13:27
2009.02.01
Функция Substring s FireBird


2-1229502902
zorik
2008-12-17 11:35
2009.02.01
перевод каретки