Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2013, 02:27   #1
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию Шифр Хасегава

Привет. Помогите пожалуйста с решением такого вот задания на дельфи (извините, но на русском - нет, а переводить - я боюсь, что может потеряться смысл):
на мові Object Pascal в системі програмування Delphi зробити програму «Шифр Хасегава», яка виконує шифрування та дешифрування за алгоритмом Хасегава. При шифруванні кожному символу початкового відкритого повідомлення привласнюється його порядковий номер в алфавіті, після чого обирається ключ і його символи підписуються під символами початкового відкритого повідомлення з послідовним повторюванням ключу. Символам ключу також привласнюються порядкові номери за алфавітом, після чого вони складаються з відповідними символами повідомлення і отримані номери переводяться в символи початкового алфавіту. Відповідно, при перевищенні порядковим номером символу довжини алфавіту треба відняти довжину алфавіту. При дешифруванні виконати зворотні операції.

Примерный перевод:
Реализовать программу, которая будет шифровать и расшифровывать по алгоритму Хосегава. При шифровании каждому символу начального открытого сообщения присваивается его порядковый номер в алфавите, после чего выбирается ключ и его символы переписываются под символами начального открытого сообщения с последовательным повторением ключа. Символам ключа также присваиваются порядковые номера по алфавиту, после чего они складываются с соответствующими символами сообщения и полученные номера переводятся в символы начального алфавита. Соответственно, при перемещении порядковым номером символа длинны алфавита нужно отнять длину алфавита. При дешифрации выполнить обратные действия.
viks1 вне форума Ответить с цитированием
Старый 11.04.2013, 07:08   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

В чём, собственно, проблема?
Sibedir вне форума Ответить с цитированием
Старый 11.04.2013, 13:22   #3
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
В чём, собственно, проблема?
Немогу реализовать
viks1 вне форума Ответить с цитированием
Старый 11.04.2013, 13:22   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Соответственно, при перемещении порядковым номером символа длинны алфавита нужно отнять длину алфавита.
ошибка при переводе на русский:
должно быть:
Соответственно, при превышении порядковым номером символа длины алфавита нужно отнять длину алфавита.

А по сути и правда, задачка проще пареной репки!
Что у Вас не получается то?
Не знаете, как для символа C1 получить его порядковый номер в алфавите?
это делается либо так:
Код:
НомерСимвола := ord(C1)-ord('А')+1;
либо так:
Код:
const Alphabet = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';

НомерСимвола := Pos(C1, Alphabet);
Внимание! Решение данной задачи зависит от используемого алфавита.
Предварительно нужно определиться, какие символы составляют исходный алфавит, далее отталкиваться от этого! Например, в показанный выше примерах может быть обработан ТОЛЬКО текст, записанный ПРОПИСНЫМИ русскими буквами!
Для остальных символов данный алгоритм шифрования даст сбой (ну, например, если в тексте встретися цифра, или тире, или знак @ - то какой номер данного символа в алфавите возьмёт программа?!)
Разумеется, алфавит может быть расширен на все возможные (допустимые в открытом тексте) символы.
Например, так:

Код:
const Alphabet = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'+
   'абвгдежзийклмнопрстуфхцчшщъыьэюя' + 
   '.,-()[]!?0123456789';
...

НомерСимвола := Pos(C1, Alphabet);

Цитата:
Сообщение от viks1
Немогу реализовать
это несерьёзно!
Что Вы пытались сделать, чтобы реализовать эту простенькую задачу? Где Ваши попытки? Наработки в виде кода?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.04.2013, 17:40   #5
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию

http://adminland.ru/node/395

все дело в том что надо самому присваивать номер, потом как то из расписать, подписать и приплюсовать в результате.

Я знаю как присвоить, но как их потом сравнивать и вообще какой алгоритм , последовательность ничего не могу придумать
viks1 вне форума Ответить с цитированием
Старый 13.04.2013, 17:47   #6
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Что Вы пытались сделать, чтобы реализовать эту простенькую задачу? Где Ваши попытки? Наработки в виде кода?
Мои попытки были неудачными.

Сначала я хотел по букве загонять в динамический массив.
Потом решил создать 2 массива, и тупо вручную через цикл прибавлять их присвоенный индекс.
т.е работать не с буквами , а с цифрами сразу.

Все упирается в такие мелочи как:

Как в строке индекс считать, ну например мне нужен символ 5 индекса.
Если это например "А" то в массив 0-й элемент пойдет индекс 1, и тд... 5-я буква "В" значит в 4-й элемент пойдет индекс буквы 3

потом во втором массиве просто, ключ таким же образом прогнать

Потом опять через цикл прогонять один массив с другим и приплюсовывать как по алгоритму шифра, учитывая все условия.
viks1 вне форума Ответить с цитированием
Старый 14.04.2013, 17:37   #7
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию

Код:
         type
    mass = array of integer;
    Str = String;
    int = integer;
var
  Form1: TForm1;
  index: array [1 .. 31] of char = ('А', 'Б', 'В', 'Г', 'Д', 'Ж', 'З', 'И',
    'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч',
    'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я');
    W,K:String;
    i:integer;
    j: integer;
    cod:mass;
    textout:string;

implementation

{$R *.dfm}
//Для индекса алфавита ___________________________
function GetcharIndex(c: char): integer;
begin
   result:=0;
    for j := 1 to 31  do begin
        if w[i]=index[j] then begin
          result:=j;
          break
        end;
    end;
end;

function GetcharOut(index :integer):char;
begin
  for j := 1 to 31 do
    begin
      if cod[i]=j then
         begin
           textout:=index[j];
           break
         end;
    end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  indata:mass; // буквы в индексы
  inkey:mass;    // ключ в индекс
  Lh:int;        //длина массива
  p,n:int;       //позиция
  temp:str;       //временное значение
  myind:integer;  //индекс
  buf:integer;     //еще одна временная , зачем я не помню
begin
//Добавляем в массив индекс букв сообщения____
  W:=Edit1.Text;   //sms
  Lh:=Length(W);
  SetLength(indata, Lh);
  p:=0;
  for i := 1  to Lh do
   begin
    myind:=GetcharIndex(index[j]);
    indata[p]:=myind;
    p:=p+1;
   end;
//Добавляем в массив индекс букв ключа________
  K:=Edit3.Text;   //key
  Lh:=Length(K);
  SetLength(inkey, Lh);
  p:=0;
  for i := 1  to Lh do
   begin
    myind:=GetcharIndex(index[j]);
    inkey[p]:=myind;
    p:=p+1;
   end;
//Добавляем в массив шифрованный код___________
  n:=0;
  for i := 0 to Length(indata)-1 do
    begin

    buf := indata[i]+inkey[n];
    if buf>31 then
    cod[i]:=buf-31 else
    cod[i]:=buf;
    if n=Length(inkey)-1 then
    n:=0 else inc(n);
    end;
//_______________________________________________
   for i := 0 to Length(indata)-1 do
     begin
      Edit3.Text:=VarToStr(GetcharOut(cod[i]));
     end;
end;
в выделенной строке выбивает ошибку
array type required
что это значит?
гуглил, не понял...
viks1 вне форума Ответить с цитированием
Старый 14.04.2013, 17:39   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

index типа integer, Вы же пытаетесь обратиться к j-ому элемента массива index (как к массиву).
Параметр функции GetcharOut перекрывает глобальную переменную index.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 14.04.2013, 17:42   #9
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
index типа integer, Вы же пытаетесь обратиться к j-ому элемента массива index (как к массиву).
Параметр функции GetcharOut перекрывает глобальную переменную index.
та он вообще весь не работает.. ппц(
viks1 вне форума Ответить с цитированием
Старый 14.04.2013, 17:52   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Набросал:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  alplen: integer;

const
  alp = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';

implementation

{$R *.dfm}

function encrypt(const text, key: string): string;
var
  i, p1, p2, len: integer;
  s: string;
begin
  s := text;
  len := length(key);
  for i := 1 to length(text) do
  begin
    p1 := pos(text[i], alp);
    if p1 = 0 then
      continue;
    p2 := pos(key[(i - 1) mod len + 1], alp);
    s[i] := alp[(p1 + p2 - 1) mod alplen + 1];
  end;
  result := s;
end;

function decrypt(const text, key: string): string;
var
  i, p1, p2, len: integer;
  s: string;
begin
  s := text;
  len := length(key);
  for i := 1 to length(text) do
  begin
    p1 := pos(text[i], alp);
    if p1 = 0 then
      continue;
    p2 := pos(key[(i - 1) mod len + 1], alp);
    s[i] := alp[(p1 - p2 - 1 + alplen) mod alplen + 1];
  end;
  result := s;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit3.text := encrypt(Edit1.text, Edit2.text);
  Edit4.text := decrypt(Edit3.text, Edit2.text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  alplen := length(alp);
end;

end.
Можно еще проверок добавить, а так, вроде, то, что нужно.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 14.04.2013 в 17:55.
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифр SYSSI Безопасность, Шифрование 4 13.05.2011 19:00
Шифр? KoBRaAndrey Работа с сетью в Delphi 0 12.12.2009 16:16
Шифр Progs1024 Паскаль, Turbo Pascal, PascalABC.NET 9 12.10.2009 19:51
че за шифр? Анастасия123456789 Помощь студентам 4 11.05.2009 19:19
Шифр Razora Свободное общение 10 26.06.2007 15:52