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

Вниз

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

 
Ampleyev ©   (2008-04-08 21:05) [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.


 
palva ©   (2008-04-08 21:14) [1]

У вас все-таки книжка есть с описанием алгоритма. А нам вы предлагаете по ошибочному коду восстанавливать алгоритм.


 
Palladin ©   (2008-04-08 21:30) [2]

а алгоритм так и орет нечеловеческим голосом "да какого же ... вы меня не правильно перепечатали то!!! нЕлюди!!!"


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

спам



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

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

Наверх




Память: 0.49 MB
Время: 0.013 c
2-1207470775
malyar
2008-04-06 12:32
2008.05.04
sql запросы без sql сервера


15-1206414440
Slider007
2008-03-25 06:07
2008.05.04
С днем рождения ! 25 марта 2008 вторник


6-1185955434
VeryVeryLongInteger
2007-08-01 12:03
2008.05.04
ReceiveLength


15-1205487320
i
2008-03-14 12:35
2008.05.04
полный перенос delphi с компа на комп


2-1207582041
Artin
2008-04-07 19:27
2008.05.04
Несколько раюочих столов в Windowse. Как в Линуксе.