1 / 1 / 0
Регистрация: 02.10.2009
Сообщений: 159
1

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

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

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

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

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

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

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

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2012, 22:13
Ответы с готовыми решениями:

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

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

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

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

14
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
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
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
02.12.2012, 01:52 3
Вот шифрование при прямом заполнении массива.
Только в вашем примере текст в таблицу занесен без пробелов. Но тогда и расшифрованный текст будет без пробелов. Я делал со всеми знаками и пробелами. Поэтому результат немного отличается, поскольку размерность массива получается другая.
Выясните у преподавателя, как правильно.
Вложения
Тип файла: rar Шифрование через таблицу.rar (166.6 Кб, 311 просмотров)
1
1 / 1 / 0
Регистрация: 02.10.2009
Сообщений: 159
02.12.2012, 02:37  [ТС] 4
спасибо большое! думаю, будет лучше как по примеру. без пробелов, мне кажется так проще или нет? сделайте так проще..а там я выкручусь.
0
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
02.12.2012, 02:42 5
Для программирования разницы, практически, нет. Пускай будет с пробелами. Шифрует и расшифрует и код можно предъявить. Если что вставите после занесения исходного текста в переменную s:
Delphi
1
s:=StringReplace(s, ' ','',[rfReplaceAll, rfIgnoreCase]);
Эта строка удалит все пробелы из строки в переменной s.
1
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
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
02.12.2012, 14:46 7
Я только освободился. Сейчас займусь спиралью.
0
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
02.12.2012, 16:35 8
Вот, вроде всё работает. Проверяйте.
Вложения
Тип файла: rar Шифрование через таблицу.rar (1.41 Мб, 335 просмотров)
3
1 / 1 / 0
Регистрация: 02.10.2009
Сообщений: 159
02.12.2012, 16:37  [ТС] 9
а можете скинуть скриншот, у меня текст весь в знаках вопроса?

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


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

спасибо вам огромное!
0
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
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
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
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
Заблокирован
16.12.2012, 16:42 13
Ну я бы написал одну универсальную функцию с одним циклом. Она бы шифровала и расшифоровывала любым способом, начиная с любого угла прямоугольника, поскольку не все фразы уместятся в квадрат, с любым кручением, левым или правым. По семофорам. A в качестве отправной точки, лепил, к строке в качестве идентификатора букву.
А что касается пробелов. Чтоб утереть нос преподу, то сделал бы возможность удалять их их их фразы, вместе со знаками препинания.
Да, и таблица совсем не нужна. Здесь нужен двумерный динамический массив.
0
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
16.12.2012, 22:31 14
МаргаритаC: Извините, сегодня на форуме почти не был. Увидел вопрос только сейчас. Вот примерно так выполняется заполнение (4 цикла по сторонам прямоугольника):
Миниатюры
Шифрование перестановкой букв  
1
0 / 0 / 1
Регистрация: 17.11.2015
Сообщений: 12
19.01.2016, 23:41 15
Простите, что прошу...Но мне понравился Ваш шифратор! И мне интересно узнать как можно было бы сделать так, чтобы:
- Выделенная часть отображалась как в нарисованной мной таблице (тоесть меняются местами 2 и 3 столбец)
- Чтобы вводимый текст не изменялся в строке расшифровки (тоесть: вводим 1111222233334444, получаем 1234123412341234 и последнее не изменяется в расшифрованной строке при изменении столбцов в таблице)

Если Вы всё же захотите помочь, не могли бы Вы, указать где именно Вы изменяли код для этого? Интересно знать как работает Ваша программа, спасибо!
Миниатюры
Шифрование перестановкой букв   Шифрование перестановкой букв  
0
19.01.2016, 23:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.01.2016, 23:41
Помогаю со студенческими работами здесь

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

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

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

Шифрование перестановкой
Доброго времени суток. Имеется вот такая кодовая строка - 1071 32 1087 1086 1084 1085 1102 32...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru