Vigenere
La fel ca cifrul Cezar, cifrul Vigenere deplasează literele, dar acesta folosește o deplasare multiplă. Cheia este constituită din câțiva întregi k
i
, unde 0 ≤ k
i
≤ 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 luia ≤ 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 .
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!