fbpx

Problema #3190 – Vigenere – Rezolvari PBInfo

de Mihai-Alexandru

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

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.

#include <bits/stdc++.h>

using namespace std;

ifstream cin("vigenere.in");
ofstream cout("vigenere.out");

char a[260], b[260];
int v[260];

int main(){
    cin >> a >> b;
    int i = 0;
    int n = strlen(b);
    while(a[i]){
        v[i] = a[i] + b[i % n];
        i++;
    }
    for(int k = 0; k < i; ++k){
        v[k] -= 'a';
        if(v[k] > 'z')
            v[k] = v[k] - 'z' + 'a' - 1;
        cout << (char)v[k];
    }
    return 0;
}
Comentarii

S-ar putea sa iti placa