Rezolvare completă PbInfo #3190 Vigenere

Vigenere

La fel ca cifrul Cezar, cifrul Vigenere deplasează literele, dar acesta folosește o deplasare multiplă. Cheia este constituită din câțiva întregi ki, unde 0 ≤ ki ≤ 25.

Aceşti întregi pot fi, de exemplu, k = (21, 4, 2 19, 14, 17). Această cheie ar provoca deplasare primei litere cu 21, c1 = p1 + 21 (mod 26), a celei de-a doua cu 4, c2 = p2 + 4 (mod 26), ş.a.m.d. până la sfârşitul cheii și apoi de la început, din nou.

Pentru o memorare mai ușoară cheia este de regulă dată printr-un cuvânt – cheia de mai sus corespunde cuvântului vector, litera 'v'” corespondând numărului 21 (numerotarea începe de la 0), litera 'e' cu 4, etc.

Un exemplu de cifru Vigenere:

Textul clar: thisisanexampleofthevigenerecipher
Cheia: vector
Textul cifrat: olklwjvrgqodkpghtkcixbuviitxqzklgk

Cerința

Se citesc două texte a și b cu lungimea maximă de 255 de caractere. Să se afișeze textul după aplicarea cifrului Vigenere la textul a cu cheia b.

Date de intrare

Fișierul de intrare vigenere.in conține pe prima linie textul a iar pe a doua linie textul b.

Date de ieșire

Fișierul de ieșire vigenere.out va conține pe prima linie rezultatul criptării.

Restricții și precizări

  • lungimea lui b ≤ Lungimea lui a ≤ 255;
  • cele două șiruri vor conține doar litere mici din alfabetul englez.

Exemplu

vigenere.in

pbinfo
dio

vigenere.out

sjwqnc

Explicație

În Cifrul Vigenere începem numărătoarea caracterelor din cheie de la 0, astfel, caracterul 'd' din cheie deplasează caractrrul corespunzător din text cu 3 caractere; astfel, 'p' devine 's'. Acest procedeu se repetă și pentru restul șirului.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Vigenere:

#include <fstream>
#include <cstring>
using namespace std;
char sir1[256], sir2[256];
int cod[256];
ifstream in("vigenere.in");
ofstream out("vigenere.out");
int main(){
    in.getline(sir1, 256);
    in.getline(sir2, 256);
    int n = strlen(sir1), k = strlen(sir2);
    for(int i = 0; i < k; i++){
        cod[i] = sir2[i] - 'a';
    }
    for(int i = 0; i < n; ){
        for(int j = 0; j < k && i < n; i++, j++){
            sir1[i] = (sir1[i] - 'a' + cod[j]) % 26 + 'a';
        }
    }
    out << sir1;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #3190 Vigenere

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #3190 Vigenere de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!