//Ciphers/SourceFiles/Vigenere.cpp //Matthew Ellison // Created: 4-29-18 //Modified; 4-29-18 //This file contains the implementation of the Vigenere class #include "../Headers/Vigenere.hpp" #include #include #include Vigenere::Vigenere(){ } Vigenere::~Vigenere(){ } void Vigenere::setInputString(std::string input){ //Make sure inputString is clear inputString = ""; //Loop through every character in input. Remove all whitespace and punctuation and make sure all letters are capital and add it to inputString for(int cnt = 0;cnt < input.size();++cnt){ char letter = input[cnt]; if(isupper(letter)){ inputString += letter; } else if(islower(letter)){ inputString += toupper(letter); } //If the letter is whitespace or punctuation do nothing } } std::string Vigenere::getInputString() const{ return inputString; } std::string Vigenere::getOutputString() const{ return outputString; } void Vigenere::setKeyword(std::string key){ //Make sure the keyword is blank keyword = ""; //Loop through every letter in the key and make sure all of them are uppercase letters for(int cnt = 0;cnt < key.size();++cnt){ char letter = key[cnt]; if(isupper(letter)){ keyword += letter; } else if(islower(letter)){ keyword += toupper(letter); } //If it is not a letter ignore it } setOffset(); } std::string Vigenere::getKeyword() const{ return keyword; } void Vigenere::setOffset(){ //Make sure offset is empty offset.clear(); //Reserve the correct size to increase speed later offset.reserve(keyword.size()); //Loop through every letter in keyword and get the offset from A for(char letter : keyword){ offset.push_back((letter - 'A') % 26); } } std::vector Vigenere::getOffsets() const{ return offset; } std::string Vigenere::encode(){ //Clear the outputString outputString = ""; //Reserve the correct size for the output string to increase speed for longer messages outputString.reserve(inputString.size()); //Step through every charater in the inputString and advance it the correct amount, according to offset for(int cnt = 0;cnt < inputString.size();++cnt){ char letter = (inputString[cnt] + offset[cnt % offset.size()]); //By using % you allow it to loop without having a separate counter //Make sure the character is still a letter, if not, wrap around if(letter < 'A'){ letter += 26; } else if(letter > 'Z'){ letter -= 26; } outputString += letter; } return outputString; } std::string Vigenere::encode(std::string key, std::string input){ setKeyword(key); setInputString(input); return encode(); } std::string Vigenere::decode(){ //Clear the outputString outputString = ""; //Reserve the correct size for the output string to increase speed for longer messages outputString.reserve(inputString.size()); //Step through every charater in the inputString and reduce it the correct amount, according to offset for(int cnt = 0;cnt < inputString.size();++cnt){ char letter = (inputString[cnt] - offset[cnt % offset.size()]); //By using % you allow it to loop without having a separate counter if(letter < 'A'){ letter += 26; } else if(letter > 'Z'){ letter -= 26; } outputString += letter; } return outputString; } std::string Vigenere::decode(std::string key, std::string input){ setKeyword(key); setInputString(input); return decode(); } void Vigenere::reset(){ inputString = outputString = keyword = ""; offset.clear(); }