Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/88: Рейтинг темы: голосов - 88, средняя оценка - 4.77
1 / 1 / 0
Регистрация: 05.10.2021
Сообщений: 268

Шифр Виженера

07.10.2021, 20:04. Показов 18682. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, как написать шифрование, расшифрование и ключик?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2021, 20:04
Ответы с готовыми решениями:

Шифр Виженера, шифр Скитала
Я много прочитал информации и захотел реализовать эти шифры на Buider C++, а вот как это сделать. Кому интересно, напишите мне примеры этих...

Шифр Виженера на C++
Помогите пожалуйста с заданием. От вас зависит стипендия в течении семестра. Рабочее задание: Реализовать программно шифр Виженера...

Шифр Виженера
привет ребятишки. помагие плиз с кодам, накодил карочь, оно шифрует, но не расшифровывает, есьть догадка что и не правильно ишфрует. Вот...

48
1 / 1 / 0
Регистрация: 05.10.2021
Сообщений: 268
07.10.2021, 23:54  [ТС]
Студворк — интернет-сервис помощи студентам
lemegeton, А куда вписать cin, cout? Чтобы я сама могла вводить данные.
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
07.10.2021, 23:59

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
Начните что-то писать, если не получится, то тут мы поможем.
В этот раздел приходят за готовыми решениями. Так исторически сложилось.
Мне иногда кажется, что этот раздел участвует в deep learning-е какой-то нейросетки. То ли той, что пишет код, то ли той, что ставит задачи, то ли обеих.
Особенно когда встречаются тексты, похожие на сгенерированные нейросетью.



Добавлено через 1 минуту
Цитата Сообщение от Miristeri Посмотреть сообщение
lemegeton, А куда вписать cin, cout? Чтобы я сама могла вводить данные.
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
#include <ctime>
#include <cstdlib>
#include <cmath>
#include <iomanip>
#include <ostream>
#include <iostream>
#include <string>
 
using namespace std;
 
int modulo(int a, int b){
    return a >= 0 ? a % b : (b - abs(a % b)) % b;
}
 
string encryptText(string text, string key){
    int len = text.length();
    int key_len = key.length();
    string e_text;
    for (int i = 0; i < len; i++)
        e_text += ((text[i] + key[i % key_len]) % 26) + 65;
    return e_text;
}
 
string decryptText(string text, string key){
    int len = text.length();
    int key_len = key.length();
    string d_text;
    for (int i = 0; i < len; i++)
        d_text += modulo(text[i] - key[i % key_len], 26) + 65;
    return d_text;
}
 
int main(int argc, char **argv) {
 
    std::string text;
    std::string key;
 
    std::cin >> text >> key;
    
    std::string encrypted = encryptText(text, key);
    std::string decrypted = decryptText(encrypted, key);
    
    std::cout << text << std::endl;
    std::cout << encrypted << std::endl;
    std::cout << decrypted << std::endl;
    
    return 0;
}
В качестве данных вводить через пробел(!) сначала текст потом ключ.
Например так:
Code
1
IWISHIWASAFISHINTHEBIGGESTOCEAN PASSWORD
Добавлено через 1 минуту
Результат будет примерно такой:
Code
1
2
3
IWISHIWASAFISHINTHEBIGGESTOCEAN
XWAKDWNDHAXAOVZQIHWTEUXHHTGUAOE
IWISHIWASAFISHINTHEBIGGESTOCEAN
Первая строка -- исходный текст.
Вторая строка -- зашифрованный текст.
Третья строка -- расшифрованный зашифрованный текст.
0
1 / 1 / 0
Регистрация: 05.10.2021
Сообщений: 268
08.10.2021, 00:01  [ТС]
lemegeton, Смотрите, я ввела вот это:
privetickakdela 12345678

А мне выдало вот это:
privetickakdela
FIAOYOEZARCWYGW
VXOBKZOIQGQJKRG

Правильно ли мне выдала результат программа?

Добавлено через 48 секунд
lemegeton, А просто расшифровать не может программа?
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
08.10.2021, 00:04
Код вижинера работает ТОЛЬКО с символами.
Эта имплементация работает ТОЛЬКО И ИСКЛЮЧИТЕЛЬНО с ЗАГЛАВНЫМИ ЛАТИНСКИМИ символами.
Попробуйте ввести только заглавные латинские символы.

Добавлено через 57 секунд
То есть не "privetickakdela", а "PRIVETIKAKDELA".
0
1 / 1 / 0
Регистрация: 05.10.2021
Сообщений: 268
08.10.2021, 00:05  [ТС]
lemegeton, Огромное спасибо Вам за помощь и всем кто ещё помогал. Пойду тогда разбираться что да и как работает.
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
08.10.2021, 00:06
Ключ, из-за особенностей имплементации, можно любой, но желательно всё же тоже ЗАГЛАВНЫЕ ЛАТИНСКИЕ символы.
0
1 / 1 / 0
Регистрация: 05.10.2021
Сообщений: 268
08.10.2021, 00:09  [ТС]
lemegeton, Хорошо, поняла.
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
08.10.2021, 00:09
Цитата Сообщение от Miristeri Посмотреть сообщение
lemegeton, Огромное спасибо Вам за помощь и всем кто ещё помогал.
Спасибо Royal_X за готовый код.
Цитата Сообщение от Miristeri Посмотреть сообщение
Пойду тогда разбираться что да и как работает.
Прочитайте на википедии про шифр вижинера. Этого, скорее всего будет достаточно, если это зачёт.
Просто попробуйте осознать суть.
Вряд ли препод будет смотреть на имплементацию.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6768 / 3127 / 1065
Регистрация: 01.06.2021
Сообщений: 12,117
08.10.2021, 00:11
Miristeri, писать вам сейчас все то, что я когда-то делал, не собираюсь. Я дал бы вам код своей рабочей программы, но он на другом устройстве, который не рядом. Могу дать только советы:
1) задумайтесь о разных вариантов ввода текста и ключа. Можно реализовать ввод текста в консоль через getline, но для больших текстов это не подойдёт, придется реализовать чтение текста из файла.
2) вводимый текст должен избавиться от всего лишнего (пробелы, ненужные символы и т.д.). Нужно проверять каждый символ. Подойдёт, например, isalpha. Останутся только латинские буквы.
3) Теперь маленькие буквы нужно превратить в заглавные, это делается достаточно просто (отнимается на 32, если символ от 97 до 122).
4) Уравнивается ключ с размером текста. Длинный ключ обрезается по длине текста, а короткий - повторяется до тех пор пока не уравняется с длиной текста.
5) Дальше уже можно использовать шифрование и расшифрование. Можно реализовать сохранение вывода в текстовый файл.

Вроде нет ничего сложного. Гораздо сложнее это реализовать взлом шифра без ключа. Там нужен частотный анализ и криптоанализ индексом совпадений. Хотя, если действительно нравится программирование, то это тоже не сложно. У меня, кажется, выходило всего 400 строк кода, причем могло бы выйти меньше, если не было бы меню и прочих плюшек для красоты.
0
1 / 1 / 0
Регистрация: 05.10.2021
Сообщений: 268
08.10.2021, 00:21  [ТС]
Royal_X, Я Вас прекрасно поняла.

Добавлено через 5 минут
lemegeton, Есть маленький вопросик, что делает модуль в этой строке?
C++
1
return a >= 0 ? a % b : (b - abs(a % b)) % b;
Добавлено через 1 минуту
lemegeton, Я как поняла получается остаток от деления?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6768 / 3127 / 1065
Регистрация: 01.06.2021
Сообщений: 12,117
08.10.2021, 00:23
Miristeri, да, это для деления с остатком.

Добавлено через 46 секунд
Для шифрования числа положительные, поэтому подойдёт %
0
1 / 1 / 0
Регистрация: 05.10.2021
Сообщений: 268
08.10.2021, 00:23  [ТС]
Royal_X, А как деление с остатком, отображается на шифре?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6768 / 3127 / 1065
Регистрация: 01.06.2021
Сообщений: 12,117
08.10.2021, 00:24
Но в расшифровании иногда нужно делить с остатком отрицательное число. Реализация % в С++ не подходит для шивра Вижинера.
0
1 / 1 / 0
Регистрация: 05.10.2021
Сообщений: 268
08.10.2021, 00:26  [ТС]
Royal_X, Опять не поняла, можете привести пример, в каком случае делится с остатком?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6768 / 3127 / 1065
Регистрация: 01.06.2021
Сообщений: 12,117
08.10.2021, 00:29
В С++ % реализовано не математическое деление с остатком, в формуле которой используется floor, а реализована нечто, похоже на функцию remainder, с использованием truncate

Добавлено через 2 минуты
Математическое деление с остатком:
a mod b = a - b * floor(a/b)

а вот C++ использует:
a mod b = a - b * trunc(a/b)

Для шифра Вижинера нужно математическое деление с остатком.
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
08.10.2021, 00:29
Цитата Сообщение от Royal_X Посмотреть сообщение
Но в расшифровании иногда нужно делить с остатком отрицательное число. Реализация % в С++ не подходит для шивра Вижинера.
В принципе, можно избавиться от функции modulo, если прибавить 26 и взять модуль от 26. )

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
#include <ctime>
#include <cstdlib>
#include <cmath>
#include <iomanip>
#include <ostream>
#include <iostream>
#include <string>
 
using namespace std;
  
string encryptText(string text, string key){
    int len = text.length();
    int key_len = key.length();
    string e_text;
    for (int i = 0; i < len; i++)
        e_text += ((text[i] + key[i % key_len]) % 26) + 65;
    return e_text;
}
 
string decryptText(string text, string key){
    int len = text.length();
    int key_len = key.length();
    string d_text;
    for (int i = 0; i < len; i++)
        d_text += ((text[i] - key[i % key_len] + 26) % 26) + 65;
    return d_text;
}
 
int main(int argc, char **argv) {
 
    std::string text;
    std::string key;
 
    std::cin >> text >> key;
    
    std::string encrypted = encryptText(text, key);
    std::string decrypted = decryptText(encrypted, key);
    
    std::cout << text << std::endl;
    std::cout << encrypted << std::endl;
    std::cout << decrypted << std::endl;
    
    return 0;
}
Добавлено через 30 секунд
Тогда не будет отрицательных чисел.
0
1 / 1 / 0
Регистрация: 05.10.2021
Сообщений: 268
08.10.2021, 00:31  [ТС]
Royal_X, Что делает % в данной программе? Я только что прочитал в интернете что % делает разные вещи смотря где.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6768 / 3127 / 1065
Регистрация: 01.06.2021
Сообщений: 12,117
08.10.2021, 00:31
Например, в языке C++ (-13) % 26 вычисляется как -13, а не 13.

Начиная от обычных калькуляторов и заканчивая системами компьютерной алгебры Mathematica (функция Mod), Maple (функция mod), Maxima (функция mod) - данное выражение вычисляется как 13.

Дело в том, что в математике и большинство программ в формуле modulo используют floored definition, а вот C++ использует truncated definition.
0
 Аватар для lemegeton
4904 / 2697 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
08.10.2021, 00:31
26 это "мощность" или длина алфавита, а +65 это добивание до первой заглавной латинской буквы "А".
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6768 / 3127 / 1065
Регистрация: 01.06.2021
Сообщений: 12,117
08.10.2021, 00:38
Miristeri, % делит с остатком.

Добавлено через 5 минут
В коде очень много лишних заголовков, исправьте это.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.10.2021, 00:38

Шифр Виженера
Есть вот такой код (его кусок): string symbols =...

Шифр Виженера
Был бы до жути благодарен с помощью шифра Виженера... С этими шифрами вообще что-то не ладится... Заранее большое спасибо!!!!

Шифр Виженера c++
Шифр Виженера c++

Шифр Виженера
Надо написать программу на С++, расшифровывающую сообщение, зашифрованное шифром Виженера. Слово-ключ не дано. То есть сначала надо...

Шифр Виженера
У кого есть исходник на Си ?


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru