Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Чугунные скороходы
 Аватар для ARRAYBOW
17 / 16 / 3
Регистрация: 25.12.2022
Сообщений: 367

Асимметричное шифрование

02.02.2025, 18:58. Показов 20349. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Код:
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
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
#include <iostream>
#include <Windows.h>
#include <fstream>
#include <vector>
#include <map>
#include <io.h>
#include "RandomV2.h"
 
#pragma warning(disable : 4996)
 
#ifdef __cpp_lib_experimental_filesystem
#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem::v1;
#elif __cpp_lib_filesystem
#include <filesystem>
namespace fs = std::filesystem;
#else
#error "no filesystem support ='("
#endif
 
using std::wifstream,
      std::wofstream,
      std::ifstream,
      std::ofstream,
      std::string,
      std::wstring,
      std::vector,
      std::wcout,
      std::map,
      std::stringstream;
using namespace effolkronium;
std::locale utf8;
random_local rd{};
 
class NoConvCodecvt : public std::codecvt<char, char, mbstate_t>
{
public:
    virtual bool do_always_noconv() const throw() override
    {
        return true;
    }
};
 
namespace CryptInstaller {
 
    namespace Path {
 
        template <typename _WStr> wstring GetPathW(_WStr path) {
            vector<wchar_t> pathBuf;
            DWORD copied = 0;
            do {
                pathBuf.resize(pathBuf.size() + 260);
                copied = GetModuleFileNameW(nullptr, &pathBuf.at(0), pathBuf.size());
            } while (copied >= pathBuf.size());
            pathBuf.resize(copied);
            wstring path_(pathBuf.begin(), pathBuf.end());
            return fs::path(path_).parent_path().wstring() + L"\\" + wstring(path);
        }
 
        template <typename _Str> string GetPath(_Str path) {
            vector<char> pathBuf;
            DWORD copied = 0;
            do {
                pathBuf.resize(pathBuf.size() + 260);
                copied = GetModuleFileNameA(nullptr, &pathBuf.at(0), pathBuf.size());
            } while (copied >= pathBuf.size());
            pathBuf.resize(copied);
            string path_(pathBuf.begin(), pathBuf.end());
            return fs::path(path_).parent_path().string() + "\\" + string(path);
        }
 
    }
 
    namespace Crypt {
 
        class File {
        protected:
            size_t key_pos = 0;
            string key;
        public:
            File(string _key) : key(_key) {}
            vector<char> encrypt(vector<char> mess) {
                vector<char> vkey;
                vector<char> result;
 
                for (size_t i = 0; i < key.size(); i++) vkey.push_back(key[i]);
 
                char r;
                for (size_t i = 0; i < mess.size(); i++) {
                    if (key_pos >= vkey.size()) key_pos = 0;
                    r = mess[i];
                    r ^= vkey[key_pos];
                    result.push_back(r);
                    key_pos++;
                }
 
                return result;
            }
 
            vector<char> decrypt(vector<char> mess) {
                vector<char> vmess;
                vector<char> vkey;
                vector<char> result;
 
                for (size_t i = 1; i <= mess.size(); i++) vmess.push_back(mess[mess.size() - i]);
                for (size_t i = 0; i < key.size(); i++) vkey.push_back(key[i]);
 
                char r;
                for (size_t i = 0; i < vmess.size(); i++) {
                    if (key_pos >= vkey.size()) key_pos = 0;
                    r = vmess[i];
                    r ^= vkey[key_pos];
                    result.push_back(r);
                    key_pos++;
                }
 
                vector<char> buff;
                for (size_t i = 1; i <= result.size(); i++) buff.push_back(result[result.size() - i]);
                return buff;
            }
        };
 
        void encrypt(ifstream& in, ofstream& out, string key) {
            in.imbue(utf8);
 
            in.setstate(0);
            out.setstate(0);
 
            in.seekg(0, std::ios::end);
            size_t block_size = in.tellg();
            in.seekg(0, std::ios::beg);
 
            vector<char> buff;
            buff.resize(block_size);
            vector<char> output;
            output.resize(block_size);
 
            File crypt(key);
 
            in.read(&buff[0], block_size);
            output = crypt.encrypt(buff);
            out.write(&output[0], output.size());
 
            wcout << std::to_wstring(block_size) << L"\n";
            in.setstate(0);
            out.setstate(0);
        }
 
