home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / MAGAZINE / MISC / ITPOCT90.ZIP / ENDECRYP.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-10-01  |  4.0 KB  |  146 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.     PROCEDURE OutputXlate(X : XlateType);
  13.     END;
  14.  
  15. CONST
  16.   EncryptedMarker : String[4] = #199+#182+#182+#199;
  17.  
  18. PROCEDURE EncryptObj.SetCoding;
  19.  
  20. VAR
  21.   Size,Ctr  : Integer;
  22.   IdBytes   : String[4];
  23.   TempTable : XlateType;
  24.   R         : Byte;
  25.  
  26. BEGIN
  27.   CASE CodeAction OF
  28.     Encrypt : BEGIN
  29.       Randomize; {Causes program to create a new table each time}
  30.       Ctr := 0;                       {No table entries made yet}
  31.       FillChar(TempTable,SizeOf(TempTable),0); {Initialize table}
  32.       WHILE Ctr < 256 DO BEGIN                 {Fill table      }
  33.         R := Random(256);                      {Get new number  }
  34.         IF (TempTable[R] <> 1) THEN BEGIN      {Already set?    }
  35.           TempTable[R] := 1;                   {Set to filled   }
  36.           XlateTable[Ctr] := R;                {Store Rnd number}
  37.           Inc(Ctr)                             {One more down   }
  38.           END {IF}
  39.         END;   {WHILE}
  40.       BlockWrite(Fp, EncryptedMarker, SizeOf(EncryptedMarker));
  41.       BlockWrite(Fp, XlateTable, SizeOf(XlateTable))
  42.       END;    {Encrypt}
  43.  
  44.     Decrypt : BEGIN
  45.       BlockRead(Fp, IdBytes, SizeOf(IdBytes), Size);  {Make sure}
  46.       IF (Size <> SizeOf(IdBytes)) OR         {file is encrypted}
  47.          (IdBytes <> EncryptedMarker) THEN BEGIN
  48.         WriteLn('File not encrypted');        {before decrypting}
  49.         Halt(1)
  50.         END;
  51.  
  52.       BlockRead(Fp,XlateTable,SizeOf(XlateTable),Size); {Get all}
  53.       IF Size <> SizeOf(XlateTable) THEN BEGIN         {of table}
  54.         WriteLn('Bad or short encryption table found');
  55.         Halt(2)
  56.         END;
  57.  
  58.       OutputXlate(XlateTable);
  59.       FOR Ctr := 0 TO 255 DO          {Load array for decoding}
  60.         TempTable[XlateTable[Ctr]] := Ctr;
  61.       Move(TempTable[0],XlateTable[0],SizeOf(TempTable));
  62.       OutputXlate(XlateTable);
  63.       END
  64.     END
  65.   END;
  66.  
  67. {---------------------------------------------------------------}
  68.  
  69. PROCEDURE EncryptObj.EncryptDecryptBlock;
  70. VAR
  71.   I : Integer;
  72. BEGIN
  73.   FOR I := 1 TO Size DO
  74.     Fb[I] := XlateTable[Fb[I]]
  75.   END;
  76.  
  77. {---------------------------------------------------------------}
  78.  
  79. PROCEDURE EncryptObj.OutputXlate;
  80. VAR
  81.   I : Integer;
  82. BEGIN
  83.   Write(Lst,'  ');
  84.   FOR I := 0 TO 9 DO  Write(Lst,I:5);
  85.   WriteLn(Lst,' '); WriteLn(Lst,' ');
  86.  
  87.   FOR I := 0 TO 255 DO BEGIN
  88.     IF (I MOD 10) = 0 THEN Write(Lst,I:3,'  ');
  89.     Write(Lst,X[I]:3,'  ');
  90.     IF ((I+1) MOD 10) = 0 THEN WriteLn(Lst, ' ');
  91.     END;
  92.   WriteLn(Lst,' ');
  93.   WriteLn(Lst,' ')
  94.   END;
  95.  
  96. {---------------------------------------------------------------}
  97.  
  98. VAR
  99.    InFile, OutFile : EncryptObj;
  100.    Data            : DataBlk;
  101.    Size            : Integer;
  102.    Option          : String[1];
  103.  
  104. BEGIN
  105.   ClrScr;
  106.   WriteLn('EnDeCryp');
  107.   WriteLn;
  108.   WriteLn('       1 to encrypt TESTFILE.TXT');
  109.   WriteLn('       2 to decrypt TESTFILE.CPY');
  110.   WriteLn('       0 to quit');
  111.   WriteLn;
  112.   Write('Input: ');
  113.   ReadLn(Option);
  114.   IF (Option='0') OR (Pos(Option,'12')=0) THEN BEGIN
  115.      WriteLn('Program Terminated');
  116.      Halt(0)
  117.      END;
  118.  
  119.   CASE Option[1] OF
  120.     '1' : BEGIN
  121.           InFile.OpenFile('TESTFILE.TXT', Input);
  122.           OutFile.OpenFile('TESTFILE.CPY', Output);
  123.           OutFile.SetCoding(Encrypt)
  124.           END;
  125.     '2' : BEGIN
  126.           InFile.OpenFile('TESTFILE.CPY', Input);
  127.           InFile.SetCoding(Decrypt);
  128.           OutFile.OpenFile('TESTFILE.CHK', Output)
  129.           END;
  130.    END;
  131.  
  132.    REPEAT
  133.      InFile.ReadBlock(Data, Size);
  134.      IF Option = '1' THEN
  135.        OutFile.EncryptDecryptBlock(Data,Size)
  136.      ELSE
  137.        InFile.EncryptDecryptBlock(Data, Size);
  138.      OutFile.WriteBlock(Data, Size)
  139.    UNTIL Size <> SizeOf(DataBlk);
  140.  
  141.    InFile.CloseFile;
  142.    OutFile.CloseFile;
  143.    Write('Press Enter to quit ... ');
  144.    ReadLn
  145. END.
  146.