Помощь - Поиск - Пользователи - Календарь
Полная версия: Шифрование с помощью квадрата Полибия на русском
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
striker
Привет.
Взял на сайте e volvo код задачи только для английского алфавита.
Переделать не получается на русский, помогите
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
	Memo1: TMemo;
	Button1: TButton;
	procedure Button1Click(Sender: TObject);
  private
	{ Private declarations }
  public
	{ Public declarations }
  end;

 const
  TPolibius: array['1' .. '8', '1' .. '8'] of char = (			   //<----ВОТ ЗДЕСЬ 
	('_', 'А', 'Б', 'В', 'Г','Д', 'Е', 'Ё'),
	('Ж', 'З', 'И','Й','К', 'Л','М', 'Н'),
	('О','П', 'Р', 'С', 'Т', 'У','Ф', 'Х'),
	('Ц','Ч', 'Ш', 'Щ','Ъ', 'Ы','Ь','Э'),
	('Ю', 'Я', '0', '1','2', '3', '4','5'),
	('6', '7', '8', '9', '(',')', '[', ']'),
	('{', '}', '.', ',', ':',';', '?', '!'),
	('-', '"', '+', '=', '№','%', '*', '/')
  );


var
  Form1: TForm1;
  s: string;

implementation

{$R *.dfm}

 function PolibiusEncipher(toCode: string): string;
var
  i: integer;
  ix, jx: char;
  s: string;
begin
  s := '';
  for i := 1 to length(toCode) do begin

	for ix := '_' to 'Ё' do
	  for jx := '_' to 'Ё' do
		if TPolibius[ix, jx] = toCode[ i ] then begin
		  s := s + ix + jx; break;
		end;

  end;
  PolibiusEncipher := s
end;

function PolibiusDecipher(toDecode: string): string;
var
  i: integer;
  s: string;
begin
  s := '';
  i := 1;
  while i <= length(toDecode) do begin
	s := s + TPolibius[toDecode[ i ], toDecode[succ(i)]];
	inc(i, 2);
  end;
  PolibiusDecipher := s
end;




procedure TForm1.Button1Click(Sender: TObject);
begin
  s := PolibiusEncipher('POLIBIUS');
//  writeln(s);
  Memo1.lines.add(s);
  Memo1.lines.add('s = '+ PolibiusDecipher(s));
end;

end.



Там где я пометил что надо написать чтобы работало для русского варианта, в оригинале там
array['A' .. 'E', 'A' .. 'E']
http://volvo71.narod.ru/faq_folder/code_text.htm
Спасибо!
volvo
Цитата
Там где я пометил что надо написать чтобы работало для русского варианта
Менять надо не только там... Вот так, например:
type
  Tfirst = '1' .. '8';
  Tsecond = '1' .. '8';
const
  TPolibius: array[Tfirst, Tsecond] of char = (
    ('_', 'А', 'Б', 'В', 'Г','Д', 'Е', 'Ё'),
    ('Ж', 'З', 'И','Й','К', 'Л','М', 'Н'),
    ('О','П', 'Р', 'С', 'Т', 'У','Ф', 'Х'),
    ('Ц','Ч', 'Ш', 'Щ','Ъ', 'Ы','Ь','Э'),
    ('Ю', 'Я', '0', '1','2', '3', '4','5'),
    ('6', '7', '8', '9', '(',')', '[', ']'),
    ('{', '}', '.', ',', ':',';', '?', '!'),
    ('-', '"', '+', '=', '№','%', '*', '/')
  );

function PolibiusEncipher(toCode: string): string;
var
  i: integer;
  ix: Tfirst; jx: Tsecond;
  s: string;
begin
  s := '';
  for i := 1 to length(toCode) do begin

    for ix :=  Low(Tfirst) to High(Tfirst) do
      for jx := Low(Tsecond) to High(Tsecond) do
        if TPolibius[ix, jx] = toCode[ i ] then begin
          s := s + ix + jx; break;
        end;

  end;
  PolibiusEncipher := s
end;

function PolibiusDecipher(toDecode: string): string;
var
  i: integer;
  s: string;
begin
  s := '';
  i := 1;
  while i <= length(toDecode) do begin
    s := s + TPolibius[toDecode[ i ], toDecode[succ(i)]];
    inc(i, 2);
  end;
  PolibiusDecipher := s
end;

procedure TForm1.Button1Click(Sender: TObject);
var s: string;
begin
  s := PolibiusEncipher('ПОЛИБИЙ');
  Memo1.lines.add(s);
  Memo1.lines.add('s = '+ PolibiusDecipher(s));
end;
Если не нравится, что сообщение кодируется цифрами, а хочется чтоб кодировалось буквами - достаточно поменять Tfirst и Tsecond:
type
  Tfirst = 'А' .. 'З';
  Tsecond = 'А' .. 'З';
, и получишь желаемое. Больше ничего в программе менять не придется.
striker
Спасибо.
Мне ещё нужно сделать из файла текст и в UpCase переводить для шифрования, но это легко, я сделал
Вот ещё 1 условие
"Каждый символ открытого текста кодируется парой чисел – номером строки и номером столбца.
Для кодирования номера строки и номера столбца используются по 3 бита."
Как его реализовать?
cooler
Тоже на сайте volvo нашёл? smile.gif
Ozzя
Цитата
Для кодирования номера строки и номера столбца используются по 3 бита."

Kod:=NomerStroki or (NomerStolbtsa shl 3);
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.