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