home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / MAGAZINE / MISC / ITPOCT90.ZIP / EDC.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-10-01  |  3.7 KB  |  132 lines

  1. PROGRAM EnDeCryp;
  2.  
  3. USES Crt,FCUnit,Printer;
  4.  
  5. TYPE
  6.   Code = (Encrypt,Decrypt);
  7.   XlateType = ARRAY[0..255] OF Byte;
  8.   EncryptObj = OBJECT(FileObj)
  9.     XlateTable : XlateType;
  10.     PROCEDURE SetCoding(CodeAction: Code);
  11.     PROCEDURE EncryptDecryptBlock(VAR Fb: DataBlk; Size:Integer);
  12.     END;
  13.  
  14. CONST
  15.   EncryptedMarker : String[4] = #199+#182+#182+#199;
  16.  
  17. PROCEDURE EncryptObj.SetCoding;
  18.  
  19. VAR
  20.   Size,Ctr  : Integer;
  21.   IdBytes   : String[4];
  22.   TempTable : XlateType;
  23.   R         : Byte;
  24.  
  25. BEGIN
  26.   CASE CodeAction OF
  27.     Encrypt : BEGIN
  28.       Randomize; {Causes program to create a new table each time}
  29.       Ctr := 0;                       {No table entries made yet}
  30.       FillChar(TempTable,SizeOf(TempTable),0); {Initialize table}
  31.       WHILE Ctr < 256 DO BEGIN                 {Fill table      }
  32.         R := Random(256);                      {Get new number  }
  33.         IF (TempTable[R] <> 1) THEN BEGIN      {Already set?    }
  34.           TempTable[R] := 1;                   {Set to filled   }
  35.           XlateTable[Ctr] := R;                {Store Rnd number}
  36.           Inc(Ctr)                             {One more down   }
  37.           END {IF}
  38.         END;   {WHILE}
  39.       BlockWrite(Fp, EncryptedMarker, SizeOf(EncryptedMarker));
  40.       BlockWrite(Fp, XlateTable, SizeOf(XlateTable))
  41.       END;    {Encrypt}
  42.  
  43.     Decrypt : BEGIN
  44.       BlockRead(Fp, IdBytes, SizeOf(IdBytes), Size);  {Make sure}
  45.       IF (Size <> SizeOf(IdBytes)) OR         {file is encrypted}
  46.          (IdBytes <> EncryptedMarker) THEN BEGIN
  47.         WriteLn('File not encrypted');        {before decrypting}
  48.         Halt(1)
  49.         END;
  50.  
  51.       BlockRead(Fp,XlateTable,SizeOf(XlateTable),Size); {Get all}
  52.       IF Size <> SizeOf(XlateTable) THEN BEGIN         {of table}
  53.         WriteLn('Bad or short encryption table found');
  54.         Halt(2)
  55.         END;
  56.  
  57.       FOR Ctr := 0 TO 255 DO          {Load array for decoding}
  58.         TempTable[XlateTable[Ctr]] := Ctr;
  59.       Move(TempTable[0],XlateTable[0],SizeOf(TempTable));
  60.       END
  61.     END
  62.   END;
  63.  
  64. {---------------------------------------------------------------}
  65.  
  66. PROCEDURE EncryptObj.EncryptDecryptBlock;
  67. VAR
  68.   I : Integer;
  69. BEGIN
  70.   FOR I := 1 TO Size DO
  71.     Fb[I] := XlateTable[Fb[I]]
  72.   END;
  73.  
  74. {---------------------------------------------------------------}
  75.  
  76. VAR
  77.    InFile, OutFile : EncryptObj;
  78.    Data            : DataBlk;
  79.    Size            : Integer;
  80.    Option          : String[1];
  81.  
  82. BEGIN
  83.   ClrScr;
  84.   IF ParamCount <> 3 then begin
  85.     WriteLn('EDC format --------------------------');
  86.     WriteLn;
  87.     WriteLn('   EDC {E|D} FileNameIn FileNameOut');
  88.     WriteLn('        │ └──── Decrypt ');
  89.     WriteLn('        └────── Encrypt ');
  90.     Writeln;
  91.     halt(1)
  92.     end;
  93.  
  94.   IF ParamStr(2) = ParamStr(3) then begin
  95.     WriteLn('Input and output filenames must be different.');
  96.     Halt(1)
  97.     end;
  98.  
  99.   Option := ParamStr(1);
  100.   Option := UpCase(Option[1]);
  101.  
  102.   CASE Option[1] OF
  103.     'E' : BEGIN
  104.           InFile.OpenFile(ParamStr(2), Input);
  105.           OutFile.OpenFile(ParamStr(3), Output);
  106.           OutFile.SetCoding(Encrypt)
  107.           END;
  108.     'D' : BEGIN
  109.           InFile.OpenFile(ParamStr(2), Input);
  110.           InFile.SetCoding(Decrypt);
  111.           OutFile.OpenFile(ParamStr(3), Output)
  112.           END;
  113.     ELSE BEGIN
  114.       WriteLn('1st parameter must be an E or D character');
  115.       WriteLn;
  116.       Halt(1)
  117.       end
  118.    END;
  119.  
  120.    REPEAT
  121.      InFile.ReadBlock(Data, Size);
  122.      IF Option = 'E' THEN
  123.        OutFile.EncryptDecryptBlock(Data,Size)
  124.      ELSE
  125.        InFile.EncryptDecryptBlock(Data, Size);
  126.      OutFile.WriteBlock(Data, Size)
  127.    UNTIL Size <> SizeOf(DataBlk);
  128.  
  129.    InFile.CloseFile;
  130.    OutFile.CloseFile;
  131. END.
  132.