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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2008, 19:11   #1
Karyuudo
Пользователь
 
Регистрация: 17.02.2008
Сообщений: 53
По умолчанию Аффинная система подстановок Цезаря

Подробности о методе можно узнать например тут:
http://crypto-r.narod.ru/glava2/glava2_3.html
1) сделал проверку на ввод чисел а и б (чтоб взаимно простыми были)
2) так же сделал шифрование по этому алгоритму, e=a*t+b
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
nod;
if b<>1 then
begin
showmessage (' НОД должен быть >1');
edit1.text:='';
edit2.text:='';
exit
end
else
begin
s:=memo1.text;
a:=strtoint(edit1.text);
b:=strtoint(edit2.text);
for i:=1 to length(s)do
if ((ord(s[i])*a)+b)>256 then
begin
j:=((ord(s[i])*a)+b);
while j>256 do
j:=j-256;
s[i]:=chr(j);
end
else
s[i]:=chr((ord(s[i])*a)+b)
end;
memo2.text:=s;
end;
где мемо1 исходный текст, мемо2 зашифрованный, едит1=а, эдит2=б, нод - процедура вызова для расчета НОД.
а теперь нужно каким то образом сделать обратное, а вот как немогу придумать, потому прошу о помощи
Karyuudo вне форума Ответить с цитированием
Старый 01.04.2008, 20:00   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вы вот это сами писали?
kod:=ord(s[i])*a)+b
А обратную операцию "придумать" не можете?
(kod-b)/a
Впредь пишите все сами и все будет тип-топ...
mihali4 вне форума Ответить с цитированием
Старый 01.04.2008, 20:21   #3
Karyuudo
Пользователь
 
Регистрация: 17.02.2008
Сообщений: 53
По умолчанию

да, сам писал все, щас пока придумал выход но очень запутанный через массивы.. постоянно куча ошибок

а то что вы написали пробовал - не помогает
сами ведь посмотрите:
kod:=ord(s[i])*a)+b допустим s[i]=200, а=5,б=9 тогда:
код:=200*5+9=1009, потом постоянно начинает вычитаться 256, пока не будет ниже чем 256 т.е.
1009-256-256-256=241

А обратную операцию "придумать" не можете?
(kod-b)/a = (241-9)/5=46,4 что <>200
Karyuudo вне форума Ответить с цитированием
Старый 01.04.2008, 20:26   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var s, s1, s2:String;
    a, b, m, i, k:integer;
begin
   s := 'qwertyuiopasdfghjkl;zxcvbnm,.лпдралвфжлпавыолфоал0123456789';
   a := 3;
   b := 5;
   m := 256;  // a & m взаимно простые

   // шифрование  s --> s1
   s1 := s;
   for i:=1 to length(s) do begin
      s1[i] := chr( (ord(s[i])*a+b) mod m);
   end;

   // обратно s1 --> s2
   s2 := s1;
   for i:=1 to length(s1) do begin
      k := ord(s1[i]);
      while (k - b) mod a > 0 do k := k+m;
      s2[i] := chr((k - b) div a);
   end;

   if s2 = s then label1.caption := 'правильно'
end;
Поэтому нужно условие a и m взаимно простые. Это гарантирует, что найдется число k такое, что (k - b) mod a = 0 и при том единственное.

На всякий случай. Не нужно помещать зашифрованный текст в memo. Если есть желание на него посмотреть, лучше сохранить в файл.

Последний раз редактировалось alexBlack; 01.04.2008 в 20:39.
alexBlack вне форума Ответить с цитированием
Старый 01.04.2008, 20:44   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
(kod-b)/a = (241-9)/5=46,4 что <>200
Ну так, появление дробного числа однозначно свидетельствует о том, что это - не подлинный символ, следовательно, нужно прибавить 256, и так до тех пор, пока не получим "нормальный" символ.
Ведь нужно учитывать, что лишние символы образуются при каждом вычитании 256-ти во время кодирования).
Посмотрите ваш код:
while j>256 do
j:=j-256;
s[i]:=chr(j);
end

Последний раз редактировалось mihali4; 01.04.2008 в 20:58.
mihali4 вне форума Ответить с цитированием
Старый 01.04.2008, 20:52   #6
Karyuudo
Пользователь
 
Регистрация: 17.02.2008
Сообщений: 53
По умолчанию

во, через массивы получилось сделать!
вот только с ошибкой при некоторых ключах например 20/21
при создании массив заметил что есть повторяющееся символы
например символ с номером 50 шифруется как 253
т.е. 1021-256*3
а так же с номером 242, т.е. 4861-256*18=253... вполне вероятно что есть еще ошибки

Последний раз редактировалось Karyuudo; 01.04.2008 в 21:32.
Karyuudo вне форума Ответить с цитированием
Старый 01.04.2008, 21:43   #7
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Karyuudo Посмотреть сообщение
во, через массивы получилось сделать!
вот только с ошибкой при некоторых ключах например 20/21
при создании массив заметил что есть повторяющееся символы
например символ с номером 50 шифруется как 253
т.е. 1021-256*3
а так же с номером 242, т.е. 4861-256*18=253... вполне вероятно что есть еще ошибки

20*50+21=1021, т.е. a*50+b -> a = 20

Но, ведь 20 и 256 не взаимно простые, поэтому и повторы

Цитата:
сделал проверку на ввод чисел а и б (чтоб взаимно простыми были)
Не a и b, но a и m

В нашем случае m = 256

Последний раз редактировалось alexBlack; 01.04.2008 в 21:51.
alexBlack вне форума Ответить с цитированием
Старый 01.04.2008, 21:53   #8
Karyuudo
Пользователь
 
Регистрация: 17.02.2008
Сообщений: 53
По умолчанию

спасибо! невнимательный я.. все думаю что тут не то... так оказывается буквы перепутал
Karyuudo вне форума Ответить с цитированием
Старый 07.12.2008, 01:46   #9
новенькая
 
Регистрация: 27.05.2008
Сообщений: 9
По умолчанию

Решите пожалуйста мне задачку по аффинной подстановке цезаря. надо зашифровать фразу.
почти блондинка
новенькая вне форума Ответить с цитированием
Старый 10.01.2009, 07:03   #10
elsin
Пользователь
 
Регистрация: 10.05.2008
Сообщений: 36
По умолчанию

Аффинная система подстановок Цезаря - Функция для шифрования. Будет работать и в D2009.

Код:
function Afinna_Crypt(s:String;a:integer;b:integer;m:integer):string;
const
  SizeA = 93; //Размер алфавита
//Алфавит
RusA = ' !%()*+,-./0123456789:;<=>?^№абвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'; 
var i, P,t:integer;
    temp:String;
begin
temp:='';
//удаление символов сообщения, не входящих в алфавит
for i := 1 to length(s) do if pos(s[i],RusA)<>0 then temp:=temp+s[i];
s:=temp;
for i:=1 to length(s) do
  begin
  P:=pos(s[i],RusA);      
   t:=((P*a+b) mod m);
   s[i]:=RusA[t];
   end;
   Result:=s;
end;
elsin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отображение в форме и таблице двух столбцов подстановок smoky Microsoft Office Access 5 01.07.2008 09:27
Проблема со столбцом подстановок. Hellell Microsoft Office Access 1 08.01.2008 02:13
Алгоритм Цезаря ***СкаЙ*** Помощь студентам 2 27.04.2007 02:40
Помогите с алгоритмом Цезаря!!! Пожалуйста ***СкаЙ*** Помощь студентам 6 05.04.2007 11:10