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

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

16.11.2009, 07:54. Показов 9213. Ответов 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
11556 / 4351 / 452
Регистрация: 12.06.2008
Сообщений: 12,454
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
11556 / 4351 / 452
Регистрация: 12.06.2008
Сообщений: 12,454
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
11556 / 4351 / 452
Регистрация: 12.06.2008
Сообщений: 12,454
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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru