Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
МаргаритаC
1 / 1 / 0
Регистрация: 02.10.2009
Сообщений: 159
#1

Шифрование перестановкой букв

30.11.2012, 22:13. Просмотров 3797. Ответов 14
Метки нет (Все метки)

таблицы простых шифрующих процедур перестановки букв в сообщении. секретом (ключом) здесь служит размер страницы.

например ВЫСТУПАЙТЕ НА РАССВЕТЕ записывали по столбцам в таблицу из 4 строк и 5 столбцов. (см.рис 1)
итог ВУТР ВЫПЕ АЕСА НСТТ ЙАСЕ

второе задание исходный текст записать по спирали в таблицу. итог ВАРА НЫСЕ ТЕСС ВЕТТ УПАЙ (см рис 2)

выглядеть программа должна как на рисунке 3. по виду не сложная
я понимаю что мне сейчас просто так никто ничего не решит, мне просто надо понять как ее делать.с чего начинать.
подскажите пожалуйста!

получается, например в первом случае надо процедурой создать таблицу, поместить в каждую ячейке по букве, потом вывести буквы из каждого столбца сверху вниз.
как это все провернуть не представляю. и еще как создать таблицу зная только количество столбцов или строк.
0
Миниатюры
Шифрование перестановкой букв   Шифрование перестановкой букв   Шифрование перестановкой букв  

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2012, 22:13
Ответы с готовыми решениями:

