An example of why you should not roll your own crypto
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 

73 lignes
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;
}
}