Форум программистов, компьютерный форум CyberForum.ru

Дешифрование - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как сравнить строки? http://www.cyberforum.ru/cpp-beginners/thread1008416.html
Бобрый день. Подскажите пжалста, как можно сравнить строки без учета регистра (шобы самому не писать функцию перевода в нижний регистр). надо сравнить две строковых переменные без учета регистра: String Sklad.tip; String poisk; // Создаю консольное приложение в визуал студии , интересуют именно сишные методы, а не визуала Заранее всем по "спасибу" :)
C++ No operator found which takes a right-hand operand Кто подскажет в чем ошибка? #include <iostream> #include <vector> class LongNumber { public: http://www.cyberforum.ru/cpp-beginners/thread1008409.html
Найти количество элементов массива вещественных чисел, дробная часть которых равна 0,5 C++
Найти количество элементов массива вещественных чисел, дробная часть которых равна 0,5
C++ В чем ошибки ?
#include<iostream> using namespace std; int main() { const int n = 10; int mas; int i;
C++ Ошибка в указателе http://www.cyberforum.ru/cpp-beginners/thread1008370.html
Необработанное исключение по адресу 0x6F274F98 (msvcr110d.dll) в Динамическая матрица.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFEEEFEE2. вот что выводит когда ввожу матрицы int main() { setlocale(LC_ALL, "Russian"); int N,M,Y,U; cout << "Введите размер первой" << endl; cin >> N >> M; int** p=new int*;
C++ Загвоздка с объявлением переменной Всем доброго времени суток. Недавно начал изучать С++ по Дейтелу. Есть такой пример программы, который прерывает цикл при определенном значении x при помощи break; //Применение break в структуре for #include "stdafx.h" #include <conio.h> #include <iostream> #include <iomanip> using namespace std; int main() { подробнее

Показать сообщение отдельно
nefton
44 / 20 / 5
Регистрация: 28.02.2013
Сообщений: 188
24.11.2013, 15:32     Дешифрование
сформулируй из чего может состоять текст и кодовое слово.
да, если символ в тексте и кодовом слове одинаковый - то результатом ^ будет 0;
эту проблемку можно решить думаю если файл открыть бинарно, и в начале файла писать 4 байта uint32_t длинну файла. Либо чтоб множества символов текста и кодового слова не пересекались. (например текст маленькими, кодовое слово большими) (или на 128 смести вперёд кодовое слово)

Добавлено через 4 часа 9 минут
Писал писал.. что не получается даже кодировать файл по нормальному
вот что есть (неправильно!):
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
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include <iostream>
#include <cstdint>
#include <fstream>
#include <string>
 
 
using namespace std;
 
bool IsValid(uint8_t _char);
bool IsValidFile(uint8_t* file, int filesize, uint8_t* key, int key_size);
bool IsValidKeyUnit(uint8_t* file, int filesize, uint8_t* key, int key_size, int key_unit);
 
void Print(uint8_t* file, int filesize, uint8_t* key, int key_size);
 
int main(){
 
    fstream input_file;
    fstream output_file;
    uint8_t char_buff;
    string vibor;
    string filename;
    
 
    string to_do_option;
    cout<<"encode/decode: ";
    cin>>to_do_option;
 
    string input_key;
    if (to_do_option == "encode"){
        
        cout<<"choose input file: ";
        cin>>filename;
        input_file.open(filename.c_str(), fstream::in);
        if(!input_file) cout<<"error open input file\n";
        
        cout<<"choose output file: ";
        filename = "";
        cin>>filename;
        output_file.open(filename.c_str(), fstream::out|fstream::trunc);
        if(!output_file) cout<<"error open output file\n";
        
        cout<<"input key for coding: ";
        cin>>input_key;
        
        
        int key_index = 0;
        
        while (input_file.good()){
            char_buff = input_file.get();
            if (!IsValid(char_buff)) continue;
            char_buff ^= input_key[key_index];
            output_file<<(char)(char_buff);
            key_index++;
            if (key_index >= input_key.size()) key_index = 0;
        }
        cout<<"encoding completed\n";
    }
 
    if (to_do_option == "decode"){
 
        cout<<"choose input file: ";
        cin>>filename;
        input_file.open(filename.c_str(), fstream::in);
        if(!input_file) cout<<"error open input file\n";
 
        string in;
        while (input_file.good()){
            char_buff = input_file.get();
            in += char_buff;
        }
 
        
        int file_size = in.size();
        uint8_t* Memory_file = new uint8_t[in.size()];
        for (int i = 0; i < in.size(); i++) Memory_file[i] = in[i];
        
        for (int key_size = 1; key_size < 10; key_size++){
            cout<<"Key sise to try: "<<key_size<<endl;
 
            uint8_t* key = new uint8_t[key_size]; 
            bool is_valid_key = 0;
            
            for (int i = 0; i<key_size; i++) key[i] = 0;
            
    _continue:
            
            bool is_est_chto_dvigat_flag = 0;
            bool is_max_key_flag = 0;
            int key_index = 0;
 
            while (!is_max_key_flag){
                is_est_chto_dvigat_flag = 0;
                //Двигаем по очереди разряды вверх
                if (!IsValidKeyUnit(Memory_file, file_size, key, key_size, key_index)){
                    if (key[key_index] < 255) key[key_index]++;
                    is_est_chto_dvigat_flag = 1;
                }
    
                key_index++;
                if (key_index >= key_size) key_index = 0;
                
                //Проверяем не дошли ли до максимума
                is_max_key_flag = 1;
                for (int i = 0; i<key_size; ++i){
                    if (key[i] < 255){
                        is_max_key_flag = 0;
                        break;
                    }
                }
 
                //Проверяем не получился ли файл
                if (IsValidFile(Memory_file, file_size, key, key_size)){
                    Print(Memory_file, file_size, key, key_size);
                    cout<<"Prodolzit perebor? (1/0) ";
                    cin>>vibor;
                    if (vibor == "1") {
                        //Продолжаем перебор... както????????
                        //НЕВЕРНЫЙ ПОДХОД
                    
                            
                        goto _continue;
                    }
                }
            }
            
            
 
            delete key;
 
            cout<<"Perebor key razmerom "<<key_size<<" okonchen\n";
 
 
        }
 
    }
            
    cout<<"input anithing to end: ";
    cin>>vibor;
 
    return 0;
}
 
 
bool inline IsValid(uint8_t _char){
 
    if ((_char >= 32)&&(_char <= 126)) return 1;
    if (_char == 13) return 1; //<CR> конец строки
    if (_char == 10) return 1; //<LF>
    if (_char == 9) return 1; //<TAB> табуляция
    return 0;
}
 
bool IsValidFile(uint8_t* file, int filesize, uint8_t* key, int key_size){
 
    int key_index = 0;
    for (int file_index = 0; file_index < filesize-1; ++file_index){
        if (!IsValid(file[file_index]^key[key_index])) return 0;
        key_index++;
        if (key_index >= key_size) key_index = 0;
    }
    return 1;
}
bool IsValidKeyUnit(uint8_t* file, int filesize, uint8_t* key, int key_size, int key_unit){
        
    for (int file_index = key_unit; file_index < filesize-1; file_index+=key_size){
        if (!IsValid(file[file_index]^key[key_unit])) return 0;
    }
    return 1;
}
 
 
 
 
void Print(uint8_t* file, int filesize, uint8_t* key, int key_size){
 
    cout<<"Key: ";
    for (int i = 0; i<key_size; i++) cout<<key[i];
    
    cout<<"\nEncripted file:n";
    int key_index = 0;
    for (int file_index = 0; file_index < filesize; ++file_index){
        cout<<(char)(file[file_index]^key[key_index]);
        key_index++;
        if (key_index >= key_size) key_index = 0;
    }
    cout<<"\n-------------------------------------\n";
}
Но я понял зато как надо верно его расшифровывать.
1. Допустим ключь размером N (к примеру 10)
2. Для каждого элемента ключа определяются возможные значения
3. Как то перебираем все комбинации этих возможных значений (рекурсия, но я не программист и это для меня сложно )
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru