An example of why you should not roll your own crypto
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 

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