# PBinfo #3190 – Vigenere – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: andrei

## Enunț

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.

## Cod sursă C++

```cpp
#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;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/3190)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/3190/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-3190/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
