#include <iostream>
#include <string>
using namespace std;
// Funkcja szyfrująca tekst szyfrem Cezara
string szyfrCezara( const string& text, int key) {
string result = "" ;
for ( char c : text) {
if ( isalpha ( c) ) {
char base = isupper ( c) ? 'A' : 'a' ;
result + = char ( ( c - base + key) % 26 + base) ;
} else {
result + = c;
}
}
return result;
}
// Funkcja szyfrująca wiadomość szyfrem Vigenère'a
string szyfrVigenere( const string& message, const string& key) {
string result = "" ;
int keyLen = key.length ( ) ;
int j = 0 ;
for ( char c : message) {
if ( isalpha ( c) ) {
char base = isupper ( c) ? 'A' : 'a' ;
int shift = key[ j % keyLen] - base;
result + = char ( ( c - base + shift) % 26 + base) ;
j++ ;
} else {
result + = c;
}
}
return result;
}
int main( ) {
string tekst, wiadomosc;
int kluczCezar;
// Pobranie danych od użytkownika
cout << "Podaj tekst do zakodowania szyfrem Cezara: " ;
getline( cin , tekst) ;
cout << "Podaj przesunięcie dla szyfru Cezara: " ;
cin >> kluczCezar;
cin .ignore ( ) ; // Usuwanie znaku nowej linii po 'cin'
cout << "Podaj wiadomość do zaszyfrowania szyfrem Vigenère'a: " ;
getline( cin , wiadomosc) ;
// Kodowanie tekstu szyfrem Cezara
string zakodowanyTekst = szyfrCezara( tekst, kluczCezar) ;
cout << "Zakodowany tekst (klucz Vigenère'a): " << zakodowanyTekst << endl;
// Użycie zakodowanego tekstu jako klucza do szyfru Vigenère'a
string zaszyfrowanaWiadomosc = szyfrVigenere( wiadomosc, zakodowanyTekst) ;
cout << "Zaszyfrowana wiadomość: " << zaszyfrowanaWiadomosc << endl;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIEZ1bmtjamEgc3p5ZnJ1asSFY2EgdGVrc3Qgc3p5ZnJlbSBDZXphcmEKc3RyaW5nIHN6eWZyQ2V6YXJhKGNvbnN0IHN0cmluZyYgdGV4dCwgaW50IGtleSkgewogICAgc3RyaW5nIHJlc3VsdCA9ICIiOwogICAgZm9yIChjaGFyIGMgOiB0ZXh0KSB7CiAgICAgICAgaWYgKGlzYWxwaGEoYykpIHsKICAgICAgICAgICAgY2hhciBiYXNlID0gaXN1cHBlcihjKSA/ICdBJyA6ICdhJzsKICAgICAgICAgICAgcmVzdWx0ICs9IGNoYXIoKGMgLSBiYXNlICsga2V5KSAlIDI2ICsgYmFzZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0ICs9IGM7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQoKLy8gRnVua2NqYSBzenlmcnVqxIVjYSB3aWFkb21vxZvEhyBzenlmcmVtIFZpZ2Vuw6hyZSdhCnN0cmluZyBzenlmclZpZ2VuZXJlKGNvbnN0IHN0cmluZyYgbWVzc2FnZSwgY29uc3Qgc3RyaW5nJiBrZXkpIHsKICAgIHN0cmluZyByZXN1bHQgPSAiIjsKICAgIGludCBrZXlMZW4gPSBrZXkubGVuZ3RoKCk7CiAgICBpbnQgaiA9IDA7CiAgICAKICAgIGZvciAoY2hhciBjIDogbWVzc2FnZSkgewogICAgICAgIGlmIChpc2FscGhhKGMpKSB7CiAgICAgICAgICAgIGNoYXIgYmFzZSA9IGlzdXBwZXIoYykgPyAnQScgOiAnYSc7CiAgICAgICAgICAgIGludCBzaGlmdCA9IGtleVtqICUga2V5TGVuXSAtIGJhc2U7CiAgICAgICAgICAgIHJlc3VsdCArPSBjaGFyKChjIC0gYmFzZSArIHNoaWZ0KSAlIDI2ICsgYmFzZSk7CiAgICAgICAgICAgIGorKzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXN1bHQgKz0gYzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9CgppbnQgbWFpbigpIHsKICAgIHN0cmluZyB0ZWtzdCwgd2lhZG9tb3NjOwogICAgaW50IGtsdWN6Q2V6YXI7CgogICAgLy8gUG9icmFuaWUgZGFueWNoIG9kIHXFvHl0a293bmlrYQogICAgY291dCA8PCAiUG9kYWogdGVrc3QgZG8gemFrb2Rvd2FuaWEgc3p5ZnJlbSBDZXphcmE6ICI7CiAgICBnZXRsaW5lKGNpbiwgdGVrc3QpOwogICAgY291dCA8PCAiUG9kYWogcHJ6ZXN1bmnEmWNpZSBkbGEgc3p5ZnJ1IENlemFyYTogIjsKICAgIGNpbiA+PiBrbHVjekNlemFyOwogICAgY2luLmlnbm9yZSgpOyAgLy8gVXN1d2FuaWUgem5ha3Ugbm93ZWogbGluaWkgcG8gJ2NpbicKICAgIGNvdXQgPDwgIlBvZGFqIHdpYWRvbW/Fm8SHIGRvIHphc3p5ZnJvd2FuaWEgc3p5ZnJlbSBWaWdlbsOocmUnYTogIjsKICAgIGdldGxpbmUoY2luLCB3aWFkb21vc2MpOwoKICAgIC8vIEtvZG93YW5pZSB0ZWtzdHUgc3p5ZnJlbSBDZXphcmEKICAgIHN0cmluZyB6YWtvZG93YW55VGVrc3QgPSBzenlmckNlemFyYSh0ZWtzdCwga2x1Y3pDZXphcik7CiAgICBjb3V0IDw8ICJaYWtvZG93YW55IHRla3N0IChrbHVjeiBWaWdlbsOocmUnYSk6ICIgPDwgemFrb2Rvd2FueVRla3N0IDw8IGVuZGw7CgogICAgLy8gVcW8eWNpZSB6YWtvZG93YW5lZ28gdGVrc3R1IGpha28ga2x1Y3phIGRvIHN6eWZydSBWaWdlbsOocmUnYQogICAgc3RyaW5nIHphc3p5ZnJvd2FuYVdpYWRvbW9zYyA9IHN6eWZyVmlnZW5lcmUod2lhZG9tb3NjLCB6YWtvZG93YW55VGVrc3QpOwogICAgY291dCA8PCAiWmFzenlmcm93YW5hIHdpYWRvbW/Fm8SHOiAiIDw8IHphc3p5ZnJvd2FuYVdpYWRvbW9zYyA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9Cg==