Advertisement
Guest User

crypt

a guest
May 14th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.17 KB | None | 0 0
  1. program shifr;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. {$R *.res}
  6.  
  7. uses
  8.   System.SysUtils, Math, Windows;
  9.  
  10. Type
  11.   TArr = array of array of char;
  12.   TCrypt = record
  13.     Direct:byte;
  14.     Angle:byte;
  15.     SizeLen:integer;
  16.   end;
  17.   TFCr = file of TCrypt;
  18.  
  19. Var
  20.   choose,dir,angle:char;
  21.   input:string;
  22.   InpArr:TArr;
  23.   F:TextFile;
  24.   FCr:TFCr;
  25.   interCr:TCrypt;
  26.  
  27. function OPDecrypt(MyArr:TArr):string;
  28. var
  29.   i,j:integer;
  30. begin
  31.   for i := 0 to length(MyArr)-1 do
  32.     for j := 0 to length(MyArr)-1 do
  33.       result:=result+MyArr[i,j];
  34. end;
  35.  
  36. procedure FillArr(var MyArr:TArr; MyInp:string);
  37. var
  38.   len:integer;
  39.   k,i,j:integer;
  40. begin
  41.   //writeln('Исходный массив');
  42.   len:=Ceil(sqrt(Length(MyInp)));
  43.   SetLength(MyArr, len, len);
  44.   k:=1;
  45.   for i := 0 to len-1 do
  46.   begin
  47.     for j := 0 to len-1 do
  48.     begin
  49.       MyArr[i,j]:=MyInp[k];
  50.       //write(MyArr[i,j]);
  51.       inc(k);
  52.     end;
  53.     writeln;
  54.   end;
  55. end;
  56.  
  57. procedure CWEncrypt(MyArr:TArr; var MyFile:TextFile; var CrFile:TFCr; angle:integer);
  58. var
  59.   i,j,m,tmp,check:integer;
  60.   x,y,k:integer;
  61.   inter:string;
  62.   intCrypt:TCrypt;
  63. begin
  64.   Rewrite(CrFile);
  65.   intCrypt.Direct:=1;
  66.   intCrypt.Angle:=angle;
  67.   intCrypt.SizeLen:=length(MyArr);
  68.   write(CrFile,intCrypt);
  69.   closefile(CrFile);
  70.  
  71.   case Odd(Length(MyArr)) of
  72.     True:
  73.     begin
  74.       x:=Length(MyArr) div 2;
  75.       y:=x;
  76.       case angle of
  77.         1: k:=2;
  78.         2: k:=3;
  79.         3: k:=1;
  80.         4: k:=0;
  81.       end;
  82.     end;
  83.  
  84.     False:
  85.     begin
  86.       case angle of
  87.         1:
  88.         begin
  89.           k:=0;
  90.           x:=Length(MyArr) div 2;
  91.           y:=x;
  92.         end;
  93.  
  94.         2:
  95.         begin
  96.           k:=1;
  97.           x:=(Length(MyArr) div 2) ;
  98.           y:=x-1;
  99.         end;
  100.  
  101.         3:
  102.         begin
  103.           k:=3;
  104.           x:=(Length(MyArr) div 2)-1;
  105.           y:=x+1;
  106.         end;
  107.  
  108.         4:
  109.         begin
  110.           k:=2;
  111.           x:=(Length(MyArr) div 2)-1;
  112.           y:=x;
  113.         end;
  114.       end;
  115.     end;
  116.   end;
  117.   check:=1;
  118.   tmp:=length(MyArr)-1;
  119.   i := length(MyArr)+length(MyArr)-1;
  120.   while (i >= 1) and (check <= sqr(length(MyArr))) do
  121.   begin
  122.     m:=1;
  123.     while (m <= 2) and (check <= sqr(length(MyArr))) do
  124.     begin
  125.       j:=1;
  126.       while (j <= Length(MyArr)-tmp) and (check <= sqr(length(MyArr))) do
  127.       begin
  128.         inter:=inter+MyArr[x,y];
  129.         case k mod 4 of
  130.           0: dec(y);
  131.           1: dec(x);
  132.           2: inc(y);
  133.           3: inc(x);
  134.         end;
  135.         inc(check);
  136.         inc(j);
  137.       end;
  138.       inc(k);
  139.       inc(m);
  140.     end;
  141.     dec(tmp);
  142.     dec(i);
  143.   end;
  144.  
  145.   rewrite(MyFile);
  146.   write(MyFile, inter);
  147.   closefile(MyFile);
  148. end;
  149.  
  150. procedure ACWEncrypt(MyArr:TArr; var MyFile:TextFile; var CrFile:TFCr; angle:integer);
  151. var
  152.   i,j,m,tmp,check:integer;
  153.   x,y,k:integer;
  154.   inter:string;
  155.   intCrypt:TCrypt;
  156. begin
  157.   Rewrite(CrFile);
  158.   intCrypt.Direct:=0;
  159.   intCrypt.Angle:=angle;
  160.   intCrypt.SizeLen:=length(MyArr);
  161.   write(CrFile,intCrypt);
  162.   closefile(CrFile);
  163.   case Odd(Length(MyArr)) of
  164.     True:
  165.     begin
  166.       x:=Length(MyArr) div 2;
  167.       y:=x;
  168.       case angle of
  169.         1: k:=1;
  170.         2: k:=0;
  171.         3: k:=2;
  172.         4: k:=3;
  173.       end;
  174.     end;
  175.  
  176.     False:
  177.     begin
  178.       case angle of
  179.         1:
  180.         begin
  181.           k:=3;
  182.           x:=(Length(MyArr) div 2)-1;
  183.           y:=x;
  184.         end;
  185.  
  186.         2:
  187.         begin
  188.           k:=2;
  189.           x:=(Length(MyArr) div 2)-1;
  190.           y:=x+1;
  191.         end;
  192.  
  193.         3:
  194.         begin
  195.           k:=0;
  196.           x:=(Length(MyArr) div 2)-1;
  197.           y:=x-1;
  198.         end;
  199.  
  200.         4:
  201.         begin
  202.           k:=1;
  203.           x:=(Length(MyArr) div 2);
  204.           y:=x;
  205.         end;
  206.       end;
  207.     end;
  208.   end;
  209.  
  210.   check:=1;
  211.   tmp:=length(MyArr)-1;
  212.   i := length(MyArr)+length(MyArr)-1;
  213.   while (i >= 1) and (check <= sqr(length(MyArr))) do
  214.   begin
  215.     m:=1;
  216.     while (m <= 2) and (check <= sqr(length(MyArr))) do
  217.     begin
  218.       j:=1;
  219.       while (j <= Length(MyArr)-tmp) and (check <= sqr(length(MyArr))) do
  220.       begin
  221.         inter:=inter+MyArr[x,y];
  222.         case k mod 4 of
  223.           0: inc(y);
  224.           1: dec(x);
  225.           2: dec(y);
  226.           3: inc(x);
  227.         end;
  228.         inc(check);
  229.         inc(j);
  230.       end;
  231.       inc(k);
  232.       inc(m);
  233.     end;
  234.     dec(tmp);
  235.     dec(i);
  236.   end;
  237.  
  238.   //writeln(inter);
  239.   rewrite(MyFile);
  240.   write(MyFile, inter);
  241.   closefile(MyFile);
  242. end;
  243.  
  244. procedure CWDecrypt(var MyArr:TArr; var MyFile:TextFile; angle,size:integer);
  245. var
  246.   i,j,m,tmp,check:integer;
  247.   x,y,k:integer;
  248.   inter:char;
  249. begin
  250.   SetLength(MyArr,size,size);
  251.   reset(MyFile);
  252.   case Odd(Length(MyArr)) of
  253.     True:
  254.     begin
  255.       x:=Length(MyArr) div 2;
  256.       y:=x;
  257.       case angle of
  258.         1: k:=2;
  259.         2: k:=3;
  260.         3: k:=1;
  261.         4: k:=0;
  262.       end;
  263.     end;
  264.  
  265.     False:
  266.     begin
  267.       case angle of
  268.         1:
  269.         begin
  270.           k:=0;
  271.           x:=Length(MyArr) div 2;
  272.           y:=x;
  273.         end;
  274.  
  275.         2:
  276.         begin
  277.           k:=1;
  278.           x:=(Length(MyArr) div 2) ;
  279.           y:=x-1;
  280.         end;
  281.  
  282.         3:
  283.         begin
  284.           k:=3;
  285.           x:=(Length(MyArr) div 2)-1;
  286.           y:=x+1;
  287.         end;
  288.  
  289.         4:
  290.         begin
  291.           k:=2;
  292.           x:=(Length(MyArr) div 2)-1;
  293.           y:=x;
  294.         end;
  295.       end;
  296.     end;
  297.   end;
  298.   check:=1;
  299.   tmp:=length(MyArr)-1;
  300.   i := length(MyArr)+length(MyArr)-1;
  301.   while (i >= 1) and (check <= sqr(length(MyArr))) do
  302.   begin
  303.     m:=1;
  304.     while (m <= 2) and (check <= sqr(length(MyArr))) do
  305.     begin
  306.       j:=1;
  307.       while (j <= Length(MyArr)-tmp) and (check <= sqr(length(MyArr))) do
  308.       begin
  309.         read(MyFile,inter);
  310.         MyArr[x,y]:=inter;
  311.         case k mod 4 of
  312.           0: dec(y);
  313.           1: dec(x);
  314.           2: inc(y);
  315.           3: inc(x);
  316.         end;
  317.         inc(check);
  318.         inc(j);
  319.       end;
  320.       inc(k);
  321.       inc(m);
  322.     end;
  323.     dec(tmp);
  324.     dec(i);
  325.   end;
  326.   closefile(MyFile);
  327.  
  328. end;
  329.  
  330. procedure ACWDecrypt(var MyArr:TArr; var MyFile:TextFile; angle,size:integer);
  331. var
  332.   i,j,m,tmp,check:integer;
  333.   x,y,k:integer;
  334.   inter:char;
  335. begin
  336.   SetLength(MyArr,size,size);
  337.   reset(MyFile);
  338.   case Odd(Length(MyArr)) of
  339.     True:
  340.     begin
  341.       x:=Length(MyArr) div 2;
  342.       y:=x;
  343.       case angle of
  344.         1: k:=1;
  345.         2: k:=0;
  346.         3: k:=2;
  347.         4: k:=3;
  348.       end;
  349.     end;
  350.  
  351.     False:
  352.     begin
  353.       case angle of
  354.         1:
  355.         begin
  356.           k:=0;
  357.           x:=Length(MyArr) div 2;
  358.           y:=x;
  359.         end;
  360.  
  361.         2:
  362.         begin
  363.           k:=1;
  364.           x:=(Length(MyArr) div 2) ;
  365.           y:=x-1;
  366.         end;
  367.  
  368.         3:
  369.         begin
  370.           k:=3;
  371.           x:=(Length(MyArr) div 2)-1;
  372.           y:=x+1;
  373.         end;
  374.  
  375.         4:
  376.         begin
  377.           k:=2;
  378.           x:=(Length(MyArr) div 2)-1;
  379.           y:=x;
  380.         end;
  381.       end;
  382.     end;
  383.   end;
  384.   check:=1;
  385.   tmp:=length(MyArr)-1;
  386.   i := length(MyArr)+length(MyArr)-1;
  387.   while (i >= 1) and (check <= sqr(length(MyArr))) do
  388.   begin
  389.     m:=1;
  390.     while (m <= 2) and (check <= sqr(length(MyArr))) do
  391.     begin
  392.       j:=1;
  393.       while (j <= Length(MyArr)-tmp) and (check <= sqr(length(MyArr))) do
  394.       begin
  395.         read(MyFile,inter);
  396.         MyArr[x,y]:=inter;
  397.         case k mod 4 of
  398.           0: inc(y);
  399.           1: dec(x);
  400.           2: dec(y);
  401.           3: inc(x);
  402.         end;
  403.         inc(check);
  404.         inc(j);
  405.       end;
  406.       inc(k);
  407.       inc(m);
  408.     end;
  409.     dec(tmp);
  410.     dec(i);
  411.   end;
  412.   closefile(MyFile);
  413.  
  414. end;
  415.  
  416. begin
  417.   writeln('Привет.');
  418.   AssignFile(F,'Encrypt.txt');
  419.   AssignFile(FCr,'CryptParam.dat');
  420.   writeln('Что вы хотите сделать?');
  421.   writeln('1 - шифрование'#13#10'2 - дешифрование');
  422.   repeat
  423.     readln(choose);
  424.   until choose in ['1','2'];
  425.  
  426.   case choose of
  427.     '1':
  428.     begin
  429.       writeln(#13#10'Зашифрованный текст - в файле "Encrypt.txt"');
  430.       writeln('Файл с названием "Encrypt.txt" будет сохранен в папке с программой.');
  431.  
  432.       writeln(#13#10'В каком направлении проводить шифрование?');
  433.       writeln('1 - по часовой стрелке');
  434.       writeln('2 - против часовой стрелки');
  435.       //ввод направления
  436.       repeat
  437.         readln(dir);
  438.       until dir in ['1','2'];
  439.  
  440.       writeln(#13#10'В какой угол идти?');
  441.       writeln('1 - правый верхний');
  442.       writeln('2 - правый нижний');
  443.       writeln('3 - левый верхний');
  444.       writeln('4 - левый нижний');
  445.       //ввод угла
  446.       repeat
  447.         readln(angle);
  448.       until angle in ['1'..'4'];
  449.       //ввод текста
  450.       writeln(#13#10'Введите текст:');
  451.       readln(input);
  452.  
  453.       FillArr(InpArr,input);
  454.  
  455.       case dir of
  456.         '1': CWEncrypt(InpArr,F,FCr,strtoint(angle));
  457.         '2': ACWEncrypt(InpArr,F,FCr,strtoint(angle));
  458.       end;
  459.       writeln('Зашифровано.');
  460.     end;
  461.  
  462.     '2':
  463.     begin
  464.       try
  465.         writeln(#13#10'Текст для дешифрования берется из файла Encrypt.txt');
  466.         Reset(FCr);
  467.         read(FCr,interCr);
  468.         writeln(#13#10'Дешифрованное сообщение: ');
  469.         case interCr.Direct of
  470.           0: ACWDecrypt(InpArr,F,interCr.Angle,interCr.SizeLen);
  471.           1: CWDecrypt(InpArr,F,interCr.Angle,interCr.SizeLen);
  472.         end;
  473.         closefile(FCr);
  474.         writeln(OPDecrypt(InpArr));
  475.       except
  476.         On EInOutError do
  477.           MessageBox(0, PChar('Файла с защифрованным текстом не существует!'#13#10'Для начала зашифруйте что-нибудь!!!!!!!!!!'), 'Ошибка!',MB_ICONERROR+MB_OK+MB_TOPMOST)
  478.         else
  479.           MessageBox(0, PChar('Неизвестная ошибка!'), 'Ошибка!',MB_ICONERROR+MB_OK+MB_TOPMOST)
  480.       end;
  481.     end;
  482.   end;
  483.   writeln('==============================');
  484.   writeln('Нажмите "Enter" для выхода...');
  485.   readln;
  486. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement