Advertisement
ksyshshot

ти 1

Apr 11th, 2024
591
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.67 KB | Source Code | 0 0
  1. unit UnitMain;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus;
  8.  
  9. type
  10.   TForm_TI_1 = class(TForm)
  11.     MainMenu: TMainMenu;
  12.     LabelKey: TLabel;
  13.     EditKey: TEdit;
  14.     LabelPlaitext: TLabel;
  15.     ButtonEncryption: TButton;
  16.     RadioButtonDecimationMethod: TRadioButton;
  17.     RadioButtonVigenereCipher: TRadioButton;
  18.     LabelEncryptionType: TLabel;
  19.     OpenDialog: TOpenDialog;
  20.     SaveDialog: TSaveDialog;
  21.     MemoPlainText: TMemo;
  22.     Label1: TLabel;
  23.     ButtonDecryption: TButton;
  24.     MemoCiphertext: TMemo;
  25.     ButFile: TMenuItem;
  26.     ButOpenFile: TMenuItem;
  27.     ButSaveFile: TMenuItem;
  28.     ButInstruction: TMenuItem;
  29.     procedure ButOpenFileClick(Sender: TObject);
  30.     procedure EditKeyChange(Sender: TObject);
  31.     procedure ButtonEncryptionClick(Sender: TObject);
  32.     procedure ButtonDecryptionClick(Sender: TObject);
  33.     procedure ButSaveFileClick(Sender: TObject);
  34.     procedure ButInstructionClick(Sender: TObject);
  35.   private
  36.     { Private declarations }
  37.   public
  38.     { Public declarations }
  39.   end;
  40.  
  41. var
  42.   Form_TI_1: TForm_TI_1;
  43.  
  44. implementation
  45.  
  46. {$R *.dfm}
  47.  
  48. type
  49.   TLanguage = (TRus, TEng);
  50.  
  51. function TextToNumbers(text: string; A: Integer): TArray<Integer>;
  52. var
  53.   i: Integer;
  54. begin
  55.   SetLength(Result, Length(text));
  56.   for i := 1 to Length(text) do
  57.   begin
  58.     Result[i - 1] := Ord(UpCase(text[i])) - A;
  59.   end;
  60. end;
  61.  
  62. function TextToNumbersDecimation(text: string): TArray<Integer>;
  63. var
  64.   i: Integer;
  65.   temp: integer;
  66. begin
  67.   SetLength(Result, Length(text));
  68.   for i := 1 to Length(text) do
  69.   begin
  70.       temp := Ord(text[i]);
  71.       if (temp = 1105) or (temp = 1025) then
  72.           Result[i - 1] := 6
  73.       else
  74.       begin
  75.           if ((temp > 1045) and (temp < 1072)) then
  76.               Result[i - 1] := Ord(UpCase(text[i])) - 1040 + 1;
  77.           if ((temp > 1077) and (temp < 1104)) then
  78.               Result[i - 1] := Ord(UpCase(text[i])) - 1072 + 1;
  79.           if (temp < 1046) then
  80.               Result[i - 1] := Ord(UpCase(text[i])) - 1040;
  81.           if (temp > 1071) and (temp < 1078) then
  82.               Result[i - 1] := Ord(UpCase(text[i])) - 1072;
  83.       end;
  84.   end;
  85. end;
  86.  
  87. function NumbersToText(numbers: TArray<Integer>; A, M: Integer): string;
  88. var
  89.   i: Integer;
  90. begin
  91.     Result := '';
  92.     for i := 0 to Length(numbers) - 1 do
  93.     begin
  94.         Result := Result + Chr(((numbers[i] + M) mod M) + A);
  95.     end;
  96. end;
  97.  
  98. function NumbersToTextDecimation(numbers: TArray<Integer>; A, M: Integer): string;
  99. var
  100.   i: Integer;
  101. begin
  102.     Result := '';
  103.     for i := 0 to Length(numbers) - 1 do
  104.     begin
  105.         if numbers[i] = 6 then
  106.             Result := Result + 'Ё'
  107.         else
  108.             Result := Result + Chr(((numbers[i] + M) mod M) + A);
  109.     end;
  110. end;
  111.  
  112. function EncryptionVigenere(text, key: string): string;
  113. var
  114.   numbers, keyNumbers: TArray<Integer>;
  115.   encrypted: TArray<Integer>;
  116.   i: Integer;
  117. begin
  118.   numbers := TextToNumbersDecimation(text);
  119.   keyNumbers := TextToNumbersDecimation(key);
  120.   SetLength(encrypted, Length(text));
  121.   for i := 0 to Length(text) - 1 do
  122.     encrypted[i] := (numbers[i] + (Ord(key[i mod Length(key) + 1]) - 1040)) mod 33;
  123.   Result := NumbersToTextDecimation(encrypted, 1040, 33);
  124. end;
  125.  
  126. function DecryptionVigenere(encryptedText, key: string): string;
  127. var
  128.   numbers, keyNumbers: TArray<Integer>;
  129.   decrypted: TArray<Integer>;
  130.   i: Integer;
  131. begin
  132.   numbers := TextToNumbersDecimation(encryptedText);
  133.   keyNumbers := TextToNumbersDecimation(key);
  134.   SetLength(decrypted, Length(encryptedText));
  135.   for i := 0 to Length(encryptedText) - 1 do
  136.     decrypted[i] := (numbers[i] - (Ord(key[i mod Length(key) + 1]) - Ord('А'))) mod 33;
  137.   Result := NumbersToTextDecimation(decrypted, Ord('А') + 848, 33);
  138. end;
  139.  
  140. function EncryptionDecimationMethod(text: string; key: Integer): string;
  141. var
  142.   numbers: TArray<Integer>;
  143.   encryptedNumbers: TArray<Integer>;
  144.   i: Integer;
  145. begin
  146.   numbers := TextToNumbers(text, ord('A'));
  147.   SetLength(encryptedNumbers, Length(numbers));
  148.   for i := 0 to Length(numbers) - 1 do
  149.     encryptedNumbers[i] := (numbers[i] * key) mod 26;
  150.   Result := NumbersToText(encryptedNumbers, Ord('A'), 26);
  151. end;
  152.  
  153. function ModInverse(a, m: Integer): Integer;
  154. var
  155.   i: Integer;
  156. begin
  157.   a := a mod m;
  158.   for i := 1 to m do
  159.     if (a * i) mod m = 1 then
  160.       Exit(i);
  161.   Result := -1;
  162. end;
  163.  
  164. function DecryptionDecimationMethod(encryptedText: string; key: Integer): string;
  165. var
  166.   numbers: TArray<Integer>;
  167.   decryptedNumbers: TArray<Integer>;
  168.   inverseKey: Integer;
  169.   i: Integer;
  170. begin
  171.   numbers := TextToNumbers(encryptedText, ord('A'));
  172.   inverseKey := ModInverse(key, 26);
  173.   if inverseKey = -1 then
  174.   begin
  175.     ShowMessage('Невозможно найти обратный ключ.');
  176.     Exit('');
  177.   end;
  178.   SetLength(decryptedNumbers, Length(numbers));
  179.   for i := 0 to Length(numbers) - 1 do
  180.     decryptedNumbers[i] := (numbers[i] * inverseKey) mod 26;
  181.   Result := NumbersToText(decryptedNumbers, Ord('A'), 26);
  182. end;
  183.  
  184. procedure CheckAndCorrectText(var Text: TMemo; Lang: TLanguage);
  185. var
  186.     I, J: Integer;
  187.     Buf: String;
  188.     A: Char;
  189.     B: Integer;
  190. begin
  191.  
  192.     for I := 0 to Text.Lines.Count - 1 do
  193.     begin
  194.         Buf := '';
  195.         for J := 1 to Length(Text.Lines[I]) do
  196.         begin
  197.             case (Lang) of
  198.                 TRus:
  199.                 begin
  200.                     A := Text.Lines[i][j];
  201.                     B := Ord(A);
  202.                     if (B = 1025) or (B = 1105) or ((B >= 1040) and (B <= 1103)) or (B = 32) then
  203.                     begin
  204.                         Buf := Buf + Text.Lines[I][J];
  205.                     end;
  206.                 end;
  207.                 TEng:
  208.                 begin
  209.                     if (Text.Lines[I][J] in ['A'..'Z','a'..'z', ' ']) then
  210.                     begin
  211.                         Buf := Buf + Text.Lines[I][J];
  212.                     end;
  213.                 end;
  214.             end;
  215.         end;
  216.         Text.Lines[i] := (Buf);
  217.     end;
  218. end;
  219.  
  220. procedure TForm_TI_1.ButInstructionClick(Sender: TObject);
  221. begin
  222.     ShowMessage('Метод децимаций: текст на английском, ключ - число. Алгоритм Виженера: текст на русском, ключ - слово.');
  223. end;
  224.  
  225. procedure TForm_TI_1.ButOpenFileClick(Sender: TObject);
  226. var
  227.     Path, InputStr, Error: String;
  228.     F: TextFile;
  229.     IsCorrect: Boolean;
  230. begin
  231.     if (OpenDialog.Execute) then
  232.     begin
  233.         Path := OpenDialog.FileName;
  234.         AssignFile(F, Path);
  235.         try
  236.             Reset(F);
  237.             try
  238.                 while not(EoF(F)) do
  239.                 begin
  240.                     Readln(F, InputStr);
  241.                     if not(InputStr.IsEmpty) then
  242.                     begin
  243.                         MemoPlainText.Lines.Insert(MemoPlainText.Lines.Count, UTF8ToAnsi(InputStr));
  244.                     end;
  245.                 end;
  246.             finally
  247.                 CloseFile(F);
  248.             end;
  249.         except
  250.             IsCorrect := false;
  251.             Error := 'Ошибка при считывании данных из файла. ';
  252.             ShowMessage(Error);
  253.         end;
  254.     end;
  255. end;
  256.  
  257. procedure TForm_TI_1.ButSaveFileClick(Sender: TObject);
  258. Var
  259.     F: TextFile;
  260.     Path: String;
  261.     i: integer;
  262. begin
  263.     If SaveDialog.Execute() Then
  264.     Begin
  265.         Path := SaveDialog.FileName;
  266.         AssignFile(F, Path);
  267.         Try
  268.             Rewrite(F);
  269.             Try
  270.                 for I := 0 to MemoCiphertext.Lines.Count - 1 do
  271.                     Writeln(F, MemoCiphertext.Lines[i]);
  272.             Finally
  273.                 CloseFile(F);
  274.             End;
  275.         Except
  276.             ShowMessage('Ошибка при записи!');
  277.         End;
  278.  
  279.     End;
  280. end;
  281.  
  282. procedure TForm_TI_1.ButtonDecryptionClick(Sender: TObject);
  283. var
  284.     KeyDecimation, i: Integer;
  285.     KeyVigenere, Temp: String;
  286. begin
  287.     MemoCipherText.Clear;
  288.     if (RadioButtonDecimationMethod.Checked) then
  289.     begin
  290.         CheckAndCorrectText(MemoPlaintext, TEng);
  291.         try
  292.             KeyDecimation := StrToInt(EditKey.Text);
  293.             for I := 0 to MemoPlaintext.Lines.Count - 1 do
  294.             begin
  295.                 Temp := DecryptionDecimationMethod(MemoPlaintext.Lines[i], KeyDecimation);
  296.                 MemoCiphertext.Lines.Insert(MemoCiphertext.Lines.Count, Temp);
  297.             end;
  298.         except
  299.             ShowMessage('Ошибка! Проверьте значение ключа!');
  300.         end;
  301.     end
  302.     else
  303.     begin
  304.         if (RadioButtonVigenereCipher.Checked) then
  305.         begin
  306.             CheckAndCorrectText(MemoPlaintext, TRus);
  307.             KeyVigenere := EditKey.Text;
  308.             for I := 0 to MemoPlaintext.Lines.Count - 1 do
  309.             begin
  310.                 Temp := DecryptionVigenere(MemoPlaintext.Lines[i], KeyVigenere);
  311.                 MemoCiphertext.Lines.Insert(MemoCiphertext.Lines.Count, Temp);
  312.             end;
  313.         end
  314.         else
  315.             ShowMessage('Не выбран шифр!');
  316.     end;
  317. end;
  318.  
  319. procedure TForm_TI_1.ButtonEncryptionClick(Sender: TObject);
  320. var
  321.     KeyDecimation, i: Integer;
  322.     KeyVigenere, Temp, A: String;
  323. begin
  324.     MemoCipherText.Clear;
  325.     if (RadioButtonDecimationMethod.Checked) then
  326.     begin
  327.         CheckAndCorrectText(MemoPlaintext, TEng);
  328.         try
  329.             KeyDecimation := StrToInt(EditKey.Text);
  330.             for I := 0 to MemoPlaintext.Lines.Count - 1 do
  331.             begin
  332.                 Temp := EncryptionDecimationMethod((MemoPlaintext.Lines[i]), KeyDecimation);
  333.                 MemoCiphertext.Lines.Insert(MemoCiphertext.Lines.Count, Temp);
  334.             end;
  335.         except
  336.             ShowMessage('Ошибка! Проверьте значение ключа!');
  337.         end;
  338.     end
  339.     else
  340.     begin
  341.         if (RadioButtonVigenereCipher.Checked) then
  342.         begin
  343.             CheckAndCorrectText(MemoPlaintext, TRus);
  344.             KeyVigenere := EditKey.Text;
  345.             for I := 0 to MemoPlaintext.Lines.Count - 1 do
  346.             begin
  347.                 A :=  MemoPlaintext.Lines[i];
  348.                 Temp := EncryptionVigenere(A, KeyVigenere);
  349.                 MemoCiphertext.Lines.Insert(MemoCiphertext.Lines.Count, Temp);
  350.             end;
  351.         end
  352.         else
  353.             ShowMessage('Не выбран шифр!');
  354.     end;
  355. end;
  356.  
  357. procedure TForm_TI_1.EditKeyChange(Sender: TObject);
  358. begin
  359.     if (EditKey.Text <> '') then
  360.     begin
  361.         ButtonEncryption.Enabled := true;
  362.         ButtonDecryption.Enabled := true;
  363.     end
  364.     else
  365.     begin
  366.         ButtonEncryption.Enabled := false;
  367.         ButtonDecryption.Enabled := false;
  368.     end;
  369. end;
  370.  
  371. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement