С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/49: Рейтинг темы: голосов - 49, средняя оценка - 5.00
pawel32

Зашифровать и в проге расшифровать файл

16.11.2009, 07:54. Показов 9207. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть программа на делфи 'Тест' она из текстового файла читает вопросы и ответы нужно сделать так чтобы этот файл нельзя было прочитать без программы кто может помогите!
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.11.2009, 07:54
Ответы с готовыми решениями:

Зашифровать и расшифровать сообщение
Помогите пожалуйста решить задачу! У нас есть сообщение, оно состоит из больших латинских букв и точек. Чтобы скрыть его смысл, мы...

Если ярлыка к проге нет, то Создать ярлык к проге по адресу (текущий адрес)
Подскажите plz фичу: Если ярлыка к проге нет, то Создать ярлык к проге по адресу (текущий адрес)

Как расшифровать из Delphi PGP-шный файл?
Помогите пожалуйста Нужно расшифровать из Delphi PGP-шный файл. Скачал бесплатные компоненты, все работает, но при расшифровке файла...

10
 Аватар для Vladiator
1574 / 645 / 79
Регистрация: 24.02.2009
Сообщений: 9,268
16.11.2009, 08:55
А какие в тесте типы вопросов, типы ответов, вообще, из чего состоит данный тест?
0
pawel32
16.11.2009, 11:22
в файле 2 типа вопрсов с одним ответом и несколькими. первая строчка это сам вопрос 2-я это номер(а) правильных ответов 7-я строчка это тип вопроса с 1 или несколькии правильными ответами. вот для примера 2 вопроса:
{
Вопрос №1: В каких рядах во всех словах пропущена безударная проверяемая гласная корня?
12
зап..здалый,предст..вление,ст..рожевой
нак..пивший,благосл..вение,надл..мить
г..рячий,прип..сенный,пап..ротник
бл..гоухать,пл..вец,распол..жение
2
Вопрос №2: В каком слове есть суффикс -Д-?
1
кривда
запруда
посуда
причуда
1
}
Почетный модератор
 Аватар для Humanoid
11554 / 4349 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
16.11.2009, 12:00
Можно обычным xor'ом закодировать.... и пароль выбрать по длиннее (ведь его всё равно вводить не надо будет).
0
 Аватар для Vladiator
1574 / 645 / 79
Регистрация: 24.02.2009
Сообщений: 9,268
16.11.2009, 12:06
Цитата Сообщение от pawel32 Посмотреть сообщение
в файле 2 типа вопрсов с одним ответом и несколькими. первая строчка это сам вопрос 2-я это номер(а) правильных ответов 7-я строчка это тип вопроса с 1 или несколькии правильными ответами. вот для примера 2 вопроса:
{
Вопрос №1: В каких рядах во всех словах пропущена безударная проверяемая гласная корня?
12
зап..здалый,предст..вление,ст..рожевой
нак..пивший,благосл..вение,надл..мить
г..рячий,прип..сенный,пап..ротник
бл..гоухать,пл..вец,распол..жение
2
Вопрос №2: В каком слове есть суффикс -Д-?
1
кривда
запруда
посуда
причуда
1
}
для зашифровки лучше использовать типизированный, а не текстовый файл. Тогда уже будет сложнее прочитать из других программ. С текстом можно поработать так - перевернуть его, все буквы перевести в byte (или Integer), перевести эти числа в 2-ную систему и записать в типе Integer. Вариантов зашифровки бесконечность.
0
2923 / 844 / 324
Регистрация: 30.04.2009
Сообщений: 2,633
16.11.2009, 12:38
ну вообще можно придумать великое множество кодировок
0
Почетный модератор
 Аватар для Humanoid
11554 / 4349 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
16.11.2009, 14:22
Стало интересно... решил написать небольшой класс для работы с зашифрованными файлами методом XOR. В interface описываем класс:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Type
  TXORFile = class
  Private
    F : TextFile;  // Для работы с файлом
    Pass : String; // Пароль
    PassPos : Integer; // Текущая позиция на пароле
    Opened : Boolean; // Признак того, что файл открыт в данный момент
    OpenedWrite : Boolean; // Файл открыт для записи иначе для чтения
  Public
    Constructor Create;
    Destructor Destroy; Override;
    Function OpenFile(FName : String; Password : String; ForRewrite : Boolean = False): Boolean; // Открыть или создать файл (зависит от ForRewrite)
    Property FileOpened : Boolean read Opened; // Открыт ли файл в данный момент
    Function Code(S : String): String; // Закодировать строку... можно даже применять эту функцию без работы с файлами
    Function ReadLn : String; // Прочитать строку и раскодировать её
    Procedure WriteLn(S : String); // Закодировать строку и записать её
    Procedure CloseFile; // Закрыть открытый файл. Само вызывается при удалении объекта через .Free
    Function GeneratePassword(R : Integer; Size : Integer): String;
  End;
И после implementation сами функции:
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
Constructor TXORFile.Create;
Begin
  Inherited Create;
  Opened := False;
End;
 
Destructor TXORFile.Destroy;
Begin
  Self.CloseFile;
  Inherited Destroy;
End;
 
Function TXORFile.OpenFile(FName : String; Password : String; ForRewrite : Boolean = False): Boolean;
Begin
  Self.CloseFile;
  Pass := Password;
  PassPos := 1;
  If (ForRewrite) or FileExists(FName) then
  Begin
    AssignFile(F,FName);
    {$I-}
    If ForRewrite then ReWrite(F) else Reset(F);
    If IOResult=0 then
    Begin
      Opened := True;
      OpenedWrite := ForRewrite;
    End;
    {$I+}
  End;
  Result := Opened;
End;
 
Function TXORFile.Code(S : String): String;
Var I : Integer;
Begin
  For I := 1 to Length(S) do
  Begin
    S[I] := Chr(Ord(S[I]) xor Ord(Pass[PassPos]));
    If PassPos>=Length(Pass) then PassPos := 1 else PassPos := PassPos + 1;
  End;
  Result := S;
End;
 
Function TXORFile.ReadLn : String;
Var S : String;
Begin
  If (not Opened) or (OpenedWrite) then // Если файл не открыт... или открыт для записи, тогда ничего не делать
  Begin
    Result := '';
    Exit;
  End;
  System.ReadLn(F,S);
  Result := Code(S);
End;
 
Procedure TXORFile.WriteLn(S : String);
Begin
  If (not Opened) or (not OpenedWrite) then Exit; // Если файл не открыт... или открыт для чтения, тогда ничего не делать
  S := Code(S); // Кодируем строку
  System.WriteLn(F,S); // Записываем
End;
 
Procedure TXORFile.CloseFile;
Begin
  If Opened then System.CloseFile(F); // Если файл открыт, то закрыть
  Opened := False;
End;
 
Function TXORFile.GeneratePassword(R : Integer; Size : Integer): String;
Var I : Integer;
Begin
  RandSeed := R;
  Result := '';
  For I := 1 to Size do Result := Result + Chr(Random(256));
End;
Функция OpenFile открывает файл. Если ForWrite указана как True, то создаётся новый файл (даже если он уже был). Если ForWrite не указан или указан как False, то открывается существующий файл для чтения. FName - имя файла. Password - пароль, который использовать для работы с файлом.

ReadLn читает строку из файла и раскодирует её.

WriteLn закодирует строку и запишет её в файл.

Code - сама функция кодирования.

CloseFile закрывает файл, с которым в данный момент идёт работа. Эту функцию не обязательно вызывать вручную... она вызывается сама и при открытии другого файла или при удалении объект через Free.

GeneratePassword генерирует пароль, который состоит из различных символов (не только текстовых, а во всём диапазоне от #0 до #255 ). Этот пароль будет одинаковым, если указывать всегда одинаковый параметр R. Параметр Size - это длинна пароля.
Думаю, многие замечали, что функция Random будет всегда возвращать одинаковую последовательность результатов при повторном запуске, если в программе не использовалась процедура Randomize. Функция Randomize просто выставляет специальную переменную RandSeed (которая используется для работы функции Random ) в значение, которое зависит от текущего времени и времени работы компьютера. А функцию GeneratePassword устанавливает эту переменную в значение параметра R.

Использовать очень просто:
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
procedure TForm1.Button1Click(Sender: TObject);
Var F : TXORFile;
    Pas : String;
begin
  F := TXORFile.Create;
  F.OpenFile('a.txt','mypassword',True);
  F.WriteLn('Ляляля... это первая строка');
  F.WriteLn('Гыгыгы... это вторая строка');
  F.OpenFile('a.txt','mypassword');
  Memo1.Lines.Add(F.ReadLn);
  Memo1.Lines.Add(F.ReadLn);
  Memo1.Lines.Add('');
  Memo1.Lines.Add('А теперь пытаемся использовать неправильный пароль:');
  Memo1.Lines.Add('');
  F.OpenFile('a.txt','password');
  Memo1.Lines.Add(F.ReadLn);
  Memo1.Lines.Add(F.ReadLn);
 
 
  Memo1.Lines.Add('');
  Memo1.Lines.Add('');
  Memo1.Lines.Add('А теперь будем использовать сгенерированный пароль:');
  Memo1.Lines.Add('');
  Pas := F.GeneratePassword(1259971,10);
  F.OpenFile('a.txt',Pas,True);
  F.WriteLn('Ляляля... это первая строка');
  F.WriteLn('Гыгыгы... это вторая строка');
  F.OpenFile('a.txt',Pas);
  Memo1.Lines.Add(F.ReadLn);
  Memo1.Lines.Add(F.ReadLn);
  Memo1.Lines.Add('');
  Memo1.Lines.Add('А теперь пытаемся использовать неправильный сгенерированный пароль:');
  Memo1.Lines.Add('');
  Pas := F.GeneratePassword(1259972,10);
  F.OpenFile('a.txt',Pas);
  Memo1.Lines.Add(F.ReadLn);
  Memo1.Lines.Add(F.ReadLn);
  F.Free;
  RandSeed := 0;
end;
Результат будет таким:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Ляляля... это первая строка
Гыгыгы... это вторая строка
 
А теперь пытаемся использовать неправильный пароль:
 
Цзинпг+%,%гшй.отчмби:зрхншд
Яюидюы... это=ъсьфьъ+учодно
 
 
А теперь будем использовать сгенерированный пароль:
 
Ляляля... это первая строка
Гыгыгы... это вторая строц
 
А теперь пытаемся использовать неправильный сгенерированный пароль:
 
Г_2
pUцd#_х+7ТtO(ЁнW("+u@8
%цKу-"Ьч"ш·яF(-+kJ'jьZш>/
Как видите, сгенерированный пароль, в котором применяются более разнообразные символы чем в обычном текстовом пароле, сложнее распознать. И сам файл выглядит более непредсказуемо... его выдают только переводы строки. Но если немного изменить принцип работы, то можно и от них избавиться.
1
Favorit
08.12.2009, 01:26
Humanoid, большое спасибо, что написал программу.
Я "начинающий" и эта программа очень поможет мне, если кто-нибудь объяснит, как решить ошибку, которую выдает Delphi:
Создал форму с компонентами Memo1 и Button1, пользуясь примером, написал программу:
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm);
  TXORFile = class
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    F : TextFile;  // Для работы с файлом
    Pass : String; // Пароль
    PassPos : Integer; // Текущая позиция на пароле
    Opened : Boolean; // Признак того, что файл открыт в данный момент
    OpenedWrite : Boolean; // Файл открыт для записи иначе для чтения
  public
    Constructor Create;
    Destructor Destroy; Override;
    Function OpenFile(FName : String; Password : String; ForRewrite : Boolean = False): Boolean; // Открыть или создать файл (зависит от ForRewrite)
    Property FileOpened : Boolean read Opened; // Открыт ли файл в данный момент
    Function Code(S : String): String; // Закодировать строку... можно даже применять эту функцию без работы с файлами
    Function ReadLn : String; // Прочитать строку и раскодировать её
    Procedure WriteLn(S : String); // Закодировать строку и записать её
    Procedure CloseFile; // Закрыть открытый файл. Само вызывается при удалении объекта через .Free
    Function GeneratePassword(R : Integer; Size : Integer): String;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
Constructor TXORFile.Create;
Begin
  Inherited Create;
  Opened := False;
End;
 
Destructor TXORFile.Destroy;
Begin
  Self.CloseFile;
  Inherited Destroy;
End;
 
Function TXORFile.OpenFile(FName : String; Password : String; ForRewrite : Boolean = False): Boolean;
Begin
  Self.CloseFile;
  Pass := Password;
  PassPos := 1;
  If (ForRewrite) or FileExists(FName) then
  Begin
    AssignFile(F,FName);
    {$I-}
    If ForRewrite then ReWrite(F) else Reset(F);
    If IOResult=0 then
    Begin
      Opened := True;
      OpenedWrite := ForRewrite;
    End;
    {$I+}
  End;
  Result := Opened;
End;
 
Function TXORFile.Code(S : String): String;
Var I : Integer;
Begin
  For I := 1 to Length(S) do
  Begin
    S[I] := Chr(Ord(S[I]) xor Ord(Pass[PassPos]));
    If PassPos>=Length(Pass) then PassPos := 1 else PassPos := PassPos + 1;
  End;
  Result := S;
End;
 
Function TXORFile.ReadLn : String;
Var S : String;
Begin
  If (not Opened) or (OpenedWrite) then // Если файл не открыт... или открыт для записи, тогда ничего не делать
  Begin
    Result := '';
    Exit;
  End;
  System.ReadLn(F,S);
  Result := Code(S);
End;
 
Procedure TXORFile.WriteLn(S : String);
Begin
  If (not Opened) or (not OpenedWrite) then Exit; // Если файл не открыт... или открыт для чтения, тогда ничего не делать
  S := Code(S); // Кодируем строку
  System.WriteLn(F,S); // Записываем
End;
 
Procedure TXORFile.CloseFile;
Begin
  If Opened then System.CloseFile(F); // Если файл открыт, то закрыть
  Opened := False;
End;
 
Function TXORFile.GeneratePassword(R : Integer; Size : Integer): String;
Var I : Integer;
Begin
  RandSeed := R;
  Result := '';
  For I := 1 to Size do Result := Result + Chr(Random(256));
End;
 
procedure TForm1.Button1Click(Sender: TObject);
Var F : TXORFile;
    Pas : String;
begin
  F := TXORFile.Create;
  F.OpenFile('a.txt','mypassword',True);
  F.WriteLn('Ляляля... это первая строка');
  F.WriteLn('Гыгыгы... это вторая строка');
  F.OpenFile('a.txt','mypassword');
  Memo1.Lines.Add(F.ReadLn);
  Memo1.Lines.Add(F.ReadLn);
  Memo1.Lines.Add('');
  Memo1.Lines.Add('А теперь пытаемся использовать неправильный пароль:');
  Memo1.Lines.Add('');
  F.OpenFile('a.txt','password');
  Memo1.Lines.Add(F.ReadLn);
  Memo1.Lines.Add(F.ReadLn);
  Memo1.Lines.Add('');
  Memo1.Lines.Add('');
  Memo1.Lines.Add('А теперь будем использовать сгенерированный пароль:');
  Memo1.Lines.Add('');
  Pas := F.GeneratePassword(1259971,10);
  F.OpenFile('a.txt',Pas,True);
  F.WriteLn('Ляляля... это первая строка');
  F.WriteLn('Гыгыгы... это вторая строка');
  F.OpenFile('a.txt',Pas);
  Memo1.Lines.Add(F.ReadLn);
  Memo1.Lines.Add(F.ReadLn);
  Memo1.Lines.Add('');
  Memo1.Lines.Add('А теперь пытаемся использовать неправильный сгенерированный пароль:');
  Memo1.Lines.Add('');
  Pas := F.GeneratePassword(1259972,10);
  F.OpenFile('a.txt',Pas);
  Memo1.Lines.Add(F.ReadLn);
  Memo1.Lines.Add(F.ReadLn);
  F.Free;
  RandSeed := 0;
end;
end.
После запуска выдаться ошибка: [Error] Unit1.pas(116): Undeclared identifier: 'Button1Click'
и указывается строка: procedure TForm1.Button1Click(Sender: TObject);
Почетный модератор
 Аватар для Humanoid
11554 / 4349 / 452
Регистрация: 12.06.2008
Сообщений: 12,453
08.12.2009, 08:46
Favorit, по кнопке щёлкни мышью два раза... что бы процедура Button1Click привязалась к кнопке.
0
109 / 95 / 9
Регистрация: 19.02.2009
Сообщений: 312
08.12.2009, 09:22
Посмотрите мой исходник - тут немного необычное, но сравнительно стойкое шифрование (гораздо сложнее для анализа, чем простой XOR), но пример очень прост. Вообще, это крипто задачка. Зашифровывается русский текст, пароль - текстовый, паролей может быть два, режим - что-то вроде поточного шифра, относительно замены символ заменяется в каждом выходе новым, поэтому соответствий просто так не найти. Да и изменение одного символа в пароле дает совершенно иной результат. Кстати, здесь нет проблемы нулевого символа, которая характерна при работе со строкой как S[n] := Char ( Byte(S[n]) xor Byte[Pwd[n]] ), где S[n] = Pwd[n]
Вложения
Тип файла: rar zmixer.rar (43.7 Кб, 375 просмотров)
0
109 / 95 / 9
Регистрация: 19.02.2009
Сообщений: 312
08.12.2009, 09:33
В прикрепленном файле - четыре рабочих варианта шифра с примером зашифровки/расшифровки текста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.12.2009, 09:33
Помогаю со студенческими работами здесь

Расшифровать и зашифровать файл с помощью алгоритма (IDEA) с паролем
нигде не могу найти инфы как пользоваться DEC v5.2 (https://github.com/winkelsdorf/DelphiEncryptionCompendium/releases) в общем нужно...

Напишите подпрограммы Encode (зашифровать) и Decode (расшифровать)
(в формах)Напишите подпрограммы Encode (зашифровать) и Decode (расшифровать), которые получают два параметра str и alpha типа string. В...

Зашифровать файл
доброго времени суток, пытаюсь зашифровать файл, все работает нормально , использую этот код for i:=1 to (FSize div kl)+1 do for...

Выбранный ранее файл в Memo нужно теперь открыть в ВинРар, чтобы зашифровать
Выбранный нами ранее файл в Memo нужно теперь открыть в ВинРар, чтобы зашифровать. Как реализовать с помощью программного кода в Лазарус?

Как зашифровать и расшифровать файл?
Есть файл "myfile". Нужно, чтобы при нажати на одну кнопку файл зашифровывался, а при нажатии на другую кнопку расшифровывался. С#. Как...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru