Using C++ Part C: Implement the modified Caesar cipher Objective : The goal of p
ID: 3732764 • Letter: U
Question
Using C++
Part C: Implement the modified Caesar cipher
Objective:
The goal of part C is to create a program to encode files and strings using the caesar cipher encoding method. Information about the caesar method can be found at http://www.braingle.com/brainteasers/codes/caesar.php.
Note: the standard caesar cipher uses an offset of 3. We are going to use a user supplied string to calculate an offset. See below for details on how to calculate this offset from this string.
First open caesar.cpp from the starter code. You are required to implement this as a set of at least three to four functions. It should be able to read in a specified text file, encode using a modified caesar cipher, and write it to a specified file. It should be able to decrypt it in the same way.
Using the rot13.cpp file as a template just modify the algorithm to receive a string as a key. You will use this key to calculate the rotation count. You rotate in the “right” direction for encryption and in the “left” direction for decryption.
The standard caesar cipher uses a 3 character offset for rotation. However, we are going to use an ASCII string (as a key) to determine this offset. See the following examples for details.
An example of how to calculate the key:
Given the sample key “deF”:
First add all the ASCII values: ASCII_SUM = ‘d’ + ‘e’ + ‘F’ = 100 + 101 + 70 = 271
Than calculate the rotation count by using the following equation:
Count equals (ASCII_SUM % 23) + 3 = (271 % 23) + 3 = 21
The plus three in the above equation forces the code to rotate characters by at least three (3) positions.
Example:
Key: deF
Original file text:
This is a secret ring decoder that I found in a cracker jack box!
Encrypted file text:
Ocdn dn v nzxmzo mdib yzxjyzm ocvo D ajpiy di v xmvxfzm evxf wjs!
Note: The decrypted text should be the same as the original file text.
Caesar.cpp
rot13.cpp
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
class Rot13Solutution{
public:
template <typename Iter>
void rot13Impl(Iter begin, const Iter& end) {
while (begin != end) {
char& c = *begin;
if (c >= 'a' && c <= 'm') {
c += 13;
} else if (c >= 'n' && c <= 'z') {
c -= 13;
} else if (c >= 'A' && c <= 'M') {
c += 13;
} else if (c >= 'N' && c <= 'Z') {
c -= 13;
}
++begin;
}
}
};
int main () {
//This is for encrypting data and store it in encrypted file
Rot13Solutution sol;
string line;
ifstream myfile ("decryptFile.txt");
ofstream myoutfile ("encryptFile.txt");
if (myfile.is_open())
{
while ( getline (myfile,line) )
{
int n = line.length();
// declaring character array
char str[n+1];
// copying the contents of the string to char array
strcpy(str, line.c_str());
sol.rot13Impl(str,str + strlen(str)) ;
if(myoutfile.is_open())
{
myoutfile<<str;
myoutfile.close();
}
else cout << "Unable to open output file";
//cout << str << ' ';
}
myfile.close();
}
else cout << "Unable to open input file";
cout << "Your file data is being encrypted by ROT13 algorithm and stored in encypt.txt" << ' ';
cout << "-----------------------------------------------------------"<<' ';
//This is for Decrypting data and store it in Decrypted file
string dline;
ifstream myEncryptedfile ("encryptFile.txt");
ofstream myDecryptedfile ("decryptFile.txt");//decrypt file is same as the orginal file i.e example.txt
if (myEncryptedfile.is_open())
{
while ( getline (myEncryptedfile,dline) )
{
int n = dline.length();
char str[n+1];
strcpy(str, dline.c_str());
sol.rot13Impl(str,str + strlen(str)) ;
if(myDecryptedfile.is_open())
{
myDecryptedfile<<str;
myDecryptedfile.close();
}
else cout << "Unable to open output decrypted(original) file";
}
myEncryptedfile.close();
}
else cout << "Unable to open file to be decrypted";
cout << "Your file data is being decrypted by ROT13 algorithm and stored in decrypt.txt" << ' ';
return 0;
}
Explanation / Answer
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int getCount(string key){
int i=0, len = key.length(), count=0;
while(i<len){
count += key[i];
i++;
}
count = (count%23)+3;
return count;
}
string read_file(string filename)
{
ifstream in;
in.open(filename.c_str());
string str = "", inp;
if (in.is_open())
{
while (!in.eof())
{
getline(in, inp);
str += inp + " ";
}
return str;
}
else
{
cout << "Unable to open input file";
exit(1);
}
}
string encode(string str, int count)
{
int i, len = str.length() - 1;
string enc_str = str;
for (i = 0; i < len; i++)
{
if (str[i] >= 'A' && str[i] <= 'Z')
{
if (str[i] + count > 'Z')
enc_str[i] = 'A' + ((str[i] + count - 'Z') % 26) - 1;
else
enc_str[i] = str[i] + count;
}
else if (str[i] >= 'a' && str[i] <= 'z')
{
if (str[i] + count > 'z')
enc_str[i] = 'a' + ((str[i] + count - 'z') % 26) - 1;
else
enc_str[i] = str[i] + count;
}
}
return enc_str;
}
string decode(string str, int count)
{
int i, len = str.length() - 1;
string dec_str = str;
for (i = 0; i < len; i++)
{
if (str[i] >= 'A' && str[i] <= 'Z')
{
if (str[i] - count < 'A')
{
dec_str[i] = 'Z' - (('A' - (str[i] - count)) % 26) + 1;
}
else
dec_str[i] = str[i] - count;
}
else if (str[i] >= 'a' && str[i] <= 'z')
{
if (str[i] - count < 'a')
{
dec_str[i] = 'z' - (('a' - (str[i] - count)) % 26) + 1;
}
else
dec_str[i] = str[i] - count;
}
}
return dec_str;
}
void write_file(string str, string filename)
{
ofstream out(filename.c_str());
if(!out.is_open()){
cout << "Unable to open output file"<<endl;
exit(1);
}
out << str;
}
int main()
{
string key, str;
cout << "Enter keyword: ";
cin >> key;
int count = getCount(key);
str = read_file("decryptFile.txt");
string enc_str = encode(str, count);
write_file(enc_str, "encryptFile.txt");
cout << "Your file data is being encrypted by ROT13 algorithm and stored in encyptFile.txt" << ' ';
cout << "-----------------------------------------------------------" << ' ';
str = read_file("encryptFile.txt");
string dec_str = decode(str, count);
write_file(dec_str, "decryptFile.txt");
cout << "Unable to open file to be decrypted";
cout << "Your file data is being decrypted by ROT13 algorithm and stored in decryptFile.txt" << ' ';
return 0;
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.