        void decrypt(ifstream& in, ofstream& out, string key) {
            out.imbue(utf8);
 
            in.setstate(0);
            out.setstate(0);
 
            in.seekg(0, std::ios::end);
            size_t block_size = in.tellg();
            in.seekg(0, std::ios::beg);
 
            vector<char> buff;
            buff.resize(block_size);
            vector<char> output;
            output.resize(block_size);
 
            File crypt(key);
 
            in.read(&buff[0], block_size);
            output = crypt.decrypt(buff);
            out.write(&output[0], output.size());
 
            wcout << std::to_wstring(block_size) << L"\n";
            in.setstate(0);
            out.setstate(0);
        }
 
        string getKey() {
            ifstream fkey(Path::GetPath("KEY-DO-NOT-REMOVE.key"));
            fkey.imbue(utf8);
 
            size_t block_size = 128;
            size_t blocks = 32;
 
            string key;
            char* buff = new char[(const size_t)block_size];
 
            for (size_t i = 0; i < blocks; i++) {
                fkey.read(buff, block_size);
                key += buff;
                fkey.ignore();
            }
 
            fkey.close();
 
            return key;
        }
    }
 
    void generateKey() {
        wofstream key(Path::GetPathW(L"KEY-DO-NOT-REMOVE.key"));
        key.imbue(utf8);
 
        const size_t block_size = 128;
        const size_t blocks = 32;
 
        wstring buff;
        buff.resize(block_size);
 
        unsigned short b;
 
        for (size_t i = 0; i < blocks; i++) {
            for (size_t j = 0; j < block_size; j++) {
 
                const unsigned short min = 0x00A0;
                const unsigned short max = 0x00FF;
 
                b = rd.get(min, max);
                //b = (rand() % (max - min) + min);
 
                buff[j] = (wchar_t)b;
            }
 
            key.write(buff.c_str(), block_size);
            key.write(L"\n", 1);
        }
        key.close();
    }
 
    void build(wchar_t* curr_path) {
        wcout << L"Читаю ключ...\n";
        
        string key = Crypt::getKey();
 
        CreateDirectoryW(Path::GetPathW(L"build\\").c_str(), NULL);
        CreateDirectoryW(Path::GetPathW(L"build\\data\\").c_str(), NULL);
 
        wcout << L"Подготовка...\n";
 
        fs::copy(curr_path, Path::GetPathW(L"build\\" + fs::path(curr_path).filename().wstring()), fs::copy_options::overwrite_existing);
        fs::copy(Path::GetPathW(L"KEY-DO-NOT-REMOVE.key"), Path::GetPathW(L"build\\KEY-DO-NOT-REMOVE.key"), fs::copy_options::overwrite_existing);
 
        wcout << L"Шифрую файлы...\n";
 
        for (auto& p : fs::directory_iterator{ Path::GetPathW(L"src\\") }) {
            ifstream in(p.path().string(), std::ios::binary);
            ofstream out("build\\data\\" + p.path().filename().string() + ".encrypted", std::ios::binary);
            Crypt::encrypt(in, out, key);
            in.close();
            out.close();
        }
    }
 
    string getRandStr() {
        string buff = "";
 
        unsigned short ch = 0;
        for (size_t i = 0; i < 20; i++) {
            ch = 0;
            while (!(ch >= 0x0030 && ch <= 0x007A && !(ch >= 0x003A && ch <= 0x0040) && !(ch >= 0x005B && ch <= 0x0060))) ch = rd.get(0x0030, 0x007A);
            buff += (char)ch;
        }
        return buff;
    }
    
    void execute(wchar_t* curr_path) {
        if (!fs::exists(Path::GetPathW(L"data\\"))) {
            MessageBoxW(GetConsoleWindow(), L"Компилируемые файлы не найдены!", curr_path, MB_OK);
            return;
        }
 
        wcout << L"Читаю ключ...\n";
 
        string key = Crypt::getKey();
 
        wcout << L"Подготовка...\n";
 
        string path = string(getenv("APPDATA")) + "\\File_" + getRandStr() + "\\";
        CreateDirectoryA(path.c_str(), NULL);
 
        wcout << L"Установка...\n";
 
        for (auto& p : fs::directory_iterator{ Path::GetPathW(L"data\\") }) {
            ifstream ff(p.path().string(), std::ios::binary);
            string fname = p.path().filename().string().substr(0, p.path().filename().string().find_last_of(".encrypted") - 9);
            ofstream of(path + fname, std::ios::binary);
            Crypt::decrypt(ff, of, key);
            ff.close();
            of.close();
        }
    }
}
 
int wmain(int** argc, wchar_t* argv[])
{
    //†
    _setmode(_fileno(stdout), 0x20000);
    setlocale(LC_ALL, "ru-RU.UTF-8");
    std::ios_base::sync_with_stdio(false);
    try {
        //utf8 = std::locale(std::locale(".1252"), new NoConvCodecvt());
        utf8 = std::locale(".1252");
    }
    catch (std::runtime_error& e) {
        //utf8 = std::locale(std::locale(".utf-8"), new NoConvCodecvt());
        utf8 = std::locale(".utf-8");
        wcout << e.what() << L"\n";
    }
    if (argc > (int**)1 && wcscmp(argv[1], L"--gen-key") == 0) {
 
        CryptInstaller::generateKey();
 
        wcout << L"Нажми любую клавишу чтобы выйти!\a";
        getwchar();
        return 0;
    }
    if (argc > (int**)1 && wcscmp(argv[1], L"--build") == 0) {
        
        CryptInstaller::build(argv[0]);
 
        wcout << L"Нажми любую клавишу чтобы выйти!\a";
        getwchar();
        return 0;
    }
 
    CryptInstaller::execute(argv[0]);
 
    wcout << L"Нажми любую клавишу чтобы выйти!\a";
    getwchar();
    return 0;
}
1 фото - файл до, 2 фото - файл после, 3 фото - ключ
Миниатюры
Асимметричное шифрование   Асимметричное шифрование   Асимметричное шифрование  

0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.02.2025, 18:58
Ответы с готовыми решениями:

Асимметричное шифрование, RSA
Задача такая: для зашифровки текста нужно возвести число в большую степень и взять по нем модуль. Не могу никак реализовать больше, чем...

Создать программы, осуществляющие шифрование и шифрование своих введенных текстовых данных согласно варианту kuznechik
Создать программы, осуществляющие шифрование и шифрование своих введенных текстовых данных согласно варианту kuznechik

Шифрование паролей
Есть БД(InterBase), доступ к ней у разных пользователей. У каждого свой пароль. Пароли соответственно хранятся в той же БД. Тип их char(8),...

44
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
09.02.2025, 22:17
Студворк — интернет-сервис помощи студентам
ИМХО хоть сколько ни будь сложный (для расшифровки) алгоритм шифрования должен выдавать на выходе разные "кракозябры" при шифровании одинакового текста одним ключом.
0
 Аватар для Annemesski
2690 / 1347 / 485
Регистрация: 08.11.2016
Сообщений: 3,735
10.02.2025, 09:24
Цитата Сообщение от alexu_007 Посмотреть сообщение
выдавать на выходе разные "кракозябры" при шифровании одинакового текста одним ключом
Как вы себе это представляете? Это чистейшая математическая неопределенность - таких функций просто не существует, а если бы и существовали, то в виду этой же неопределенности сообщение невозможно было бы достоверно расшифровать, то есть сообщение просто превращалось бы в бессмыслицу для получателя, который не сможет его прочитать. Если коротко: по сути вы предлагаете просто генерировать случайные "кракозябры" вместо исходного сообщения и отправлять их собеседнику.

Вообще, не помню точно так ли он называется, давно сформулирована концепция "идеального" шифра, суть которого сводится к тому, что зашифрованное сообщение представляет собой осмысленный текст по достоверности не отличающийся от исходного, то есть чисто внешне не должно быть понятно требует ли сообщение расшифровки или же это само сообщение как есть, при этом алгоритм шифрования-дешифрования должен быть таким, что шифрование генерирует осмысленный текст и дешифрование неверным ключом генерирует осмысленный текст (но, естественно, с подложным содержанием).
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,028
10.02.2025, 13:20
Так идеальный шифр на то и идеальный, что его реализация вряд ли возможна в реальности.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
10.02.2025, 15:52
Цитата Сообщение от alexu_007 Посмотреть сообщение
А еще лучше зашифровать последовательно несколькими разными шифрами
Но это нужно с умом делать.

Например, возьмем шифр Виженера.

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

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

Метод шифрования разными ключами работает, но нужно быть осторожным. Я уже писал об этом на форуме:

Цитата Сообщение от Royal_X Посмотреть сообщение
Допустим, сперва шифруем ключом "кот", потом полученный шифр еще раз шифруем ключом "рысь" и потом еще раз ключом "тигра". И вот этими тремя ключами можно надежно шифровать текст до 60 букв включительно. Т.е. нам не пришлось использовать ключ длиной 60 символов, который есесена был бы неосмысленным, а оказалось достаточно трех маленьких легко запоминающихся ключей общей длиной в 12 символов. Секрет этого метода в том, что НОК длин всех ключей равен 60: lcm(3, 4, 5) = 60
Этот момент очень важен. Ведь если бы использовали три ключа, например, "пушка", "барон", "чайка", то в итоге оказалось бы, что текст зашифрован всего лишь ключом длины 5: lcm(5, 5, 5) = 5. Отсюда вывод, что для каждой новой итерации нужно подбирать ключ, длина которого это уникальное простое число (уникальное - типа, что другие ключи не имеют той же длины).
Таким образом, мы можем использовать шифр Виженера для больших текстов. Например, используя 4 ключа длинами 3, 4, 5, 7 можно шифровать текст длиной 420 букв включительно. А если использовать 5 ключей длинами 3, 4, 5, 7, 11, то можно шифровать текст до 4620 букв включительно.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
10.02.2025, 21:01
Цитата Сообщение от Annemesski Посмотреть сообщение
Как вы себе это представляете? Это чистейшая математическая неопределенность
Это несложно, если ввести в исходное сообщение некоторый ключ. Например в байтовую последовательность добавить нулевой случайный байт, а дальше делать XOR первого байта с нулевым, второго с первым и т.д. (расшифровка в обратной последовательности с конца, нулевой байт отбрасываем). Для зашифрованной последовательности из одной буквы (символа) плохо сработает, для реального текста получится внешне случайная последовательность. Пожалуйста, получите 256 вариантов одного и того же текста. Но кто ж из реальных шпионов противнику кодовую таблицу из зашифрованной многократно повторенной каждой буквы предоставляет для удобства расшифровки?

Есть и ещё одно соображение. В криптографии как-то считается, что секретным должен быть ключ, а сам алгоритм (программа для шифрования) общедоступным. Это отчасти верно, но только для не программистов. Сами люди придумать и написать ничего ессно не могут, лезут в интернет, читают отзывы, скачивают открытые программы для шифрования. А, допустим, я хочу обмениваться шифровками с американцем Джоном. Я пишу свою уникальную программу шифрования, наверчиваю туда все что в воспаленный разум придет, зашифровываю её открытой программой и отправляю Джону. Джон её расшифровывает, и мы начинаем пользоваться моей шифровальной программой, которая есть только у меня и у Джона. И тем, кто перехватит наши кракозябры нужно еще догадаться, с какой стороны к ним подступаться, XOR там, не XOR, а может я в середину процесса стандартный сишный rand() вставлю для прикола.

Добавлено через 10 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
Например, возьмем шифр Виженера.
Нахрена брать это средневековое старьё? Шифровать нужно не буквы, а байты и файлы, мы живем в век компьютеров.

Добавлено через 2 минуты
Цитата Сообщение от alexu_007 Посмотреть сообщение
Пожалуйста, получите 256 вариантов одного и того же текста.
Добавьте в начало 2 случайных байта, получите 256 * 256 вариантов.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
10.02.2025, 21:04
Цитата Сообщение от alexu_007 Посмотреть сообщение
Нахрена брать это средневековое старьё? Шифровать нужно не буквы, а байты и файлы, мы живем в век компьютеров.
читаешь невнимательно

Цитата Сообщение от Royal_X Посмотреть сообщение
смысл шифра Виженера в том, что его можно дешифровать в полевых условиях без компа, имея лишь листок бумаги.
хотел бы тебя увидеть в полевых условиях во время дешифровки Twofish)

Добавлено через 2 минуты
Цитата Сообщение от alexu_007 Посмотреть сообщение
средневековое старьё
не важно, когда придумано (все важнейшие открытия были сделаны давно, кроме квадроберов, конечно), а важно настолько оно криптостойкое. Про криптостойкость Виженера я писал выше.
0
 Аватар для Annemesski
2690 / 1347 / 485
Регистрация: 08.11.2016
Сообщений: 3,735
10.02.2025, 23:05
Цитата Сообщение от alexu_007 Посмотреть сообщение
Например
чушь какая-то, где тут получается различный шифр на выходе? У вас ключ это нулевой байт сообщения, вы просто предлагаете, по сути, какой-то корявенький механизм генерации подключей из ключа и исходного сообщения, который используется в тех же ГОСТ и AES и, при этом, никак не получается что при одном и том же сообщении зашифрованном одним и темже ключом получается разный шифр.
Цитата Сообщение от alexu_007 Посмотреть сообщение
ещё одно соображение
открытость алгоритма важна по многим причинам, две главные:
1. доверие к алгоритму. Вот есть есть программа шифровальщик, никто кроме автора не знает алгоритма, а значит никто, опять же кроме автора, не знает про бэкдоры которые автор там разместил, например некий мастер ключ который дешифрует любой шифр закодированный этим алгоритмом - как по вашему будет ли такое пользоваться хоть какой-нибудь популярностью?
2. невозможность проверить или же доказано обосновать криптостойкость алгоритма, поскольку он неизвестен, может там туфта которую лингвист второкурсник на листе бумаги за 5 минут дешифрует, и, опять же, будет ли кто-то таким пользоваться?

Нет и нет - на тему поприкалываться с ребятами со двора, да, может быть забавно, типа разговоров через "ку", но на сколь-нибудь серьезном уровне (типа передачи данных вашей банковкой карты через сервис онлайн оплаты) я думаю вы и сами не доверите некому закрытому алгоритму (если, конечно, рубите фишку как говорят у нас в деревне).
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
11.02.2025, 07:03
Цитата Сообщение от Annemesski Посмотреть сообщение
при этом, никак не получается что при одном и том же сообщении зашифрованном одним и темже ключом получается разный шифр.
При этом получается разная последовательность байт уже до шифрования. Она зависит от первого байта, который мы добавили в начало, и который случайный. Ессно и после шифрования мы получим разную последовательность.
0
 Аватар для Annemesski
2690 / 1347 / 485
Регистрация: 08.11.2016
Сообщений: 3,735
11.02.2025, 09:46
alexu_007, а, типа такое добавление соли к ключу, но тоже бред - это никак не увеличивает криптостойкость, скорее даже наоборот: часть ключа шифрования в зашифрованном виде лежит внутри шифра, при этом, очевидно, имеет четко определнное место расположения или идентифицирующий паттерн, что позволяет проводить атаки на ключ шифрования. Тут прикол в том что соль увеличивает энтропию в односторонних функциях именно потому что эти шифры не дешифруются, то есть не существует даже обратного алгоритма получения прообраза из хэша, в противном случае соль раскрывает часть информации о ключе, что упрощает взлом шифра.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
11.02.2025, 10:19
Цитата Сообщение от Annemesski Посмотреть сообщение
это никак не увеличивает криптостойкость, скорее даже наоборот: часть ключа шифрования в зашифрованном виде лежит внутри шифра
А может я его в начало шифровки засуну. А может в конец. А может разбросаю по всему зашифрованному тексту, например 15-й, 152й и 180-й байты - это ключи. А может ключи 2-х байтовые. Может ключи напрямую используются для шифра, а может и они зашифрованы, и перед использованием их нужно декодировать. Попробуй найди.

Пока не получишь доступ к закрытой программе шифрования - хрен ты чего расшифруешь. Никакие методы лингвистического анализа не помогут. Даже если ты получишь исходный и зашифрованный текст сообщения - это ничего не даст в плане понимания, как его зашифровали.
0
 Аватар для Annemesski
2690 / 1347 / 485
Регистрация: 08.11.2016
Сообщений: 3,735
11.02.2025, 11:07
Цитата Сообщение от alexu_007 Посмотреть сообщение
Пока не получишь доступ к закрытой программе шифрования
ваша закрытая программа шифрования на керн никому не нужна - это как в науке: принципиально неопровергаемые гипотезы всерьез не рассматриваются (критерий Поппера), так и тут, закрытая программа шифрования (якобы) некомпрометируема по причине закрытости, но это чушь, поскольку тут именно что якобы нельзя скомпрометировать алгоритм потому что он неизвестен (типа нечего компрометировать) но при этом он может оказаться слабым, суть: к закрытому алгоритму не может быть доверия как к стойкому ко взлому, поскольку эту стойкость нельзя доказать в виду отсутствия знаний об алгоритме.
Цитата Сообщение от alexu_007 Посмотреть сообщение
Попробуй найди.
все вот эти вот ваши "а может я его туда...", " а может я его вот так..." так или иначе будут отражены в алгоритме, а значит, так или иначе, оставят некий регулярный след в самом шифре, даже закрытый алгоритм не спасет от определения реперных точек со служебной информацией - еще раз - инъекция ключа в шифр это только на руку взломщику.
1
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
11.02.2025, 12:47
Цитата Сообщение от Annemesski Посмотреть сообщение
так или иначе, оставят некий регулярный след в самом шифре
Да ничего они не оставят. Чем байт ключа (случайный, в диапазоне 0-255) отличится от байта зашифрованного текста, тоже случайного и в таком же диапазоне? Нет никаких реперных точек. Байты все одинаковые. А какой к чему относится, знает только программист и программа.
0
 Аватар для Annemesski
2690 / 1347 / 485
Регистрация: 08.11.2016
Сообщений: 3,735
11.02.2025, 13:09
Цитата Сообщение от alexu_007 Посмотреть сообщение
Чем байт ключа (случайный, в диапазоне 0-255) отличится от байта зашифрованного текста
тем что это байт ключа, а не сообщения - байт ключа абсолютно случаен, байт сообщения контестнозависим, сиречь: диапазон дешифровки байта сообщения уже диапазона дешифровки байта ключа, при этом если сделать генератор ключа контекстнозависимым, чтобы он не отличался по диапазону дешифровки и не давал всплесков типа буква посреди числа, запятая посреди слова и т.д. (что в общем случае невозможно без подгонки исходного сообщения), то это еще хуже поскольку содержит алгоритм (четкую последовательность действий) что сильно снижает случайность ключа, а следовательно и его стойкость.
0
Чугунные скороходы
 Аватар для ARRAYBOW
17 / 16 / 3
Регистрация: 25.12.2022
Сообщений: 367
11.02.2025, 14:37  [ТС]
Цитата Сообщение от Annemesski Посмотреть сообщение
тем что это байт ключа, а не сообщения - байт ключа абсолютно случаен, байт сообщения контестнозависим
В чем проблема тогда использовать байт из сообщения, ключа нет. Теперь думай какие байты программа взяла для шифрования текста

Добавлено через 4 минуты
Как вариант, создать exe-файл, заполнить поля, только вместо сектора .code - зашифрованный текст, а вместо сектора .data - ключ. Обычному человеку будет казаться, что программа просто либо сломана, либо старая
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
11.02.2025, 14:53
Накидал прогу, шифрующую строку "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " с помощью XORa c случайной последовательностью rand(). Буквы латинские чтобы с кодировками не заморачиваться. Где вы тут видите корелляцию зашифрованной последовательности с исходным текстом? И как байты зашифрованной последовательности отличить от байта ключа?
Миниатюры
Асимметричное шифрование  
0
 Аватар для Annemesski
2690 / 1347 / 485
Регистрация: 08.11.2016
Сообщений: 3,735
11.02.2025, 15:04
Цитата Сообщение от ARRAYBOW Посмотреть сообщение
Теперь думай какие байты программа взяла для шифрования текста
чукча писатель?
Цитата Сообщение от Annemesski Посмотреть сообщение
какой-то корявенький механизм генерации подключей из ключа и исходного сообщения, который используется в тех же ГОСТ и AES
alexu_007, ну да: вот сообщение "Х" - в нем я закодировал букву "А" или букву "Б", а ты взламывай, ага ). Естественно что на коротких бессмысленных сообщениях криптоанализ не работает ибо это работа со статистикой, а для статистики нужен достаточный объем релевантных исходных данных.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
11.02.2025, 15:37
Цитата Сообщение от Annemesski Посмотреть сообщение
на коротких бессмысленных сообщениях криптоанализ не работает
Ни на каких сообщениях криптоанализ не сработает, потому что даже при шифровании последовательности из одной единственной буквы в результате получается внешне случайный набор байт. В нем нет никакой видимой системы, как нет такой системы в генераторе RND, с помощью которого это шифрование произведено.
0
 Аватар для Annemesski
2690 / 1347 / 485
Регистрация: 08.11.2016
Сообщений: 3,735
11.02.2025, 15:45
Цитата Сообщение от alexu_007 Посмотреть сообщение
Ни на каких сообщениях криптоанализ не сработает
Ну что тут сказать, могу только поздравить вас с изобретением шифра который невозможно взломать, будете поляну с нобелевки накрывать не забудьте пригласить.
Цитата Сообщение от alexu_007 Посмотреть сообщение
В нем нет никакой видимой системы, как нет такой системы в генераторе RND
знаете как расшифровывается аббревиатура ГСПЧ, особенно вот это вот "П" - это вам так, на подумать (если вдруг захотите).
0
11.02.2025, 17:34

Не по теме:

Annemesski, вспоминается чайник Рассела... или "Срезал" (да, я привожу этот пример по мотивам одного старого поста, где другой форумчанин заметил сходство - очень понравилась отсылка, идеальная).
Демагогия - излюбленный способ вести дискуссию у малограмотных индивидов. В данном случае идёт упор на то, что никто не захочет (ибо это может быть дорого), или вообще не сможет (уровень компетенции не позволит) авторитетно доказать ложность утверждений, потому можно с апломбом пороть любую чушь. Этим этот форум славится.
Не трать время.

Или стоило бы предложить выдать сюда зашифрованный текст этим авторским методом, естественно с условием, что текст потенциально расшифруемый и что там, например, не менее 1000 знаков. Вот и посмотрим, действительно ли там криптоанализ не сработает.

0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
11.02.2025, 18:11
Цитата Сообщение от Annemesski Посмотреть сообщение
особенно вот это вот "П" - это вам так, на подумать (если вдруг захотите).
Я знаю, это псевдослучайные числа, именно поэтому зашифрованное таким генератором сообщение можно расшифровать. Были бы действительно случайные - было бы невозможно. И что это меняет? Если у ГСЧ период неповторения 4 млрд. циклов, это все равно что шифровать сообщение ключом длиной 4 млрд. - сегодня можно зашифровать начиная с этого места, а завтра с другого. Для расшифровки нужно найти то место, где спрятана точка для "srand()". А для расшифровки неизвестным ГСЧ нужно ещё правильно найти этот ГСЧ, сколько их было использовано, и в какой последовательности. Все промежуточные результаты будут представлять из себя внешне абсолютно случайные последовательности, которые никак не покажут, что вы на верном пути.

Добавлено через 2 минуты
Цитата Сообщение от ablex Посмотреть сообщение
Или стоило бы предложить выдать сюда зашифрованный текст этим авторским методом, естественно с условием, что текст потенциально расшифруемый и что там, например, не менее 1000 знаков. Вот и посмотрим, действительно ли там криптоанализ не сработает.
Вряд-ли найдется желающий тратить жизнь время на расшифровку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.02.2025, 18:11

Нужна помощь (Шифрование с симметричными ключами методами перестановки)
Незнаю что вообще тут такое но очень надо помогите) Шифрование методами (метод усложненной перестановки по таблице следующим шифром по...

Шифрование/дешифрование текста: шифр Цезаря
8. Написать программу, которая позволяет зашифровывать и расшифровывать с помощью «шифра Цезаря» сообщение, написанное на русском языке....

Курсовая: шифрование текста.
Здравствуйте. В связи с рядом причин(главная конечно лень xD ), свою курсовую я умудрился взять только сейчас. Сдача через 2 недели....

Шифрование RC6
Добрый вечер! Срочно нужна реализация этого алгоритма, время до утра..! Понимаю, мало, но, может есть у кого.. хотя у меня есть...

работа с файлами + небольшое шифрование
Чем дальше, тем сложнее :( Помогите пожалуйста разобраться в ЭТОМ. Ну или такой вопросик: как можно поместить данные из файла в...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru