Foro de elhacker.net

Seguridad Informática => Criptografía => Mensaje iniciado por: eberfalu2 en 21 Septiembre 2015, 01:43 am



Título: fuerza bruta AES modo ECB
Publicado por: eberfalu2 en 21 Septiembre 2015, 01:43 am
Hola gente, ando en busca de otro par de ojos basicamente. Tengo que encontrar, a traves de una ataque de fuerza bruta, cual es la clave con la que fue cifrado el texto.
Me dieron un parte de la llave (11caracteres de 16) y tengo q hacer fuerza bruta sobre el resto, mi idea fue descifrar el texto con cada una de las llaves y ver si los caracteres que me dio como resultado pertenecen al rango ascii (se que el texto fue codificado en ascii). trabaje con cripto++ y mi codigo tarda muchas horas (unas 18 si lo hago en paralelo si no mas) cuando se que mis compañeros lo han podido hacer en menos.

aca les dejo el codgio
Código:
string decodifica(byte key[16], string hexa){
AutoSeededRandomPool prng;
string recovered="";
ECB_Mode< AES >::Decryption d;
try{
d.SetKey(key, 16);
CryptoPP::StringSource ss(hexa, true,
new CryptoPP::HexDecoder(
new CryptoPP::StreamTransformationFilter( d,
new CryptoPP::StringSink( recovered ), StreamTransformationFilter::NO_PADDING)));
}catch(const CryptoPP::Exception& e) {
cerr << e.what() << endl;
exit(1);
}
return recovered;
}

int valido(string aux){
int resul=1, h=0;
int tam=sizeof(aux);
int ac;
for(h=0;h<tam;h++){
if (!((int)aux[h]>0 && (int)aux[h]<257)){
resul=0;
h=25;
}
}
return resul;
}
int main(int argc, char* argv[])
{
byte key[16]={'K','e','y','2','G','r','o','u','p','2','1',' ',' ',' ',' ',' '};

string hexa1,hexa2,hexa3,hexa4,hexa5,hexa6,hexa7,hexa8,hexa9,hexa10,hexa11,hexa12,hexa13,hexa14,
hexa15,hexa16,hexa17, recovered, aux;
hexa1="D35A20289C43003A96AB32EA8556CCA6";
hexa2="D53D335BF8D2E51772743893113457CE";
hexa3="135648BEC5B8DB824965FA877EC683C2";
hexa4="A4D5FAAD25A0C83866721949B7F70504";
hexa5="E650333AFA48741C38E7B3A97A4936E7";
hexa6="4D3CFE5BC2A6AD8B82C253B98AF621DF";
hexa7="F99BC9752FF5B083858E1F4B9981B4A4";
hexa8="BB54DB4CAB1019F6769457C4F4F2B3FF";
hexa9="DE1932B09AAB1D101CDCF0216D629D17";
hexa10="6872F5DB771864533A0EEDBE2A1CC262";
hexa11="5816109CD62656B0573A03F2E7F2ACAE";
hexa12="DA538E5AADC720AD0D6C2ACC30A71BFA";
hexa13="C80F8D5FA7D9E6D94623311F1E7BB0C8";
hexa14="D3C00CABA5BB42C9AF1444D8B613DBB0";
hexa15="1963DD4D2897B7F15638F37C1E0D44FE";
hexa16="B3C4B6AB1566CD68F94E806957E04261";
hexa17="749F5A324D381008150710891496EFDF";


int i,j,k,l,m;
for(i=33; i<127; i++){
for(j=33; j<127; j++){
std::cout << (char)i << (char)j << "\n" << std::endl;
for(k=33; k<127; k++){
for(l=33; l<127; l++){
for(m=33; m<127; m++){
key[11]=(char)i;
key[12]=(char)j;
key[13]=(char)k;
  key[14]=(char)l;
key[15]= (char)m;
key[16]='\0';

aux.clear();
aux=decodifica(key, hexa1);
  if (valido(aux)==1){
  aux.clear();
  aux=decodifica(key, hexa2);
  if (valido(aux)==1){
  aux.clear();
  aux=decodifica(key,hexa3);
  if (valido(aux)==1){
  aux.clear();
  aux=decodifica(key, hexa4);
  if (valido(aux)==1){
  aux.clear();
  aux=decodifica(key,hexa5);
  if (valido(aux)==1){
  aux.clear();
  aux=decodifica(key, hexa6);
  if (valido(aux)==1){
  aux.clear();
  aux=decodifica(key,hexa7);
  if (valido(aux)==1){
  aux.clear();
  aux=decodifica(key, hexa8);
  if (valido(aux)==1){
  aux.clear();
  aux=decodifica(key,hexa9);
  if (valido(aux)==1){
  aux.clear();
  aux=decodifica(key, hexa10);
  if (valido(aux)==1){
  aux.clear();
  aux=decodifica(key,hexa11);
  if (valido(aux)==1){
  aux.clear();
  aux=decodifica(key, hexa12);
  if (valido(aux)==1){
  aux.clear();
  aux=decodifica(key,hexa13);
  if (valido(aux)==1){
  aux.clear();
  aux=decodifica(key, hexa14);
  if (valido(aux)==1){
  aux.clear();
  aux=decodifica(key,hexa15);
  if (valido(aux)==1){
  aux.clear();
  aux=decodifica(key, hexa16);
  if (valido(aux)==1){
  aux.clear();
  aux=decodifica(key,hexa17);
  if (valido(aux)==1){
  std::cout << "Esta es la llave: "<<key << std::endl;
  i=j=k=m=l=128;
  time_t tiempo = time(0);
  struct tm *tlocal = localtime(&tiempo);
  char output[128];
  strftime(output,128,"%d/%m/%y %H:%M:%S",tlocal);
  printf("%s\n",output);
}
}
}}}}}}}}}}}}}}}}
}
}
}
}

std::cout << "fin de ejecucion - " << key << std::endl;

return 0;
}

como es ecb cada bloque es independiente por eso si el primer bloque pertenece al "rango" ascii pruebo con el seg.
No me dio resultado.

Me dieron la idea de desencriptarlo y volverlo a cifrar con cada una de las llaves pero eso no lo he podido hacer (porque eso me daria lo mismo, lo que me hace pensar no termine de entender la idea que me dieron.

Gracias