Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шифрование-дешифрование по словарю 
:(
    Опции темы
Coderr
Дата 28.6.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: 0
Всего: 0



Здрасте!
Такая вещь: хочу, чтоб в моей программе файл настроек был зашифрован. Принцип такой:
во время первого запуска проги создаётся алфавит, который представляет собой переставленные случайным образом  символы таблицы ACSII, то есть что-то типа этого:
32 -  - A
33 - ! - J
34 - " - G
35 - # - E
36 - $ - B
Разъясню: номер символа в таблице ACSII... - ...и соответствующий ему символ - символ, выбранный случайным образом.
Сделал прогу, вот что получилось: 
Код

procedure TForm1.Button1Click(Sender: TObject);
var i,j,k,min,max,c:byte;
    a:array[32..255] of byte;
    b:boolean;
begin
 for i:=32 to 255 do
  a[i]:=0;
 min:=32;
 max:=42;
 repeat
  for i:=min to max do begin
   b:=true;
   repeat
    randomize;
    j:=max-random(max-min);
    for k:=32 to 255 do begin
     if a[k]=j+32 then b:=false;
     application.ProcessMessages
    end;
    application.ProcessMessages
   until b;
   a[i]:=j+32;
   memo1.Lines.Add(chr(i)+' - '+chr(a[i])+' - '+inttostr(i))
  end;
  min:=max;
  max:=max+10;
 until max>=252
end;

но прога загружает проц на 100%, а доходит лишь максимум до номера 74 из таблицы символов!
ПаМаГиТе! 
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
Palladin
Дата 28.6.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



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


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Mechanic
Дата 28.6.2006, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Цитата(Coderr @  28.6.2006,  12:35 Найти цитируемый пост)
во время первого запуска проги создаётся алфавит, который представляет собой переставленные случайным образом  символы таблицы ACSII

Ага, а при втором запуске, когда нужно будет вновь создавать алфавит уже для чтения, он будет создан совсем другим, и расшифровать настройки не получится?

Чтобы инитить нормально рэндомный генератор с возможностью повторения, не используй Randomize, но сам устанавливай RandSeed на необходимое значение, или же запоминай его вместе с первым созданием алфавита, и при повторных просто считывай в RandSeed.

И в твоём алгоритме слишком много холостых проб. Просто используй список, или массив, из которого выбирай случайный элемент, и удаляй его, чтоб исключить повторное попадание. Тогда Random(ТекущаяДлинаСписка) будет гарантированно брать новый элемент на каждом забросе. Или можно метить спец-символом уже выбранный элемент массива, и при попадании на такой просто бежать по массиву до первого "живого" элемента. Тогда массив должен быть кольцевым (врап индекса), но при этом не нужно мувить элементы при удалении очередного.

И убери ты этот пикчер на 300К..  smile  
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Coderr
Дата 28.6.2006, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: 0
Всего: 0



Цитата
Ага, а при втором запуске, когда нужно будет вновь создавать алфавит уже для чтения, он будет создан совсем другим, и расшифровать настройки не получится?


Не! Не так! алфавит создаётся один раз во время первого запуска только что установленной проги и записывается в файл! А в последующие разы дешифрация происходит по готовому словарю! Это делается для усложнения! =) У каждого разный словарь! Прикольно! =)))


Цитата

И убери ты этот пикчер на 300К..  smile


Хорошо, уберу! =) 
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
Coderr
Дата 28.6.2006, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: 0
Всего: 0



Цитата

Просто используй список, или массив, из которого выбирай случайный элемент, и удаляй его, чтоб исключить повторное попадание.


Mechanic, спасибо за идею! Теперь работает моментально! =) Если кому-нить понадобится, выкладываю код:

Код

procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
    a,mas:array[32..255] of byte;
begin
 for i:=32 to 255 do begin
  a[i]:=i;
  mas[i]:=0
 end;
 j:=32;
 repeat
  repeat
   randomize;
   i:=random(224)+32;
  until a[i]<>0;
  a[i]:=0;
  mas[j]:=i;
  memo1.Lines.Add(inttostr(j)+' - '+chr(j)+' - '+chr(mas[j]));
  inc(j)
 until j=256
end;
  

Это сообщение отредактировал(а) Coderr - 28.6.2006, 20:58
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
Mailman
Дата 28.6.2006, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 6.6.2006

Репутация: нет
Всего: нет



Хахаха. Народ, вы чот прошляпили! Ощшибка то была вот тут: 

Код

   repeat    
    randomize;    
    j:=max-random(max-min);    
    for k:=32 to 255 do begin    
     if a[k]=j+32 then b:=false;    
     application.ProcessMessages    
    end;    
    application.ProcessMessages    
   until b;


Заметьте, что b тут если сделалось false, то это бесконечный цикл. Потому и проблемы с циклом были )))) 
PM MAIL   Вверх
Yanis
Дата 28.6.2006, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Coderr @  28.6.2006,  21:42 Найти цитируемый пост)
алфавит создаётся один раз во время первого запуска только что установленной проги и записывается в файл!

А файл с алфавитом как шифровать будешь? 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Mechanic
Дата 29.6.2006, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Цитата(Yanis @  28.6.2006,  22:10 Найти цитируемый пост)
А файл с алфавитом как шифровать будешь? 


 smile  Ага, "А ключ под ковриком"... 

Всё-таки предложил бы сохранять только Seed генератора, и восстанавливать каждый раз алфавит.

Типа:
Код

//Первое создание алфавита
Randomize;
ini.WriteInteger('Options','Base',RandSeed);
//Создание самого алфавита с использованием Random
....

//Последующие его воссоздания
RandSeed = ini.ReadInteger('Options','Base');
//Создание самого алфавита с использованием Random
....


Только нужно учесть, что повторяемость последовательности Borland'ом не шибко гарантируется при переходе с версии на версию компилера (хотя, если всё происходит в пределах уже скомпиленного в одной версии exe, то вполне сойдёт):
Цитата(Delphi help said)

Note: Because the implementation of the Random function may change between compiler versions, we do not recommend using Random for encryption or other purposes that require reproducible sequences of pseudo-random numbers.


И уж конечно же, убрать Randomize из самого цикла генерации алфавита.  smile 
Цитата(Delphi help also said)
Do not combine the call to Randomize in a loop with calls to the Random function. Typically, Randomize is called only once, before all calls to Random.
 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Coderr
Дата 30.6.2006, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: 0
Всего: 0



Лана!Это мелочи...
Тут другая проблема нарисовалась! У моего файла настроек такая структура

1 строка: зашифрованный алфавит;
2 строка: путь к файлу(неважно какой =) )
3 строка: 0 или 1 может быть (положение чекбокса)
4 строка: порт (у меня прога для работы с сетью...)

Замучался короче! Начирикал пять процедур:
Процедура №1, загружает настройки:

Код

procedure TForm1.loadoptions;
var options:TStrings;
      key:string;
begin
 options:=TStringList.Create;
 if not FileExists('options.dll') then begin //если файл настроек не существует, то...
  form2.ShowModal;                                //...показываем окно настроек
  if form2.ModalResult=mrOk then saveoptions // если нажата кнопка ОК, то сохраняем опции в файл
  else close                                                        //... иначе закрываем прогу совсем
 end                        
 else begin                                                       //если файл сущесвует, то... 
  options.LoadFromFile('options.dll');               //загружаем файл настроек
  key:=options.Strings[0];                               //берём ключ
  form2.LoginEdit.Text:=encrypt(options.Strings[1],key); //присваиваем эдиту тест после расшифровки...
  if options.Strings[2]=encrypt('1',key) then form2.CheckBox2.Checked:=true // устанавливаем
  else form2.CheckBox2.Checked:=False;                                                         // чекбокс и...
  form2.PortSpin.Value:=strtoint(encrypt(options.Strings[3],key))                   //... SpinEdit
 end;
 ServerSocket.Port:=form2.PortSpin.Value;
 ClientSocket.Port:=form2.PortSpin.Value;
 options.Free
end;


Процедура №2, сохраняет настройки:

Код

procedure TForm1.saveoptions;
var options:TStrings;
    key:string;
begin
 options:=TStringList.Create;
 if not FileExists('options.dll') then begin    //если файл настроек не существует, то...
  key:=generator;                                      //создаём ключ
  options.Add(key);                                    //добавляем
  options.Add(crypt(progroot(form2.LoginEdit.Text),key)); //сохраням закодированной строку
  if form2.CheckBox2.Checked then options.Add(crypt('1',key)) //сохраням положение 
  else options.Add(crypt('0',key));                                              //чекбокса, тоже кодируем
  options.Add(crypt(inttostr(form2.PortSpin.Value),key))      //сохраням закодированным значение SpinEdit
 end
 else begin                                                          // .....если файл существует, то...
  options.LoadFromFile('options.dll');                  //загружаем файл...
  key:=options.Strings[0];                                  //...и ключ
  options.strings[1]:=crypt(form2.LoginEdit.Text,key);                          //всё олстальное, что и чуть выше 
  if form2.CheckBox2.Checked then options.strings[2]:=crypt('1',key)  // в этой же процедуре... =)
  else options.strings[2]:=crypt('0',key);
  options.strings[3]:=crypt(inttostr(form2.PortSpin.Value),key)
 end;
 ServerSocket.Port:=form2.PortSpin.Value;
 ClientSocket.Port:=form2.PortSpin.Value;
 options.SaveToFile('options.dll');
 options.Free
end;


Процедура №3, кодирование:

Код

function TForm1.crypt(strin,key:string):string;
var i:integer;
begin
 for i:=1 to length(strin) do begin
  insert(key[ord(strin[i])],strin,i);
  delete(strin,i,1)
 end;
 Logedit.Lines.Add(strin);
 result:=strin
end;


Процедура №4, декодирование:

Код

function TForm1.encrypt(strin,key:String):String;
var i:integer;
begin
 for i:=1 to length(strin) do begin
  Insert(chr(pos(strin[i],key)),strin,i);
  delete(strin,i,1)
 end;
 Logedit.Lines.Add(strin);
 result:=strin
end;


Процедура №5, проебразование строки вида %PROGROOT%\Login.bbq(для эдита):

Код

function TForm1.progroot(s: string): string;
begin
 if pos('%PROGROOT%',s)=0 then begin
  result:=s;
  exit
 end;
 delete(s,1,10);
 result:=extractfiledir(application.ExeName)+s
end;


У меня уже голова кругом... Ошибки пачками вылетают... Одну исправлю-новая появляется... Помогите плз! Может есть способ пооригинальней загрузки\сохранения опций?  smile   smile   

Это сообщение отредактировал(а) Coderr - 30.6.2006, 20:55
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
Palladin
Дата 2.7.2006, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



А где именно ошибки(на что компилятор указывает)??? 


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Coderr
Дата 2.7.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: 0
Всего: 0



Ошибка raised exception class EStackOverflow with message 'Stack Overflow'. Переполнение буфера, однако...  smile  smile  
Вот процедура OnShow главной формы:

Код

procedure TForm1.FormShow(Sender: TObject);
begin
 loadoptions;
 login:=TStringlist.Create;
 login.LoadFromFile(form2.LoginEdit.Text);
 if form2.CheckBox2.Checked then start.Click;
end;


показывает на строку login:=TStringlist.Create; , то есть что-то не так в перечисленных выше процедурах...  smile  

Это сообщение отредактировал(а) Coderr - 2.7.2006, 21:26
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
Yanis
Дата 2.7.2006, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Coderr
Ты хотя бы номер строки скажи где ошибка выскакивает. И вообще, думаешь кому то охота копатся с такой громадой кода? Сначала ты хотел шифровать-дешифровать. А теперь (я посмотрел) какие то сокеты поперли...  smile

Добавлено @ 21:30 
Во первых options:TStrings сделай как стринглист!

Добавлено @ 21:35 
Coderr
А потрейсить никак? Попробуй, может узнаешь что-нибудь нового про свой код. 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Coderr
Дата 2.7.2006, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: 0
Всего: 0



Строка номер 4, а с сокетами я сам разберусь! Они-то как раз и рабатають отлично! smile 
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
Mechanic
Дата 2.7.2006, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Цитата(Coderr @  2.7.2006,  21:18 Найти цитируемый пост)
Ошибка raised exception class EStackOverflow with message 'Stack Overflow'. Переполнение буфера, однако...  

Не буфера, но стека, однако..  smile 

И бывает такое, когда у тебя обработчики вызывают друг друга рекурсивно. Посмотри, что откуда вызывается, и когда пойдешь второй раз в одну функу до выхода из неё - вот это и место, где стак не выдерживает..  smile  
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1377 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.