I have to write an application which uses the Vigenere cipher with the Italian alphabet (only 21 characters, excluded J,K,W,X,Y). After a day of trying this is the code that I wrote
#include "vigenere.h"
#include <string>
using namespace std;
Vigenere::Vigenere(string str){
key = str;
key = StringToUpper(key);
for(int cnt = 0; cnt < key.length(); cnt++){
if(key[cnt] < 'A' || key[cnt] > 'Z')
key.erase(cnt,1);
}
//nel caso in cui la chiave sia più corta del testo
for(int cnt = 0; cnt < text.length(); cnt++){
if(key.length() != text.length()){
if(key.length() < text.length())
key += key[cnt];
}
}
return;
}
//tavola di Vigenere con alfabeto italiano
char Vigenere::Table(string alphabet){
int temp;
temp = alphabet.length();
int ROWS(temp);
int COLS(temp);
char ALPH[temp];
for(int i = 0; i < temp; i++){
ALPH[i] = alphabet[i];
}
char VIG[ROWS][COLS];
for(int i = 0; i < ROWS; i++){
for(int j = 0; j < COLS; j++){
VIG[i][j]=ALPH[(i + j)%21];
}
}
return VIG[ROWS][COLS];
}
string Vigenere::StringToUpper(string convstr){
for(int cnt = 0; cnt < convstr.length(); cnt++){
convstr[cnt] = toupper(convstr[cnt]);
}
return convstr;
}
//elimina i caratteri speciali, tenendo solo le lettere
string Vigenere::EraseChar(string str){
for (int i = 0; i < str.length(); i++){
if(!(str[i] >= 'A' && str[i] <= 'Z'))
str.erase(i,1);
i--;
}
return str;
}
string Vigenere::encode(string text){
string line;
//cerca il valore corrispondente alla chiave nella prima colonna di VIG
int index_k;
for(int i = 0; i < ROWS; i++){
if(key[i]==VIG[i][1])
index_k = i;
}
//cerca il valore corrispondente al testo nella prima riga di VIG
int index_t;
for(int i = 0; i < COLS; i++){
if(text[i]==VIG[1][i])
index_t = i;
}
//calcola la lettera codificata
for(int i = 0; i < text.length(); i++){
line[i] = ALPH[(index_k + index_t)%21];
}
line = StringToUpper(line);
if(!line.empty()){
line = EraseChar(line);
}
return line;
}
string Vigenere::decode(string text){
string line;
//cerca il valore corrispondente alla chiave nella prima colonna di VIG
int index_key;
for(int i = 0; i < ROWS; i++){
if(key[i]==VIG[i][1])
index_k = i;
}
//nella riga i-esima cerca la lettera corrispondente al carattere cifrato
int index_d;
for(int i = 0; i < COLS; i++){
if(text[i] == VIG[index_key][i])
index_d = i;
}
//calcola la lettera decodificata
for(int i = 0; i < text.length(); i++){
line[i] = ALPH[index_d];
}
line = StringToUpper(line);
if(!line.empty()){
line = EraseChar(line);
}
return line;
}
needless to say that it is wrong. please help me :(
PS comments are in italian, so if you don't understand something about the code, just ask.