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

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

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

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

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

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

помогите кто-нибудь.. в делфи плохо разбираюсь, и не могу ничего придумать
нужно сделать шифрование цезаря используя ключевое слово (в edit2.text) вписывать
в кратце можно представить так:
исходный алфавит: абвгдеёжзийклмнопрст
ключ: ёжик
преобразованный алфавит:ёжикабвгдезйлмнопрст
слово для шифрования: кабан
шифр:йёжён
у меня была такая идея:
создать массив, и присвоить ему все элементы с символами, а потом начальным символам присвоить буквы от ключа, а дальше последовательно выписывать символы, и если будет повтор, то пропускается..
но чет не работает уже с самого начала
begin
for i=1 to 256 do
begin
m[i]:=chr(i);
end;
end;
компилируется, однако при нажатии на кнопку выдает что то типа
raised exeption class EAccessViolation with message 'Access violation at address 00403e8c' ну и т.д

Последний раз редактировалось Karyuudo; 05.03.2008 в 10:52.
Karyuudo вне форума Ответить с цитированием
Старый 05.03.2008, 00:47   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Конечно будет Access violation. Вы цикл запускаете, не проверив длину строк и не взяв минимальную, тем более, если это обычные строки, максимальный индекс у них - 255, а не 256.
P.S. А с каких пор в шифре цезаря ключ используется?
B_N вне форума Ответить с цитированием
Старый 05.03.2008, 07:14   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

в исходном вопросе после слова "ШИФР: " просто написан бред!
Карудо, вы бы сначала поискали в яндексе/гугле, что такое алгоритм шифровки Цезаря!
И, смею Вас заверить - НИ В ОДНОМ методе шифрования зашифрованная строчка не присутствует в ПОЛНОМ и нетронутом виде к криптограмме!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.03.2008, 08:27   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
тем более, если это обычные строки, максимальный индекс у них - 255, а не 256.
Ну в делфе обычные строки имеют максимальный размер 2Гига (AnsiString). А 255 это ShortString, Так что тут дело только в непроверке размера строки. Ну и шифр конечно странноват...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.03.2008, 10:47   #5
Karyuudo
Пользователь
 
Регистрация: 17.02.2008
Сообщений: 53
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
в исходном вопросе после слова "ШИФР: " просто написан бред!
Карудо, вы бы сначала поискали в яндексе/гугле, что такое алгоритм шифровки Цезаря!
И, смею Вас заверить - НИ В ОДНОМ методе шифрования зашифрованная строчка не присутствует в ПОЛНОМ и нетронутом виде к криптограмме!!
там есть разные виды шифрования: обычный - просто смещение, афинский, там математические операции, и с ключем, где идет смещение+замена букв которые в ключе
возможно вы не так поняли что имел ввиду, исходный алфавит, а не исходный текст нужно было написать.. после чего уже зашифрованный алфавит получается.. и на основе этих двух алфавитов и щифруется

так для эксперимента, без цикла попробовал сделать так:
m[3]:=chr(4)
и все равно таже ошибка.. потому и не пойму, как сделать зашифрованный алфавит, если даже массив с символами не создается

может не правильный тип данных у массива?
m:array of string;

Последний раз редактировалось Stilet; 05.03.2008 в 11:16.
Karyuudo вне форума Ответить с цитированием
Старый 05.03.2008, 11:18   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
for i=1 to 256 do m:=m+chr(i);
Это понятно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.03.2008, 15:39   #7
Karyuudo
Пользователь
 
Регистрация: 17.02.2008
Сообщений: 53
По умолчанию

нет, непонятно...
так понимаю, поидее это работает так: пока I не будет = 256 , m будет присваиваться предыдущее значение+ i символ.. типа:
m: 0 1 6 10 15 21 ... но что это даст?
Karyuudo вне форума Ответить с цитированием
Старый 09.03.2008, 15:09   #8
Karyuudo
Пользователь
 
Регистрация: 17.02.2008
Сообщений: 53
По умолчанию

во, понял почему ошибка, не указал размерность массива...
вообщем попробовал дальше сделать, и вот что получилось:
procedure TForm1.Button1Click(Sender: TObject);
begin
s:=edit1.text;
k:=edit2.text;
for i:=1 to 256 do
begin
m1[i]:=i;
end;
m2:=m1;
for i:=1 to Length(k) do
begin
m1[256-i]:=ord(k[i]);
end;
for i:=1 to 256-Length(k) do
begin
if ******
end;
end;

вот никак не могу придумать, как записать, так, чтобы последовательно вписывать символы и если какойто символ присутствует в едит2.текст то заменяется на следующий символ, причем если следующий символ тоже есть в эдит2.текст, то опять пропускается..?
и еще if m1[i]=k[1] or k[2] or k[3] or k[4] or ... ? как это можно записать по нормальному?

Последний раз редактировалось Karyuudo; 09.03.2008 в 15:35.
Karyuudo вне форума Ответить с цитированием
Старый 11.03.2008, 20:59   #9
Karyuudo
Пользователь
 
Регистрация: 17.02.2008
Сообщений: 53
По умолчанию

вообщем шифрование данных получилось, однако как сделать обратно?
никак не получается...
а вот алгоритм по которому шифруется:
procedure TForm1.Button1Click(Sender: TObject);
begin
k:=edit2.text;
//создание алфавита
for i:=1 to 256 do
begin
m[i]:=i;
end;
//удаление ключевых символов из алфавита
for j:=1 to Length(k) do
begin
n:=ord(k[j]);
for i:=n to 255 do
m[i]:=m[i+1];
end;
// добавление ключевых символов в конец массива
for i:=1 to Length(k) do
m[256-i]:=ord(k[i]);
s:=Edit1.Text;
//шифрование текста
for i:=1 to Length(s) do
s[i]:=chr(m[ord(s[i])]);
edit3.text:=s;
end;
Karyuudo вне форума Ответить с цитированием
Ответ


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