Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 08.05.2012
Сообщений: 35

XOR шифрование

06.10.2017, 20:01. Показов 3559. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу написать мне алгоритм расшифровки проксоренного сообщения. Мне известно что длина ключа 3 символа, это латинские буквы нижнего регистра. Я прочитал про смещение, но так и не понял что делать когда найдется наибольший процент совпадений при смещении.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.10.2017, 20:01
Ответы с готовыми решениями:

Xor шифрование
Всем доброго времени суток! У меня возникла проблема.Я пытался реализовать шифрование методом xor. Но у меня постоянно выдаёт какую-то...

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

Шифрование xor
Пишу шифрование методом xor. На вход поступает строка, каждый символ строки преобразуется в соответствующий ASCII-код. Получаем вектор...

5
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
07.10.2017, 13:45
Sigma0, тебе нужно угадать ключ? Можно его найти через распределение частот букв в зашифрованном тексте.
Берешь, скажем, каждый третий (второй, первый) символ шифра, подсчитываешь частоту встреченных символов. А затем сравниваешь полученное распределение, с распределением символов в английском тексте (значения спокойно можно найти в интернете). А уже на основе этого можно сделать предположение о наиболее вероятных значениях ключа.

Цитата Сообщение от Sigma0 Посмотреть сообщение
что делать когда найдется наибольший процент совпадений при смещении
Что за процент, и как он находится?
0
504 / 247 / 75
Регистрация: 31.10.2010
Сообщений: 747
07.10.2017, 19:00
Цитата Сообщение от Sigma0 Посмотреть сообщение
Прошу написать мне алгоритм расшифровки
, на мой взгляд это не верная постановка вопроса, в данном разделе форума, если работу сделают за Вас, то это за деньги (это другой раздел), а если Вы хотите что бы Вам подсказали как сделать самому, то надо правильно сформулировать просьбу о помощи.
0
0 / 0 / 0
Регистрация: 08.05.2012
Сообщений: 35
07.10.2017, 20:29  [ТС]
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Что за процент, и как он находится?
Взлом XOR шифра

Сообщение второе

Добавлено через 46 секунд
Цитата Сообщение от RefSol Посмотреть сообщение
, на мой взгляд это не верная постановка вопроса, в данном разделе форума, если работу сделают за Вас, то это за деньги (это другой раздел), а если Вы хотите что бы Вам подсказали как сделать самому, то надо правильно сформулировать просьбу о помощи
Согласен, просто подсказать, направить

Добавлено через 9 минут
Цитата Сообщение от nonedark2008 Посмотреть сообщение
распределение частот букв
Это я реализовал. То есть я нашел символ который встречается наиболее часто и предположил что это пробел. Взял абсолютное число разницы между наиболее частым символом и пробелом. И тем что получилось проксорил. Но это не сработало на данном сообщении.

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
#include <iostream>
#include <fstream>
#include <sstream>
#include <stdio.h>
#include <math.h>
#include <vector>
 
using namespace std;
 
void reset(vector<char> &chs, vector<size_t> &chC){
    for (size_t i = 0; i < chs.size(); i++){
        chs[i] = i;
        chC[i] = 0;
    }
}
 
void scan(string &s, vector<char> &chs, vector<size_t> &chC){
    for (size_t i = 0; i < chs.size(); i++) for (size_t j = 0; j < s.size(); j++) if (chs[i] == s[j]) chC[i]++;
}
 
void sort(vector<char> &chs, vector<size_t> &chC){
    for (int i = 1; i < chs.size(); i++){
        for (int j = i; j > 0 && chC[j - 1] < chC[j]; j--){
            swap(chC[j - 1], chC[j]);
            swap(chs[j - 1], chs[j]);
        }
    }
}
 
vector<char> split(string str, char delimiter) {
    vector<char> internal;
    stringstream ss(str);
    string tok;
    while (getline(ss, tok, delimiter)) {
        internal.push_back((char)(stoi(tok)));
    }
    return internal;
}
 
int main()
{
    size_t range = 128;
    vector<char> characters(range);
    vector<size_t> charsC(range);
    ifstream ifs("c.txt");
    string temp1;
    getline(ifs, temp1);
    vector<char> chS = split(temp1, ',');
    string s = "";
    for (vector<char>::iterator it = chS.begin(); it != chS.end(); it++){
        s += (*it);
    }
    ifs.close();
 
    size_t keyLength = 3;
    vector<int> key(keyLength);
    printf("String:\n%s\n", s.c_str());
    for (int iKey = 0; iKey < keyLength; iKey++){
        reset(characters, charsC);
        scan(s, characters, charsC);
        sort(characters, charsC);
 
        char potentialCh = ' ';
 
        key[iKey] = characters[0] - potentialCh;
        
        printf("\nPotential key %d is %c[%c]\n\n", key[iKey], key[iKey], characters[0]);
 
        for (size_t i = 0; i < range; i++) if (charsC[i] != 0) printf("Character %c contains %u times | %f\n", characters[i], charsC[i], (double)charsC[i] / (double)s.size());
        for (size_t i = 0; i < s.size(); i++) s[i] = (char)(s[i] ^ key[iKey]);
    }
    ofstream ofs("out.txt");
    ofs << s;
    ofs.close();
    for (int iKey = 0; iKey < keyLength; iKey++) cout << "\n" << key[iKey] << " ";
    cout << "\n";
    system("pause");
    return 0;
Добавлено через 1 час 11 минут
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Берешь, скажем, каждый третий (второй, первый) символ шифра, подсчитываешь частоту встреченных символов
Переделал по этому предложению. Надеюсь я правильно понял. Метод splitChiped.

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
#include <iostream>
#include <fstream>
#include <sstream>
#include <stdio.h>
#include <math.h>
#include <vector>
 
using namespace std;
 
void reset(vector<char> &chs, vector<size_t> &chC){
    for (size_t i = 0; i < chs.size(); i++){
        chs[i] = i;
        chC[i] = 0;
    }
}
 
void scan(vector<char> &text, vector<char> &chs, vector<size_t> &chC){
    for (size_t i = 0; i < chs.size(); i++) 
        for (size_t j = 0; j < text.size(); j++) 
            if (chs[i] == text[j]) 
                chC[i]++;
}
 
void sort(vector<char> &chs, vector<size_t> &chC){
    for (int i = 1; i < chs.size(); i++){
        for (int j = i; j > 0 && chC[j - 1] < chC[j]; j--){
            swap(chC[j - 1], chC[j]);
            swap(chs[j - 1], chs[j]);
        }
    }
}
 
vector<char> split(string str, char delimiter) {
    vector<char> internal;
    stringstream ss(str);
    string tok;
    while (getline(ss, tok, delimiter)) {
        internal.push_back((char)(stoi(tok)));
    }
    return internal;
}
 
vector<vector<char> > splitChiped(string str, size_t keyLength) {
    vector<vector<char> > internal;
    internal.resize(keyLength);
    for (size_t i = 0; i < str.size(); i++){
        internal[i % keyLength].push_back(str[i]);
        //printf("%u %u %d\n", i % keyLength, i, str[i]);
    }
    //system("pause");
    return internal;
}
 
int main()
{
    size_t range = 128;
    vector<char> characters(range);
    vector<size_t> charsC(range);
    ifstream ifs("c.txt");
    string temp1;
    getline(ifs, temp1);
    vector<char> chS = split(temp1, ',');
    string s = "";
    for (vector<char>::iterator it = chS.begin(); it != chS.end(); it++){
        s += (*it);
    }
    ifs.close();
 
    size_t keyLength = 3;
    vector<int> key(keyLength);
    vector<vector<char> > splitedChiped = splitChiped(s, keyLength);
    printf("String:\n%s\n", s.c_str());
    ofstream ofs("out.txt");
    for (int iKey = 0; iKey < keyLength; iKey++){
        reset(characters, charsC);
        scan(splitedChiped[iKey], characters, charsC);
        sort(characters, charsC);
 
        char potentialCh = ' ';
 
        key[iKey] = characters[0] - potentialCh;
        
        printf("\nPotential key %d is %c[%c]\n\n", key[iKey], key[iKey], characters[0]);
 
        for (size_t i = 0; i < range; i++) if (charsC[i] != 0) printf("Character %c contains %u times | %f\n", characters[i], charsC[i], (double)charsC[i] / (double)splitedChiped[iKey].size());
        for (size_t i = 0; i < splitedChiped[iKey].size(); i++){
            splitedChiped[iKey][i] = splitedChiped[iKey][i] ^ key[iKey];
            s[splitedChiped[iKey].size() / (iKey + 1)] = splitedChiped[iKey][i];
        }
    }
    ofs << s;
    ofs.close();
    for (int iKey = 0; iKey < keyLength; iKey++) cout << "\n" << key[iKey] << " ";
    cout << "\n";
    system("pause");
    return 0;
}
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
07.10.2017, 21:34
Лучший ответ Сообщение было отмечено Sigma0 как решение

Решение

Цитата Сообщение от Sigma0 Посмотреть сообщение
Надеюсь я правильно понял.
У тебя есть шифр Виженера и уже известна длина ключа N.
Исходный шифро-текст разбивается на N групп, каждая из которых зашифрована шифром Цезаря (обычный сдвиг).
На основе частотного анализа каждой группы можно подобрать смещение для конткретной группы - оно задает один символ ключа. Проделав это для каждой группы, собираем полученные смещения и получаем значение ключа.
1
0 / 0 / 0
Регистрация: 08.05.2012
Сообщений: 35
08.10.2017, 22:52  [ТС]
Цитата Сообщение от nonedark2008 Посмотреть сообщение
У тебя есть шифр Виженера и уже известна длина ключа N.
Исходный шифро-текст разбивается на N групп, каждая из которых зашифрована шифром Цезаря (обычный сдвиг).
На основе частотного анализа каждой группы можно подобрать смещение для конткретной группы - оно задает один символ ключа. Проделав это для каждой группы, собираем полученные смещения и получаем значение ключа.
Спасибо большое, расшифровал)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.10.2017, 22:52
Помогаю со студенческими работами здесь

Шифрование Xor'ом
Добрый день, уважаемые) тут такое дело, сел делать курсач и столкнулся с проблемой. Работа по шифрованию бинарными операциями и...

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

Не выходит xor шифрование
есть вот такой код string xorcrypt(const string&amp; str, const string&amp; key) { string retval; retval.resize(str.length()); for...

Шифрование текста. XOR
Помогите с шифрование текста...с числоми вроде получалось. Что значит эта ошибка и как ее испрвить?..) #include &lt;iostream&gt; ...

XOR шифрование/дешифрование
Всем привет. Пож-ста помогите написать программу, шифрующую/дешифрующую xor маску. 2 Примера : N1 из FF FF FF FF D2...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru