#include <iostream>
|
|
#include <string>
|
|
#include <vector>
|
|
#include <fstream>
|
|
#include <sstream>
|
|
#include <assert.h>
|
|
|
|
std::string load_file(std::string filename, size_t end_cut = 0)
|
|
{
|
|
std::stringstream ret;
|
|
std::ifstream file(filename);
|
|
while(file.good())
|
|
{
|
|
ret<<(char)file.get();
|
|
}
|
|
auto rret = ret.str();
|
|
rret.resize(rret.size()-end_cut);
|
|
return rret;
|
|
}
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
std::vector<std::string> params;
|
|
for(int i=0;i<argc;i++)
|
|
{
|
|
params.push_back(std::string(argv[i]));
|
|
}
|
|
|
|
if(params.size()==2)
|
|
{
|
|
auto ciphertext = load_file(params[1],4);
|
|
int jumper=0;
|
|
bool is_okay = true;
|
|
do{
|
|
is_okay=true;
|
|
for(size_t idx=0;idx<ciphertext.size();idx++)
|
|
{
|
|
if(!isgraph((char)(ciphertext[idx]-jumper+idx)))
|
|
{
|
|
is_okay=false;
|
|
jumper++;
|
|
}
|
|
}
|
|
}while((!is_okay) && jumper<=256);
|
|
if(is_okay)
|
|
{
|
|
for(size_t idx=0;idx<ciphertext.size();idx++)
|
|
{
|
|
std::cout<<(char)(ciphertext[idx]-jumper+idx);
|
|
}
|
|
}else{
|
|
std::cout<<"Unable to find a valid representation"<<std::endl;
|
|
}
|
|
}
|
|
else if(params.size()==3)
|
|
{
|
|
auto ciphertext = load_file(params[1],4);
|
|
auto zeroed = load_file(params[2],4);
|
|
assert(ciphertext.size()==zeroed.size());
|
|
for(size_t idx=0;idx<ciphertext.size();idx++)
|
|
{
|
|
std::cout<<(char)(ciphertext[idx]-zeroed[idx]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
std::cout<<
|
|
"codebreak 0.1.0\n"
|
|
"usage:\n"
|
|
"codebreak encrypted_file [0ed_ciphertext]"
|
|
<<std::endl;
|
|
}
|
|
}
|