Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 06.07.2012, 15:50   #1 (permalink)
Spoke57
Новичок
 
Регистрация: 06.07.2012
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Exclamation Pascal, Delphi. Шифрование методом Льюиса

Добрый день. Хотел бы уточнить более подробно информацию по двум данным методам шифрования. Тем более, что второго метода, как я понимаю, не описано. (Разве что у него имеется второе название).
Примеры кодов у меня, в принципе, имеются, однако не помешали бы еще. Но главное, что я ищу, это теоретический материал. Т.е. всевозможные интернет статьи, хорошо описывающие данные методы и саму суть шифрования, всевозможные рефераты, курсовые и доклады по данным темам, а так же наилучший вариант книги с описанием данных методов, имеющиеся в электронном виде.
Прошу Вашей помощи, Уважаемые. Сам я начинающий программист. Однако тема шифрования (так же, соответственно, дешифрования ) меня особенно заинтересовала.
Небольшое уточнение, теоретический материал я ищу только по методу Льюиса.
Spoke57 вне форума   Ответить с цитированием

Старый 06.07.2012, 15:50
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Аналогичное уже было создано ранее, можете почитать

Помогите написать программу в Delphi Pascal
WPA-шифрование - как это настраивается?
А почему Mail.ru не использует шифрование?
Четыре лабораторные работы на Pascal или Delphi
Шифрование диска
Шифрование Wi-Fi

Старый 07.07.2012, 13:24   #2 (permalink)
Gruvi
VIP user
 
Аватар для Gruvi
 
Регистрация: 10.03.2011
Сообщений: 765
Записей в дневнике: 1
Сказал(а) спасибо: 10
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 3453
По умолчанию

Метод Льюиса, если мне не изменяет память он же Шифр Виженера. ну они идентичны.
Вот то что у себя на компе нашел
Цитата:
Шифрование методом Льюиса

Эта программа оставит символы, не присутствующие в строке Alpha_Hor без изменения. То же самое касается и заглавных букв (хотя заглавные буквы можно внести в эту самую строку).

Код:

const
len = 26;

{Это символы для выбора столбца таблицы}
alpha_hor: string = 'abcdefghijklmnopqrstuvwxyz';

{Здесь будут символы для выбора строки таблицы}
alpha_ver: string = '';

var
{Это собственно таблица кодирования}
table: array[1 .. len, 1 .. len] of char;

{функция получает строку S и возвращает строку,
полученную из исходной сдвигом на N позиций}
function shift(s: string; n: integer): string;
begin
s := copy(s, length(s) - pred(n), n) + s;
delete(s, length(s) - pred(n), n); shift := s
end;

var
i, j, row, col: integer;
s: string; ch: char;

key: string;
is_russian: boolean;
f_in: file of char; f_out, f_key: text;
begin
{ Заполнение таблицы кодировки }
for i := 1 to len do begin
{получаем строку символов для текущей строки таблицы}
s := shift(alpha_hor, pred(i));
for j := 1 to len do
table[i, j] := s[j];
{
не забываем первый символ заносить в "хранилище"
для выбора строк по кодируемой букве
}
alpha_ver := alpha_ver + s[1]
end;

{ связываем логические файлы программы с физическими файлами на диске }

{ файл с фразой для кодирования - открываем для чтения }
assign(f_in, 'f_00in.txt');
{$i-} reset(f_in); {$i+}

{ файл для сохранения результата - открываем для записи }
assign(f_out, 'f_00out.txt');
{$i-} rewrite(f_out); {$i+}

{
файл, содержащий ключевое слово - открываем для чтения,
считываем слово в строковую переменную и закрываем файл
}
assign(f_key, 'f_00key.txt');
{$i-} reset(f_key); {$i+}
readln(f_key, key);
close(f_key);

{ счетчик закодированных символов }
i := 0;
{до конца кодируемого файла делаем следующее:}
while not eof(f_in) do begin
{ читаем очередной символ }
read(f_in, ch);
{ находим по нему строку таблицы }
row := pos(ch, alpha_ver);
{
эта переменная содержит значение успеха предыдущей операции
(если True, то символ присутствует в таблице, иначе False)
}
is_russian := (row > 0);
if is_russian then begin
{ Если символ присутствует в таблице, его надо кодировать }

{ увеличиваем счетчик закодированных символов }
inc(i);

{
находим столбец по значению ключевого символа
(операция mod используется, чтобы исключить выход
за пределы ключа, т.к. длина ключа обычно меньше
длины шифруемой последовательности)
}
col := pos(key[i mod (length(key))], alpha_hor);
{ и заменяем простой символ на зашифрованный (из таблицы) }
ch := table[row, col];
end;
{
если символ надо было шифровать, он уже зашифрован,
если он не может быть зашифрован, он остался без изменений.
Пишем его в выходной файл
}
write(f_out, ch)
end;

{ И закрываем оба файла: исходный и зашифрованный }
close(f_out);
close(f_in)
end.
Цитата:
mas_alf: array[1..32] of char =

('А','Б','В','Г','Д','Е','Ж','З','И','Й','К','Л',' М','Н','О','П','Р','С

','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ь','Ы','Ъ','Э', 'Ю','Я');
tab_Vig: array[1..32,1..32] of Char;
Ну а теперь напишем код генерации таблицы:
var
i,j,k,n:integer;
begin
k:=0;
n:=k;

for i:=Ord('А')-191 to Ord('Я')-191 do
begin
k:=n+1;
for j:=Ord('А')-191 to Ord('Я')-191 do
begin
if k = 33 then
k:=1;
tab_vig[i][j]:=mas_alf[k];
k:=k+1;
end;
n:=n+1;
end;
end;
Таблица есть и можно смело приступать к реализации процедуры шифрования. Смотрим:
var
key : array [0..255] of Char;
s:char;
k:Boolean;
length_key,length_text,i,j,c,stroka,stolbec: integer;
begin
Label5.Caption:='';
//
Memo2.Clear;
//
length_key:=Edit1.GetTextLen;
Edit1.GetTextBuf(key,sizeof(key));
length_text:=Memo1.GetTextLen;
//выводим таблицу Виженера
for i:=Ord('А')-191 to Ord('Я')-191 do
begin
for j:=Ord('А')-191 to Ord('Я')-191 do
begin
Label5.Caption:= Label5.Caption +' '+ tab_Vig[i][j];
end;
Label5.Caption := Label5.Caption + #13+#10;
end;
//приступаем к процессу шифрования
j:=1;
c:=0;
k:=false;
Memo2.Lines.Add('Зашифрованный текст:');
Memo2.Lines.Add('------------------------');
for i:= 0 to Memo1.Lines.Count-1 do
begin
s:=Memo1.Lines[i][j];
if ((s <> #0) or (s <> #13)) then
while k = false do
begin
if Ord(key[c])>223 then
stolbec:=Ord(key[c])-32-191
else
stolbec:=Ord(s)-191;
if Ord(s)>223 then
stroka:=Ord(s)-32-191
else
stroka:=Ord(s)-191;
Memo2.Text:=Memo2.Text+tab_Vig[stroka][stolbec];
if(c < length_key-1)then
c:=c+1
else
c:=0;
j:=j+1;
s:=Memo1.Lines[i][j];
if(s = #0) then
k:=true;
end;
k:=false;
j:=1;
end;
Memo2.Lines.Add('------------------------');
end;
Так как шифрование реализовано, значит пора рассмотреть процедуру расшифровки. Смотрим:
var
key : array [0..255] of Char;
s:char;
k:Boolean;
length_key,length_text,i,j,c,stroka,stolbec,q: integer;
begin
Label5.Caption:='';
//
Memo2.Clear;
//
length_key:=Edit1.GetTextLen;
Edit1.GetTextBuf(key,sizeof(key));
length_text:=Memo1.GetTextLen;
j:=1;
c:=0;
k:=false;
Memo2.Lines.Add('Расшифрованный текст:');
Memo2.Lines.Add('------------------------');
for i:= 0 to Memo1.Lines.Count-1 do
begin
if Ord(Memo1.Lines[i][j])>223 then
s:=Ord(Memo1.Lines[i][j])-32-191
else
s:=Ord(Memo1.Lines[i][j])-191;
s:=Memo1.Lines[i][j];
if ((s <> #0) or (s <> #13)) then
while k = false do
begin
if Ord(key[c])>223 then
stolbec:=Ord(key[c])-32-191
else
stolbec:=Ord(s)-191;
for q:=1 to 32 do
begin
if tab_Vig[q][stolbec] = s then
begin
Memo2.Text:=Memo2.Text+Chr(q+191);
break;
end;
end;

if(c < length_key-1)then
c:=c+1
else
c:=0;
j:=j+1;
s:=Memo1.Lines[i][j];
if(s = #0) then
k:=true;
end;
k:=false;
j:=1;
end;
Memo2.Lines.Add('------------------------');
end;
Gruvi вне форума   Ответить с цитированием
Старый 08.07.2012, 02:07   #3 (permalink)
Spoke57
Новичок
 
Регистрация: 06.07.2012
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Gruvi, alpha_ver := alpha_ver + s[1] каким образом идет присваивание константному объекту? Программа нерабочая же первая.
Spoke57 вне форума   Ответить с цитированием
Старый 08.07.2012, 02:53   #4 (permalink)
Gruvi
VIP user
 
Аватар для Gruvi
 
Регистрация: 10.03.2011
Сообщений: 765
Записей в дневнике: 1
Сказал(а) спасибо: 10
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 3453
По умолчанию

На работоспособность я не проверял, что на компе нашел, то и скинул.
код не мой.
Gruvi вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 01:56.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.