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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2019, 19:47   #1
Dezzy
Пользователь
 
Регистрация: 27.09.2018
Сообщений: 13
По умолчанию Шифрование текстового файла

Есть текстовый документ, в нём содержится информация о сотрудниках:
Иванов И.И. назначен на должность главный бухгалтер
Петров В.А. назначен на должность главный инженер
Данилов А.В. назначен на должность администратор

Как зашифровать фамилию, имя, отчество и должность, на которую они назначены и сохранить назад в файл? В интернете не нашёл никакой информации.
Я связал делфи и текстовый файл. Вывел эти данные, которые нужно зашифровать. Но как зашифровать не могу понять.

Код:
var
f:textfile;
s,d:string;
i,p:integer;
begin
assignfile(f,'spr.txt');
reset(f);
while not eof(f) do
begin
readln(f,s);
d:=(copy(s,1,pos(' ',s)+4));
Memo1.Lines.Add(d);
i:=1;
p:=0;
while (i<=length(s))and(p<5) do
 begin
  inc(i);
  if s[i]=' ' then inc(p);
  if p=5 then p:=i;
 end;
s:=copy(s,p,length(s)-p+1);  
Memo1.Lines.Add(s); 
Memo2.Lines.Add(d+s); 
end;
end;
end.
_____
Код программы нужно выделять (форматировать) тегами [CODE] [/CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 01.10.2019 в 22:24.
Dezzy вне форума Ответить с цитированием
Старый 01.10.2019, 22:57   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

самый простой (и вместе с тем достаточно надёжный) способ шифрации - это XOR с многобайтным ключом.

Цитата:
Сообщение от Dezzy Посмотреть сообщение
Я связал делфи и текстовый файл.
я бы не привязывался к тексту. Проще шифровать файл как бинарный. Тогда всё равно что так - текст, документ, музыка или картинка.

вот, например, посмотрите на эту тему - https://www.programmersforum.ru/showthread.php?t=58277

p.s. это если Вам нужна "самопальная" шифровка. А так можно взять компоненты (в том числе бесплатные) которые реализуют стойкие серьёзные алгоритмы (Rijndael / AES, Blowfish, GOST, NewDES и многие, многие другие) - например, https://github.com/decfpc/DelphiEncryptionCompendium
или можно воспользоваться криптопровайдерами Windows.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.10.2019, 23:10   #3
Dezzy
Пользователь
 
Регистрация: 27.09.2018
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
самый простой (и вместе с тем достаточно надёжный) способ шифрации - это XOR с многобайтным ключом.


я бы не привязывался к тексту. Проще шифровать файл как бинарный. Тогда всё равно что так - текст, документ, музыка или картинка.

вот, например, посмотрите на эту тему - https://www.programmersforum.ru/showthread.php?t=58277

p.s. это если Вам нужна "самопальная" шифровка. А так можно взять компоненты (в том числе бесплатные) которые реализуют стойкие серьёзные алгоритмы (Rijndael / AES, Blowfish, GOST, NewDES и многие, многие другие) - например, https://github.com/decfpc/DelphiEncryptionCompendium
или можно воспользоваться криптопровайдерами Windows.
Спасибо
Dezzy вне форума Ответить с цитированием
Старый 02.10.2019, 02:13   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
А так можно взять компоненты (в том числе бесплатные) которые реализуют стойкие серьёзные алгоритмы (Rijndael / AES, Blowfish, GOST, NewDES и многие, многие другие)
Из пушки по воробьям, имхо. Серьёзные алгоритмы могут быть нужны для шифрования больших осмысленных текстов.
Для шифрования ТС XOR-а более чем достаточно. А если при шифровании заменять название должности на один символ, то вообще хрен расшифруешь.
northener вне форума Ответить с цитированием
Старый 02.10.2019, 10:13   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Из пушки по воробьям, имхо. Серьёзные алгоритмы могут быть нужны для шифрования больших осмысленных текстов.
Для шифрования ТС XOR-а более чем достаточно. А если при шифровании заменять название должности на один символ, то вообще хрен расшифруешь.
полностью согласен.
уверен, что XOR с головой хватит. и даже можно не морочить голову с кодированием должности.

А про сильное шифрование я пост потом дописал, когда подумал, что _ВДРУГ_ ему нужно что-то реально серьёзное.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.10.2019, 03:08   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
даже можно не морочить голову с кодированием должности.
"Ну уж если пошла такая пьянка", то особое кодирование должности достаточно важно. Ибо одно дело шифровать фамилии коим легион. И другое дело шифровать должности, которых не более 10.
А чем больше в зашифрованном тексте одинаковых слов, тем легче этот текст расшифровать.
northener вне форума Ответить с цитированием
Старый 03.10.2019, 15:01   #7
Dezzy
Пользователь
 
Регистрация: 27.09.2018
Сообщений: 13
По умолчанию

При симметричном шифровании шифрую 8 строк, а на выходе получается 7 строк. Мне нужно получить 8 строк. Как это можно исправить?

Код:
var
i,a,b,h,x,y:integer;
text,pass,rez:string;
begin
//При нажатии на кнопку зашифровать текст из memo1 прибавляет к себе текст из edit1
//и в итоге получается зашифрованный текст в memo3

text:=Memo1.Text;
pass:=edit1.Text;
x:=length(text);   //x длина текста
y:=length(pass);   //y длина пароля
//Делаем цикл, чтобы хватало пароля для перекрытия текста
//Если размера пароля не будет хватить, то цикл зайдёт  заново
//и добавит пароль к паролю
while x>y do begin
 pass:=pass+edit1.Text;
 y:=length(pass);

 end;

//От первого символа до последнего символа текста берём и приставаиваем
//значения a и b номера в таблице ASCII
for i:=1 to x do begin
 a:=ord(text[i]);
 b:=ord(pass[i]);
 h:=a+b;
 if h>255 then h:=h-255;
 rez:=rez+chr(h);
 Memo3.Text:=rez;
 end;
end;
______________________
Используйте тег [CODE] (кнопка [CODE] в форме сообщения) при вставке кода на форум. Подробнее в FAQ

Последний раз редактировалось Serge_Bliznykov; 03.10.2019 в 15:08.
Dezzy вне форума Ответить с цитированием
Старый 03.10.2019, 15:10   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Dezzy Посмотреть сообщение
При симметричном шифровании шифрую 8 строк, а на выходе получается 7 строк.
шифруй каждую строчку Memo отдельно.

Код:
for k:=0 to Memo1.Lines.Count - 1 do begin
  text:=Memo1.Lines.Strings[k];
  ...
  <тут твоя шифрация>

   Memo3.Lines.Append( зашифрованная строчка )
end;

p.s. а зачем ты остановился на сумме символов? XOR же реально проще и удобнее!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.10.2019, 15:13   #9
Dezzy
Пользователь
 
Регистрация: 27.09.2018
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
шифруй каждую строчку Memo отдельно.

Код:
for k:=0 to Memo1.Lines.Count - 1 do begin
  text:=Memo1.Lines.Strings[k];
  ...
  <тут твоя шифрация>

   Memo3.Lines.Append( зашифрованная строчка )
end;

p.s. а зачем ты остановился на сумме символов? XOR же реально проще и удобнее!
Спасибо
Dezzy вне форума Ответить с цитированием
Старый 03.10.2019, 15:36   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

такой вариант попробуйте
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, a, b, h, x, y: integer;
  txt, pass, rez: string;
begi

  Memo3.Lines.Clear; // очистить Memo3

  for k := 0 to Memo1.Lines.Count - 1 do begin
    txt := Memo1.Lines.Strings[k];

    pass := edit1.Text;
    x := length(txt); //x длина текста
    y := length(pass); //y длина пароля
    //Делаем цикл, чтобы хватало пароля для перекрытия текста
    //Если размера пароля не будет хватить, то цикл зайдёт заново
    //и добавит пароль к паролю
    while x > y do begin
      pass := pass + edit1.Text;
      y := length(pass);
    end;

    //От первого символа до последнего символа текста берём и приставаиваем
    //значения a и b номера в таблице ASCII
    rez := '';
    for i := 1 to x do begin
      h := ord(txt[i]) + ord(pass[i]);
      if h > 255 then h := h - 255;
      rez := rez + chr(h);
    end;

    Memo3.Lines.Append(rez);

  end;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++] Помогите с данной темой: Не создавая отдельного файла, удалить из текстового файла слова, содержащие N гласных букв Mapuo__ Помощь студентам 3 20.04.2017 18:42
Шифрование текстового Dux Общие вопросы Delphi 23 14.08.2015 10:29
Из Паскаля в СИ++. Шифрование текстового файла перестановкой desnet Помощь студентам 1 24.05.2014 09:46
Шифрование текстового файла на Delphi вася радугов Помощь студентам 5 21.11.2012 00:09
Шифрование текстового файла pomoshnic Паскаль, Turbo Pascal, PascalABC.NET 5 14.02.2009 18:21