Кодирование стего перестановкой маркеров концов строк.
program StegoCR_LF;

(***************************************************************)
(*     Простая  стеганографическая   программа,   использующая *)
(* замену порядка следования CR/LF в маркерах концов строк для *)
(* встраивания стего в произвольные тексты. мспользует от 1 до *)
(* 3 параметров, которые и определяют  выполняемую  программой *)
(* функцию. При этом первый из параметров всегда  представляет *)
(* файл-контейнер.                                             *)
(*     Если  этот  параметр   единственный,   то   проверяется *)
(* наличие  стеганограммы   в   файле-контейнере   с   выводом *)
(* результата на экран. По сути это режим стеганодетектора.    *)
(*     Если таких параметров два, стеганограмма извлекается из *)
(* контейнера, а  результат  записывается  в  заданный  вторым *)
(* параметром файл.                                            *)
(*     Наконец,  если  используются  все  три  параметра,   то *)
(* стеганографический  текст   из   файла   заданного   вторым *)
(* параметром, упрятывается в файл-контейнер, заданный  первым *)
(* параметром, а результат стеганографического  преобразования *)
(* записывается   в   файл,   заданный   третьим   параметром. *)
(* Совпадение двух имён файлов допускается (трёх - абсурд).    *)
(***************************************************************)

type
      StringType = string [$FF];

const
      TempName = '$$$$$$$$.$$$';
      Key1     = $1234;
      Key2     = $4567;
      CR       = #$0D;
      LF       = #$0A;

var
      F, G, H   : text;
      X         : StringType;
      I         : integer;
      K, L      : byte;
      C, CC     : char;
      Count     : real;

begin
      LowVideo;

      if not (ParamCount in [1..3])
      then
           begin
                 WriteLn ('Ожидается от  1 до 3  параметров:');
                 WriteLn ('1 - вывод стеганограммы на экран;');
                 WriteLn ('2 - вывод стеганограммы  в  файл;');
                 WriteLn ('3 - запись стеганограммы в  файл.');
                 Exit
           end;

      Assign (F, ParamStr (1));
      Reset (F);
      Count := 0;

      MemW [Dseg : $01FE] := Key1;
      MemW [Dseg : $01FC] := Key2;

(*---------------------ВЫВОД СТЕГАНОГРАММЫ НА ЭКРАН--------------------*)
      if ParamCount = 1
      then
           begin
                 C  := #00;
                 K  :=   0;
                 L  :=   0;

                 while not Eof (F)
                 do
                    begin
                          Read (F, CC);

                          if C = CR
                          then
                               if CC = LF
                               then
                                    begin
                                          L := Succ (L) mod 8;
                                          K := K shr 1;
                                          C := #00;

                                          if L = 0
                                          then
                                               begin
                                                     Write (Chr (K));
                                                     K := 0;
                                                     L := 0
                                               end
                                    end
                               else C := CC
                          else
                               if C = LF
                               then
                                    if CC = CR
                                    then
                                         begin
                                               L := Succ (L) mod 8;
                                               K := K shr 1 or $80;
                                               C := #00;

                                               if L = 0
                                               then
                                                    begin
                                                          Write (Chr (K));
                                                          K := 0;
                                                          L := 0
                                                    end
                                         end
                                    else C := CC
                               else C := CC
                    end;

                 Close (F);

                 if WhereX <> 1
                 then WriteLn;

                 WriteLn ('Ok!');
                 Exit
           end;

(*----------------------ВЫВОД СТЕГАНОГРАММЫ В ФАЙЛ---------------------*)
      if ParamCount = 2
      then
           begin
                 if Pos (':', ParamStr (2)) <> 2
                 then Assign (G, TempName)
                 else Assign (G, Copy (ParamStr (2), 1, 2) + TempName);

                 C  := #00;
                 K  :=   0;
                 L  :=   0;
                 Assign (G, TempName);
                 Rewrite (G);

                 while not Eof (F)
                 do
                    begin
                          Read (F, CC);

                          if C = CR
                          then
                               if CC = LF
                               then
                                    begin
                                          L := Succ (L) mod 8;
                                          K := K shr 1;
                                          C := #00;

                                          if L = 0
                                          then
                                               begin
                                                     K := K xor Random (256);
                                                     Count := Count + 1;
                                                     Write (G, Chr (K));
                                                     Write (Chr (K));
                                                     K := 0;
                                                     L := 0
                                               end
                                    end
                               else C := CC
                          else
                               if C = LF
                               then
                                    if CC = CR
                                    then
                                         begin
                                               L := Succ (L) mod 8;
                                               K := K shr 1 or $80;
                                               C := #00;

                                               if L = 0
                                               then
                                                    begin
                                                          K := K
                                                            xor Random (256);
                                                          Count := Count + 1;
                                                          Write (G, Chr (K));
                                                          Write (Chr (K));
                                                          K := 0;
                                                          L := 0
                                                    end
                                         end
                                    else C := CC
                               else C := CC
                    end;

                 Close (F);
                 Close (G);
                 Assign (F, ParamStr (2));
(*$I-*)
                 Erase (F);
(*$I+*)
                 I := IoResult;
                 Rename (G, ParamStr (2));

                 if WhereX <> 1
                 then WriteLn;

                 WriteLn ('Прочитано ', Count : 0 : 0, ' байт стего...');
                 Exit
           end;

(*----------------------ЗАПмСЬ СТЕГАНОГРАММЫ В ФАЙЛ--------------------*)
      Assign (G, ParamStr (2));

      if Pos (':', ParamStr (3)) <> 2
      then Assign (H, TempName)
      else Assign (H, Copy (ParamStr (3), 1, 2) + TempName);

      Reset   (G);
      Rewrite (H);
      L := 0;

      while not Eof (F)
      do
         begin
               ReadLn (F, X);
               Write  (H, X);

               if L = 0
               then
                    begin
                          Read (G, C);
                          Count := Count + 1;
                          Write (C);
                          K := Ord (C) xor Random (256)
                    end;

               if K and 1 = 0
               then Write (H, CR + LF)
               else Write (H, LF + CR);

               K := K shr 1;
               L := Succ (L) mod 8
         end;

      Close (F);
      Close (G);
      Close (H);
      Assign (F, ParamStr (3));
(*$I-*)
      Erase (F);
(*$I+*)
      I := IoResult;
      Rename (H, ParamStr (3));

      if WhereX <> 1
      then WriteLn;

      if (Count <> 0) and (L <> 0)
      then Count := Count - 1;

      WriteLn ('Записано ', Count : 0 : 0, ' байт стего...');
      Exit
end.
381