An example of why you should not roll your own crypto
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 

73 linhas
1.7 KiB

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