помогите понять как работает данный код с шифром виженера?
нашел код шифрующий слово с помощью "шифр виженера" но никак не могу понять как работает программа может кто ни будь объяснить словами как он работает?
#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 шт):
- Обращение к строке с индексатором (например
text[i]в Вашем коде) - это обращение к одному символу строки text. - Приведение одного символа к типу
int- получение его номера в кодовой таблице ASCII - Рассмотрим сам цикл шифрования
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, вы получаете посути просто чуть более сложный шифр Цезаря, где вместо единого сдвига на весь текст имеется ключ для сдвига.
Все более-менее просто
Считывается шифруемый текст
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, и вам достаточно было выполнить поиск здесь же. Посмотрите вопросы/ответы по указанной ссылке.