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
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; }