Шифрование перестановкой
Ребята, помогите пожалуйста, никак не могу понять, что не так с программой:(...

Совпадение букв двух слов.Перестановкой букв
Задание выглядит так: Ввести два слова.Выяснить можно ли получить второе слово...

Шифрование перестановкой. Матрица из 4 столбцов
Подскажите, в чем ошибка? смысл заключается в том, что нужно написать программу...

Шифрование с перестановкой больше 9 символов
Нужно написать программу - Шифрование с перестановкой Написал, но только...

Шифрование текста методом замены букв
Помогите написать код: при нажатии на кнопку в окне memo должны меняться...

14
Одиночка
3933 / 1858 / 337
Регистрация: 16.03.2012
Сообщений: 3,869
01.12.2012, 20:36 #2
Вы уже не первый день программируете, значит форму сделаете сами. Количество другой размерности можете рассчитать по первой размерности и длине текста:
Delphi
1
2
Razm2:=(Length(s)+Razm1-1) Div Razm1;
SetLength(Arr,Razm1,Razm2);
А при работе с массивом можете либо использовать эти переменные Razm, либо так:
Delphi
1
2
For i:=0 To Length(Arr[0])-1 Do
For j:=0 To Length(Arr)-1 Do
Зашифровать в первом случае можно так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
k:=1;
//Занесли в массив (таблицу) по столбцам...
For i:=0 To Length(Arr)-1 Do
For j:=0 To Length(Arr[0])-1 Do
Begin
  Arr[i,j]:=s[k];
  Inc(k);
End;
//Прочитаем по строкам...
k:=1;
For j:=0 To Length(Arr[0])-1 Do
For i:=0 To Length(Arr)-1 Do
Begin
  s[k]:=Arr[i,j];
  Inc(k);
End; //В s получился зашифрованный текст
Ну а как занести по спирали - на форуме, по-моему, были такие темы.

Добавлено через 32 минуты
Вот так можно заполнить массив по спирали:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
r:=0;//расстояние от края до строки(столбца)
k:=0;
repeat
  inc(r);
  for i:=r to Razm2-r+1 do
  If k<Length(s) Then
  begin inc(k);Arr[r-1,i-1]:=s[k] end; //вправо
  for i:=r+1 to Razm1-r+1 do
  If k<Length(s) Then
  begin inc(k);Arr[i-1,Razm2-r]:=s[k] end; //вниз
  for i:=Razm2-r downto r do
  If k<Length(s) Then
  begin inc(k);Arr[Razm1-r,i-1]:=s[k] end;//влево
  for i:=Razm1-r downto r+1 do
  If k<Length(s) Then
  begin inc(k);Arr[i-1,r-1]:=s[k] end;//вверх
until (k=Razm1*Razm2) Or (k>=Length(s));//дошли до центра или конец строки
Я, кстати, забыл написать, что массив типа Char:
Delphi
1
Arr : Array Of Array Of Char;
1
Одиночка
3933 / 1858 / 337
Регистрация: 16.03.2012
Сообщений: 3,869
02.12.2012, 01:52 #3
Вот шифрование при прямом заполнении массива.
Только в вашем примере текст в таблицу занесен без пробелов. Но тогда и расшифрованный текст будет без пробелов. Я делал со всеми знаками и пробелами. Поэтому результат немного отличается, поскольку размерность массива получается другая.
Выясните у преподавателя, как правильно.
1
Вложения
Тип файла: rar Шифрование через таблицу.rar (166.6 Кб, 272 просмотров)
МаргаритаC
1 / 1 / 0
Регистрация: 02.10.2009
Сообщений: 159
02.12.2012, 02:37  [ТС] #4
спасибо большое! думаю, будет лучше как по примеру. без пробелов, мне кажется так проще или нет? сделайте так проще..а там я выкручусь.
0
Одиночка
3933 / 1858 / 337
Регистрация: 16.03.2012
Сообщений: 3,869
02.12.2012, 02:42 #5
Для программирования разницы, практически, нет. Пускай будет с пробелами. Шифрует и расшифрует и код можно предъявить. Если что вставите после занесения исходного текста в переменную s:
Delphi
1
s:=StringReplace(s, ' ','',[rfReplaceAll, rfIgnoreCase]);
Эта строка удалит все пробелы из строки в переменной s.
1
МаргаритаC
1 / 1 / 0
Регистрация: 02.10.2009
Сообщений: 159
02.12.2012, 14:45  [ТС] #6
теперь я хотела сделать шифрование по спирали, но у меня не вышло((
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
procedure TForm1.Button1Click(Sender: TObject);
Var
  m,n,i,j,k,r,Razm2,Razm1 : Integer;///добавила переменные 
  s : String;
begin
If Radiobutton1.Checked = True then 
begin
  If Edit1.Text='' Then Exit; 
  ///тут код нетронут.  
  
end
 
else
If Radiobutton2.Checked = True then
begin
Razm2:=(Length(s)+Razm1-1) Div Razm1;
SetLength(Arr,Razm1,Razm2);
 
 
 If Edit1.Text='' Then Exit; 
  s:=Edit1.Text; 
  n:=StrToIntDef(Edit2.Text,5); 
  m:=(Length(s)+(n-1)) Div n; 
  Edit4.Text:=IntToStr(m);
  SetLength(Arr,m,n); 
 
  For i:=0 To m-1 Do
  For j:=0 To n-1 Do
  Arr[i,j]:=Char(0);
 
 
  r:=0;
k:=0;
repeat
  inc(r);
  for i:=r to Razm2-r+1 do
  If k<Length(s) Then
  begin inc(k);Arr[r-1,i-1]:=s[k] end; 
  for i:=r+1 to Razm1-r+1 do
  If k<Length(s) Then
  begin inc(k);Arr[i-1,Razm2-r]:=s[k] end; //программа останавливается и выделяет синим цветом эту строку.
  for i:=Razm2-r downto r do
  If k<Length(s) Then
  begin inc(k);Arr[Razm1-r,i-1]:=s[k] end;
  for i:=Razm1-r downto r+1 do
  If k<Length(s) Then
  begin inc(k);Arr[i-1,r-1]:=s[k] end;
until (k=Razm1*Razm2) Or (k>=Length(s));
 end;
end;
0
Одиночка
3933 / 1858 / 337
Регистрация: 16.03.2012
Сообщений: 3,869
02.12.2012, 14:46 #7
Я только освободился. Сейчас займусь спиралью.
0
Одиночка
3933 / 1858 / 337
Регистрация: 16.03.2012
Сообщений: 3,869
02.12.2012, 16:35 #8
Вот, вроде всё работает. Проверяйте.
3
Вложения
Тип файла: rar Шифрование через таблицу.rar (1.41 Мб, 298 просмотров)
МаргаритаC
1 / 1 / 0
Регистрация: 02.10.2009
Сообщений: 159
02.12.2012, 16:37  [ТС] #9
а можете скинуть скриншот, у меня текст весь в знаках вопроса?

или просто скажите что за checkbox? вроде так называется..остальное и так понятно что написано там должно быть


все разобралась, это пробелы)))))

спасибо вам огромное!
0
МаргаритаC
1 / 1 / 0
Регистрация: 02.10.2009
Сообщений: 159
11.12.2012, 14:13  [ТС] #10
Шифрование.
по столбцам все ясно, по спирали не очень цикл repeat for for for inc(r)
как он работает, не могу понять. сначала первый for потом inc(r) потом опять
первый?..

зачем в строчке until есть k=m*n. если убрать ее все работает вроде. то есть цикл прекращается
по окончанию строки и все.

Дешифрование.
кучу всего непонятного.
зачем 2 части кода по очищению массива, и отмечанию незаполненных частей, эти циклы похожи на запись в массив а не на очищение,
так как там есть присвоение Arr[r,i]=s[k] что тогда присваивается там.

я правильно понимаю, что Arr[r,i]=s[k] это тоже самое что и Arr[r,i]=Char(1)?? если да, то char(1) это как бы сказать текущий элемент?


и дальше идет запись в массив по столбца и чтение по столбцам, а по спирали есть только чтение, почему?
0
Одиночка
3933 / 1858 / 337
Регистрация: 16.03.2012
Сообщений: 3,869
11.12.2012, 20:38 #11
Шифрование.
по столбцам все ясно, по спирали не очень цикл repeat for for for inc(r)
как он работает, не могу понять. сначала первый for потом inc(r) потом опять
первый?..
Там идёт заполнение четырёх сторон прямоугольника, и, соответственно 4 цикла. Переменная r - расстояние до заполняемых сторон прямоугольника от соответствующего края матрицы. Заполнили все стороны прямоугольника r увеличили на 1 - заполняем следующий, на 1 дальше от края сторон матрицы.
Заполнение начинается с левого верхнего угла матрицы. Первый цикл заполняет левый столбец вниз. Второй цикл заполняет нижнюю сторону вправо. Третий - правый столбец вверх. Четвёртый - верхнюю сторону влево. Это выглядит так:
r=0
144444443 r=1
100000003 1444443 r=2
100000003 1000003 12222
100000003 1222222
122222222
Соответственно рассчитываются начальный и конечный индексы циклов.

зачем в строчке until есть k=m*n. если убрать ее все работает вроде. то есть цикл прекращается
по окончанию строки и все.
В вашем случае эта проверка действительно не нужна, поскольку размерность матрицы заведомо превышает или равна длине строки. Можно убрать. А вообще, если бы строка была длиннее размерности матрицы, то это выход из цикла при полном заполнении матрицы. Это осталось с того примера, от которого я отталкивался.

Добавлено через 20 минут
Дешифрование.
зачем 2 части кода по очищению массива, и отмечанию незаполненных частей, эти циклы похожи на запись в массив а не на очищение,
так как там есть присвоение Arr[r,i]=s[k] что тогда присваивается там.
Очистка массивов при дешифровании это не такой простой вопрос. Например, если размерность матрицы m*n больше длины строки тогда при шифровании в матрице остаются пустые ячейки, которые пропускаются при формировании выходной строки. Причём, если мы исходный текст записываеи по столбцам - пустыми может оказаться часть ячеек предпоследнего столбца и весь последний столбец. Теперь при выборке по строкам эти пустые ячейки могут оказаться в разных местах выходной строки.
Теперь нам для дешифрации нужно зашифрованный текст вставить по строкам, а считать по столбцам. Чтобы всё правильно считалось - мы должны так же вставить пустые ячейки на те места, где они были при шифровании. Вот для этого при очистке массива для дешифрования определяются пустые ячейки путём заполнения матрицы, как и при шифровании (длина строки то осталась прежней). Только вместо символов строки - заносится код 1. Матрица символьная - значит преобразуем в Char(1). А на места пустых ячеек вставляется Char(0) = 0. Теперь при заполнении матрицы в порядке выборки результирующей строки при шифровании, мы проверяем. Если ячейка содержит код 0 - мы её не заполняем.
Практически то же касается и заполнения спиралью. Только вместо Char(1) я вставил s[k] - символ из строки. Можно тоже заменить на Char(1).

Добавлено через 8 минут
и дальше идет запись в массив по столбца и чтение по столбцам, а по спирали есть только чтение, почему?
Во-первых текст там записывается по строкам. Это общий момент для обоих шифрований. Ведь при шифровании как бы мы не заполняли матрицу - результирующую строку мы читаем по строкам.
При дешифровании - обратный вариант. Записываем по строкам - читаем в соответствии с методом - либо по столбцам, либо по спирали.
0
МаргаритаC
1 / 1 / 0
Регистрация: 02.10.2009
Сообщений: 159
16.12.2012, 15:33  [ТС] #12
Цитата Сообщение от Одиночка Посмотреть сообщение
r=0
144444443 r=1
100000003 1444443 r=2
100000003 1000003 12222
100000003 1222222
122222222
я извиняюсь конечно за назойливость, но сколько не смотрела на эти цифры не поняла их значения.
вот на рисунке 1. я правильно изобразила то как заполняются клетки? сначала красный прямоугольник потом рыжий?
на рис 2..тогда как заполняются углы, они же принадлежат 2ум сторонам прямоугольника? они дублируются что ли?
0
Миниатюры
Шифрование перестановкой букв   Шифрование перестановкой букв  
Lirrk
Заблокирован
16.12.2012, 16:42 #13
Ну я бы написал одну универсальную функцию с одним циклом. Она бы шифровала и расшифоровывала любым способом, начиная с любого угла прямоугольника, поскольку не все фразы уместятся в квадрат, с любым кручением, левым или правым. По семофорам. A в качестве отправной точки, лепил, к строке в качестве идентификатора букву.
А что касается пробелов. Чтоб утереть нос преподу, то сделал бы возможность удалять их их их фразы, вместе со знаками препинания.
Да, и таблица совсем не нужна. Здесь нужен двумерный динамический массив.
0
Одиночка
3933 / 1858 / 337
Регистрация: 16.03.2012
Сообщений: 3,869
16.12.2012, 22:31 #14
МаргаритаC: Извините, сегодня на форуме почти не был. Увидел вопрос только сейчас. Вот примерно так выполняется заполнение (4 цикла по сторонам прямоугольника):
1
Миниатюры
Шифрование перестановкой букв  
PineTea
0 / 0 / 1
Регистрация: 17.11.2015
Сообщений: 12
19.01.2016, 23:41 #15
Простите, что прошу...Но мне понравился Ваш шифратор! И мне интересно узнать как можно было бы сделать так, чтобы:
- Выделенная часть отображалась как в нарисованной мной таблице (тоесть меняются местами 2 и 3 столбец)
- Чтобы вводимый текст не изменялся в строке расшифровки (тоесть: вводим 1111222233334444, получаем 1234123412341234 и последнее не изменяется в расшифрованной строке при изменении столбцов в таблице)

Если Вы всё же захотите помочь, не могли бы Вы, указать где именно Вы изменяли код для этого? Интересно знать как работает Ваша программа, спасибо!
0
Миниатюры
Шифрование перестановкой букв   Шифрование перестановкой букв  
19.01.2016, 23:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2016, 23:41

Простое шифрование текста методом перестановки букв
Программа шифрует текст, введенный в МЕМО, методом перестановки букв, должен...

Создать программу шифровки/дешифровки (шифрование перестановкой)
создать программу шифровки дешефровки вот задание открытый текст...

Нахождение анаграмм в заданном словаре(анаграммы-слова, полученные перестановкой букв, например, корвет-вектор, сорт-рост и т. д.)
словарь хранится в текстовом файле, примерно 20000 слов; должна быть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru