Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
hopov
0 / 0 / 0
Регистрация: 12.05.2015
Сообщений: 15
#1

RC4 Шифрование (Поправить ввод\вывод)

12.05.2015, 14:35. Просмотров 623. Ответов 6
Метки нет (Все метки)

Здравствуйте, столкнулся с такой проблемой: Шифрование работает отлично. Проблема в том, что при загрузке зашифрованного текста в memo из файла .txt не загружаются некоторые символы и поэтому расшифровка происходит не правильно. При шифровании\дешифровании без memo все работает отлично.

Если можете, помогите исправить ошибку считывания файла или переделать программу чтобы текст брался сразу из memo2 и шифровался в memo3 и наоборот. (memo1 - логи).

C++
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "MainUnit.h"
#include "RC4Unit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::ProcessFile(const AnsiString& pFrom, const AnsiString& pTo)
{
  // Если ключевая фраза будет пустой, алгоритм вылетит
  if (Edit1->Text == "")
  {
    ShowMessage ("Введите пароль для шифрования\дешифрования");
  }
 
  // Передаем ключевую фразу на генератор матрицы
  Memo1->Lines->Add("Инициализация матрицы..");
  RC4_InitKey(Edit1->Text.c_str(), Edit1->Text.Length());
  Memo1->Lines->Add("Выполнено 256 перестановок");
 
 
 
  Memo1->Lines->Add("Открытие файлов..");
  // Открываем первый файл на чтение
  HANDLE in = CreateFile(pFrom.c_str(), GENERIC_READ, 0, NULL,
                       OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
 
 
 
  if (in == INVALID_HANDLE_VALUE)
  {
    Memo1->Lines->Add("..ошибка!");
    Application->MessageBox(("Не удалось открыть входной файл: "+pFrom).c_str(), "  Ошибка",
                             MB_OK | MB_ICONERROR);
    return;
  }
 
  if (Edit1->Text == "")
  {
    ShowMessage ("Введите пароль для шифрования\дешифрования");
  }
  HANDLE out = CreateFile(pTo.c_str(), GENERIC_WRITE, 0, NULL,
                        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  if (out == INVALID_HANDLE_VALUE)
  {
    Memo1->Lines->Add("..ошибка!");
    Application->MessageBox(("Не удалось открыть выходной файл: "+pTo).c_str(), "  Ошибка",
                             MB_OK | MB_ICONERROR);
    CloseHandle(in);
    return;
  }
 
  unsigned char buffer[4096];
  DWORD readed, written;
  while (true)
  {
    ReadFile(in, buffer, 4096, &readed, NULL);
    if (readed == 0) break;
    Memo1->Lines->Add("Считан блок");
    for (int i=0; i<readed; i++)
      buffer[i] = RC4_Transform(buffer[i]);
    Memo1->Lines->Add("Обработано "+IntToStr(readed)+" байт");
    WriteFile(out, buffer, readed, &written, NULL);
    Memo1->Lines->Add("Записан блок");
  }
  CloseHandle(out);
  CloseHandle(in);
 
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::aEncryptExecute(TObject *Sender)
{
    if (Button3->OnClick)
    {
    Memo2->Lines->SaveToFile("TEXT.txt");
    Memo2->Lines->LoadFromFile("TEXT.txt");
    AnsiString Srce = OpenDialog1->FileName;
    AnsiString Dest = "TEXT_CRYPTED.txt";
    Memo1->Lines->Add("Начало зашифрования");
    ProcessFile(Srce, Dest);
    Memo3->Lines->LoadFromFile("TEXT_CRYPTED.txt");
    Memo1->Lines->Add("Зашифрование окончено");
    }
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::aDecryptExecute(TObject *Sender)
{
     if (Button4->OnClick)
     {
     Memo3->Lines->SaveToFile("TEXT_CRYPTED.txt");
     Memo3->Lines->LoadFromFile("TEXT_CRYPTED.txt");
     AnsiString Srce = OpenDialog2->FileName;
     AnsiString Dest = "TEXT_DECRYPTED.txt";
     Memo1->Lines->Add("Начало расшифрования");
     ProcessFile(Srce, Dest);
     Memo2->Lines->LoadFromFile("TEXT_DECRYPTED.txt");
     Memo1->Lines->Add("Расшифрование окончено");
     }
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::aExitExecute(TObject *Sender)
{
  Close();
}
 
//---------------------------------------------------------------------------

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2015, 14:35
Ответы с готовыми решениями:

Ввод-Вывод
1)Дано два целых числа a і b. Виведите гипотенузу с катетами a и b с точностью...

fstream ввод вывод
Нужно сделать этот код через потоки fstream, не могу разобраться. void...

Файловый ввод-вывод
Проблема вот в чем: надо несколько (пусть будет 2) разных файлов перемешать и...

Ввод-вывод данных
Добрый день ув. форумчане, брату необходимо для допуска к зачету составить...

Файловый ввод-вывод
Добрый день! Подскажите,как сделать дабы при вводе в файл можно было перейти...

6
kzru_hunter
1107 / 776 / 99
Регистрация: 01.02.2011
Сообщений: 1,779
Записей в блоге: 1
12.05.2015, 15:47 #2
Цитата Сообщение от hopov Посмотреть сообщение
Проблема в том, что при загрузке зашифрованного текста в memo из файла .txt не загружаются некоторые символы и поэтому расшифровка происходит не правильно.
Зачем тебе эти memo нужны? Тут же шифрование происходит -> бинарный текст.
Memo предназначены для обычного текста.
Я бы посоветовал в программе вместо двух мемо просто сделать две кнопки: "Открыть входной файл", "Открыть выходной файл", которые бы открывали эти файлы в блокноте (делается это вызовом функции ShellExecute).
Можно ещё сделать так, чтобы в тех мемо, где должен стоять зашифрованный текст, чтобы этот текст отображался(обязательно) в hex-формате.
1
hopov
0 / 0 / 0
Регистрация: 12.05.2015
Сообщений: 15
12.05.2015, 16:09  [ТС] #3
kzru_hunter, спасибо. Пробовал разные методы и понял что нереально вывести именно тот текст который сохраняется в мемо.

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

Мемо нужны в любом случает, в моей программе используются различные алгоритмы шифрования (для наглядности лучше в мемо и удобнее). RC4 это один из них, с которым имеется данная проблема
0
kzru_hunter
1107 / 776 / 99
Регистрация: 01.02.2011
Сообщений: 1,779
Записей в блоге: 1
12.05.2015, 16:44 #4
Цитата Сообщение от hopov Посмотреть сообщение
Про HEX отличная идея, но я не знаю как это сделать. Тогда как я понимаю можно сразу с мемо1 брать открытый текст и выводить в мемо2 в HEX, без создания .txt ?
Да. Берешь каждый символ текста и преобразовываешь в HEX, используя функцию IntToHex, а для обратного преобразования использовать функцию StrToInt (пример: StrToInt("0x"+Hex), где Hex-строка их 2-х символов, представляющих шестнадцатеричное число).
Есть ещё также функции BinToHex и HexToBin.
1
hopov
0 / 0 / 0
Регистрация: 12.05.2015
Сообщений: 15
12.05.2015, 17:09  [ТС] #5
kzru_hunter, Не получается передать текст из мемо для шифрования, без использования текстовых файлов. Чтобы было мемо1 -> шифрование -> перевод в HEX -> вывод в мемо2 (зашифр текст в hex формате) и обратно.

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

RC4.zip
0
kzru_hunter
1107 / 776 / 99
Регистрация: 01.02.2011
Сообщений: 1,779
Записей в блоге: 1
12.05.2015, 17:23 #6
Цитата Сообщение от hopov Посмотреть сообщение
Выкладываю сделанную для теста программу, если будет время гляньте пожалуйста.
Цитата Сообщение от hopov Посмотреть сообщение
Не получается передать текст из мемо для шифрования, без использования текстовых файлов.
Посмотрел исходник. В нём то же самое, что и в 1-м посте. Не увидел ваших стараний
0
hopov
0 / 0 / 0
Регистрация: 12.05.2015
Сообщений: 15
12.05.2015, 18:48  [ТС] #7
kzru_hunter, до того как создать тему на форуме не получалось ничего сделать, поэтому обратился сюда за помощью. Выложил последнюю более-менее адекватную версию программы
0
12.05.2015, 18:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2015, 18:48

Ввод-вывод массивов
Доброго всем времени суток! по долгу учебы приходиться возвращаться к забытому...

Необходимо организовать ввод/вывод
for(i=0;i&lt;OrdersCount;i++) { if(i&gt;0) out&lt;&lt;endl; ...

ввод/вывод.Объясните принцип.
Программа реализации модели ввода/вывода в режиме с опросом готовности. Как...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru