помогите понять как работает данный код с шифром виженера?

нашел код шифрующий слово с помощью "шифр виженера" но никак не могу понять как работает программа может кто ни будь объяснить словами как он работает?

#include <bits/stdc++.h>
using namespace std;

int main() {
    std::string text;
    std::string key;
    std::string result;
    cin >> text;
    cin >> key;
    for(int i = key.size(), j = 0; i < text.size(); i++){
        key += key[j];
        j++;
    }

    

    for(int i = 0; i < text.size(); i++){
        int ascii = int(text[i]) + int(key[i]) % 97;
        ascii -= (ascii > 122) ? 26 : 0 ;
        result += char(ascii);
    }

    std::cout << result;
    return 0;

}

Ответы (2 шт):

Автор решения: SelfishCrawler
  1. Обращение к строке с индексатором (например text[i] в Вашем коде) - это обращение к одному символу строки text.
  2. Приведение одного символа к типу int - получение его номера в кодовой таблице ASCII
  3. Рассмотрим сам цикл шифрования
for(int i = 0; i < text.size(); i++)
{
    int ascii = int(text[i]) + int(key[i]) % 97;
    ascii -= (ascii > 122) ? 26 : 0 ;
    result += char(ascii);
}

Тут мы идем по строке посимвольно, вычисляем сумму символа строки и ключа. Берем от полученного результата деление по модулю 97. Нужно это затем, чтобы не выйти за пределы алфавита, т.е. если в результате суммы у Вас получилось 99, вместо этого вы перейдете на символ номер 2 в алфавите ASCII, а не выйдете за границы этого алфавита.

ascii -= (ascii > 122) ? 26 : 0 ; Эта строка - по сути условный оператор. Если ваш полученный символ больше 122 (хотя по сути он не может получиться больше 97 из-за кода выше), то отнять от символа 26, т.е. сместиться на 26 символов влево по алфавиту. Иначе отнять 0, т.е. оставить символ как есть.

Последняя строка в цикле - просто присоединение этого символа к результирующей строке.

UPD: Понятия не имею, что из себя представляет шифр Виженера, однако, т.к. у вас в цикле не выполняется никогда условие ascii > 122, вы получаете посути просто чуть более сложный шифр Цезаря, где вместо единого сдвига на весь текст имеется ключ для сдвига.

→ Ссылка
Автор решения: Harry

Все более-менее просто

Считывается шифруемый текст

cin >> text;

Считывается ключ

cin >> key;

Ключ повторяется многократно, пока длина не сравняется с длиной текста - типа, для текста длиной 10 символов ключ abc превращается в abcabcabca

for(int i = key.size(), j = 0; i < text.size(); i++){
    key += key[j];
    j++;
}

Каждый символ текста

for(int i = 0; i < text.size(); i++){

шифруется с помощью соответствующего символа ключа

    int ascii = int(text[i]) + int(key[i]) % 97;

если символ вылетает за пределы алфавита, его бессмысленно пытаются вернуть назад :)

    ascii -= (ascii > 122) ? 26 : 0 ;

и дописывают к результату

    result += char(ascii);
}

Примерно так... Шифр Виженера - достаточно частый гость здесь, на ruSO, и вам достаточно было выполнить поиск здесь же. Посмотрите вопросы/ответы по указанной ссылке.

→ Ссылка