Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 1
Регистрация: 18.04.2015
Сообщений: 138
1

Мой алгоритм дешифрует не все

14.06.2015, 22:45. Показов 1444. Ответов 37
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, и опять я. Хотел с помощью XOR шифровать большие тексты (свыше 3к символов), но он некорректно справляется с 400-500 символов.
Код:
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
    
    #include <string>
    #include <iostream>
    #include <fstream>
     
    using namespace std;
     
    class Encoder
    {
    public:
            string encode(string key, string str)
            {
                    string res;
                    for (int i = 0; i < str.size() - 1; i++)
                            res += str[i] ^ key[i % key.size()];
     
                    return res;
            }
     
            string decode(string key, string str)
            {
                    string res;
                    for (int i = 0; i < str.size() - 1; i++)
                            res += str[i] ^ key[i % key.size()];
     
                    return res;
            }
    };
     
    string Reading(string path)
    {
            ifstream fin(path);
            string readText;
     
            if (!fin.is_open())
                    return readText;
     
            while (!fin.eof())
            {
                    char tmp;
                    fin.get(tmp);
                    readText += tmp;
            }
     
            return readText;
    }
     
    void Entry(string path, string text)
    {
            ofstream fout(path);
            int size = text.size();
     
            if (!fout.is_open())
                    return;
     
            fout << text << endl;
    }
     
    int main()
    {
            Encoder encoder1;
     
            string originalText = Reading("fin.txt"); //оригинальны текст (300-400 символов)
            string encodedText = encoder1.encode(Reading("key.txt"), originalText); //кодирование ключ в текстовом файле, он тоже где-то 300-400 символов
           
            Entry("fout.txt", encodedText); //Записываю результат шифрования
     
            encodedText = Reading("fout.txt"); //Открываю файл с зашифрованным текстом и читаю его
            string decodedText = encoder1.decode(Reading("key.txt"), encodedText); //дешифрую его
     
            Entry("fout1.txt", decodedText); //Записываю в другой файл
     
            while (true);
            return 0;
    }
Чтение — нормально, все считывает. Шифрование — нормально, шифрует как надо. Дешифровка с файла не происходит, дешифрует только 40-60 символов, хотя считывает все.

fin — файл с текстом на английском. key — в нём ключ, ибо он очень длинный. fout — зашифрованный текст. fout1 — дешифрованный fout (который мы ранее зашифровали).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2015, 22:45
Ответы с готовыми решениями:

Мой алгоритм шифрования
Здравствуйте! Я студент, готовлюсь к одному конкурсу по программированию. Для него я подготовил...

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

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

Правильный ли мой алгоритм вхождения строки в подстроку по уровню?
Есть строки состоящие из цифр и точек. Например 2 2.1 2.2 2.2.1 20 3 3.1 ......

37
0 / 0 / 1
Регистрация: 18.04.2015
Сообщений: 138
14.06.2015, 22:52  [ТС] 2
Мой алгоритм дешифрует не все
Мой алгоритм дешифрует не все
Мой алгоритм дешифрует не все
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
14.06.2015, 23:23 3
Цитата Сообщение от uLong Посмотреть сообщение
Это "ни о чем".

Работать надо с байтами и явным размером.

http://gazlan.narod.ru/toy_tools/xor.rar

Код
Файл SrcFile перезаписывается на месте без предупреждения.
Если Вам нужен оригинальный файл - сделайте Backup-копию.

Файл XorFile открывается только для чтения и не изменяется.

Файл XorFile используется как Binary Template и не должен
содержать никаких "лишних" символов - таких как пробел,
табуляция, перевод строки.

Размер каждого из файлов не должен превышать 2 Gb.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   // Do Actual Work       
   char*    pSrcStr = (char*)pSrcView;
   char*    pXorStr = (char*)pXorView;
 
   DWORD    dwSrcOfs = 0;
   DWORD    dwXorOfs = 0;
 
   do
   {
      for (DWORD ii = 0; ii < dwXorSizeLo; ++ii)
      {
         *(pSrcStr + dwSrcOfs++) ^= *(pXorStr + dwXorOfs++);
 
         dwXorOfs %= dwXorSizeLo;
      }
   } 
   while (dwSrcOfs < dwSrcSizeLo);
0
0 / 0 / 1
Регистрация: 18.04.2015
Сообщений: 138
14.06.2015, 23:37  [ТС] 4
Так в чем проблема? В том что я использую string вместо char? Так string тоже набор char символов.
Укажите на проблему. С текстами поменьше все нормально. А string использую что бы не хаставлять пользователя вводить размер.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
14.06.2015, 23:41 5
Цитата Сообщение от uLong Посмотреть сообщение
чтобы
Размер и так известен - это размер файла.
0
0 / 0 / 1
Регистрация: 18.04.2015
Сообщений: 138
15.06.2015, 00:00  [ТС] 6
Да, так и есть, но с файлми просто для теста, что бы не вводить такие длинные тексты. Вообще программа не должна требовать размер текста, а потом ещё и размер ключа. По этому я просто добавил чтение/запись. Пользователь будет вводить только ключ и текст, это очень важно.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
15.06.2015, 00:20 7
Цитата Сообщение от uLong Посмотреть сообщение
Поэтому
опять нарветесь на ту же проблему. Размер двоичного буфера не может быть вычислен, он должен задаваться явно. И лучше не полагаться на свойства контейнера (string) - он может быть потерян при преобразовании.
0
0 / 0 / 1
Регистрация: 18.04.2015
Сообщений: 138
15.06.2015, 00:26  [ТС] 8
Какое же решение? Я не могу знать заранее ключ или текст. Посоветуйте что-то, желательно то, что бы вы сами использовали, если бы нужно было вводить без указания размера. Я новичек, string — это первое, что пришло в голову.
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
15.06.2015, 00:27 9
C++
1
2
if (!fin.is_open())
                    return readText;
ой не нравится мне это, readText бы изначально обьявить как ""

ещё вот возможно рабочий совет, закрывайте потоки(файлы) после того как прочтёте\запишете
0
0 / 0 / 1
Регистрация: 18.04.2015
Сообщений: 138
15.06.2015, 00:30  [ТС] 10
Цитата Сообщение от Krock21rus Посмотреть сообщение
C++
1
2
if (!fin.is_open())
                    return readText;
ой не нравится мне это, readText бы изначально обьявить как ""

ещё вот возможно рабочий совет, закрывайте потоки(файлы) после того как прочтёте\запишете
Учту. В настоящий момент я уже закрыл потоки, просто не хотел обновлять код.
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
15.06.2015, 00:36 11
как лучше сделать? считывать побитово(в идеале), ну посимвольно в реальности равномерно с обоих файлов, к примеру есть файл сообщение.тхт и ключ.тхт, они должны быть равны если шифрование вернама, ну или сделать циклически для ключа.
так вот, делаем 2 переменные char: a и b;
и делаем цикл от 0 до размера файла в символах(до конца файла) считываем в 'a' символ с сообщение.тхт, в 'b' считываем символ с ключ.тхт, делаем XOR, к примеру char c = a XOR b, и записываем 'с' в файл закодированное_сообщение.тхт

как же раскодировать?
точно так же, только вместо "сообщение.тхт" использовать "закодированное_сообщение.тхт".

сейчас набросаю код

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ifstream fin1("input.txt");
ifstream fin2("key.txt");
ofstream fout("output.txt");
char a,b,c;
fin1 >> a;
fin2 >> b;
while(!fin1.eof())
{
   c = a ^ b;
   fout << c;
   fin1 >> a;
   fin2 >> b;
   if(fin2.eof())
     {
     fin2.close();
     fin2.open("key.txt");
     fin2 >> b;
     }
}
возможны проблемы с короткими, либо неравными входными данными, да и вообще не могу гарантировать правильность кода, не проверял, но скорее всего рабочий
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
15.06.2015, 00:36 12
Цитата Сообщение от uLong Посмотреть сообщение
нович0к
Обычная практика - размер помещается первым DWORD'ом в буфер.

В любом случае, вы же как-то передаете ваши зашифрованные данные и ключ? - там же можете передать и их размеры (и прочие метаданные - Timestamp, CRC etc).
0
0 / 0 / 1
Регистрация: 18.04.2015
Сообщений: 138
15.06.2015, 00:38  [ТС] 13
Хорошо, будет полезно. Но мне нужно вводить ключ и текст без указания размера, я решил использовать string и появились проблемы (см. выше) с дешифровкой. Человек выше говорит что это из-за string, что нужно использовать char. Я теряюсь.. Даже не знаю что делать.
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
15.06.2015, 00:41 14
gazlan, не подскажете можно ли одной операцией считать весь файл в строку? cin >> для слова, getline для строки, думаю есть и getall, getfile для всего файла

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
string decode(string key, string str)
            {
                    string res="";
                    for (int i = 0; i < str.size(); i++)
                            res += str[i] ^ key[i % key.size()];
     
                    return res;
            }
чуть чуть подправил, возможно поможет
0
0 / 0 / 1
Регистрация: 18.04.2015
Сообщений: 138
15.06.2015, 00:43  [ТС] 15
Извините за ошибку, я не сильно хорошо знаю русский. Ну тогда пользователю нужно будет вводить этот DWORD. А ему это не нужно, он хочет в один клик шифровать и дешифровать. Дайте пожалуйста ссылку на справку по DWORD..
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
15.06.2015, 00:46 16
хотя всё равно могу ошибаться, может быть и считывается символ '\0' в конце
кстати надо проверить правильность string'ов, чтобы все заканчивались на '\0'

Добавлено через 2 минуты
если всё что выше вам не помогло, я могу лишь посоветовать вам включить отладку и проверять файл fout.txt после каждой записи
0
0 / 0 / 1
Регистрация: 18.04.2015
Сообщений: 138
15.06.2015, 00:49  [ТС] 17
Цитата Сообщение от Krock21rus Посмотреть сообщение
хотя всё равно могу ошибаться, может быть и считывается символ '\0' в конце
кстати надо проверить правильность string'ов, чтобы все заканчивались на '\0'

Добавлено через 2 минуты
если всё что выше вам не помогло, я могу лишь посоветовать вам включить отладку и проверять файл fout.txt после каждой записи
То Что я использую string, это плохо ? Могут возникнуть проблемы?
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
15.06.2015, 00:49 18
нашёл информацию про DWORD:
DWORD — 32-битное беззнаковое целое. Аналоги: unsigned long int, UINT.

зачем нужно использовать DWORD? и думаю не стоит вообще его использовать т.к. вводит в заблуждение
0
0 / 0 / 1
Регистрация: 18.04.2015
Сообщений: 138
15.06.2015, 00:52  [ТС] 19
Цитата Сообщение от Krock21rus Посмотреть сообщение
нашёл информацию про DWORD:
DWORD — 32-битное беззнаковое целое. Аналоги: unsigned long int, UINT.

зачем нужно использовать DWORD? и думаю не стоит вообще его использовать т.к. вводит в заблуждение
Тогда что использовать то?
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
15.06.2015, 00:54 20
Я говорил уже, вам вообще не нужны строки. И чем раньше вы о них забудете, чем лучше.

Например, по приведенной мной ранее ссылке, используется file mapping и вся обработка сводится к XOR'у двух массивов, об остальном позаботится OS.

Если ваш файл так велик, что RAM не хватает - читайте частями в буфер меньшего размера - без всяких преобразований типа и создания бесполезных дополнительных оберток (a la string).

Если же непременно хочется использовать потоки, можете читать файл посимвольно (OS возьмет на себя буферизацию).
0
15.06.2015, 00:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2015, 00:54
Помогаю со студенческими работами здесь

Написать программу, которая шифрует и дешифрует файл алгоритмом с открытым ключом
шифруещая и дешифруещая программа на с++ с открытым ключом

Google потерял все ссылки на мой сайт -> PR=0
Доброго времени суток. Сайту месяца 3. После публикации его в нете раскручивал на досках...

Написать программу, которая дешифрует текст исходного текстового файла, состоящего из различных слов и знаков препинания
Добрый день. Не могу разобраться с тем, как написать программу. Скоро надо сдавать, а у меня ничего...

Блокнот. Как создать блокнот для Android? Правильно ли мой алгоритм написан?
Добрый день Всем! Правильно ли пишу блокнот с компонентами: 1. Memo1 2. Button 2 штуки. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru