elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Algoritmo existente?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: ¿Algoritmo existente?  (Leído 3,840 veces)
goto C

Desconectado Desconectado

Mensajes: 20


Ver Perfil
¿Algoritmo existente?
« en: 28 Julio 2013, 13:54 pm »

Hola, este es mi primer mensajito jeje, me he visto obligado a pedir ayuda, al principio me veía capaz, pero después de probar mil códigos diferentes y ver que siempre todos fallan en algún punto acudo para pedir que me echéis una mano, plissss.

El caso, tengo un array (correctamente inicalizado y comprobado que contiene bien los caracteres y todo ok), así, suponiendo que contiene los caracteres; a b c d, el programa debe hacer las siguientes combinaciones:

ab
ac
ad
bc
bd
cd
abc
abd
bcd
abcd

Nota: si se conoce el número de caracteres es relativamente sencillo, pero se trata de hacer combinaciones del modo que explico sin saber el número de caracteres, es decir, el usuario introduce por teclado el número, y a continuación los caracteres, pero el código del programa debe estar preparado para funcionar sea cual sea el número, si no me explico me lo decís jeje.

No importa el orden, únicamente importa que estén todas las combinaciones. Me extraña que no haya ningún algoritmo ya desarrollado que haga esto, ¿no tiene ningún nombre realizar combinaciones de esta manera?, pregunto par poder googlear jeje.
Bueno, si a alguien se le ocurre cómo hacerlo, aunque sea la idea, no es necesario que me de el código, se lo agradezco mucho. El programa es en C, aunque si alguno sabe hacerlo en otro lenguaje que lo haga en ese y ya lo "traduciremos" jeje.

Muchísimas gracias. Saludos.


En línea

Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: ¿Algoritmo existente?
« Respuesta #1 en: 28 Julio 2013, 13:59 pm »

Si quieres que haga todas las combinaciones de unos caracteres puede buscar por fuerza bruta.
Lo del numero a que te refieres?


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: ¿Algoritmo existente?
« Respuesta #2 en: 28 Julio 2013, 14:06 pm »

Yo ya lo tengo hecho y realizado:

Recursivo:

Código
  1. const char Diccionario[]= {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
  2. 'p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J'
  3. ,'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3',
  4. '4','5','6','7','8','9','\0'};
  5.  
  6. const int Tamanyo_Diccionario;
  7.  
  8. //...
  9.  
  10. Tamanyo_Diccionario = strlen(Diccionario);
  11.  
  12. // Llamamos a la funcion
  13.  
  14. while(!explora(intento,password,0,hasta)) { hasta++;
  15.    intento[hasta] = '\0';}
  16.  
  17. printf("La contrasenaya es: %s",intento);
  18.  
  19. //...
  20.  
  21. char explora (char* Password,const char* Correcta, int desde, int hasta){
  22.  if (desde==hasta){
  23.    return !strcmp(Password,Correcta);
  24.  }else{
  25.    int i = 0;
  26.    for (i=0; i< TamanyoDiccionario; i++){
  27.      Password [desde] = Diccionario[i];
  28.       if (explora (Password, Correcta, desde+1, hasta))
  29.        return 1;
  30.    }
  31.  }
  32.  return 0;
  33. }

Otra modalidad iterativa (lo usé para resolver sudokus y está en C++, tendrás que adaptarlo):

Código
  1. bool Resolver(short Tablero[MAX][MAX])
  2. {
  3.    vector<pair<int,int> > Casillas;
  4.    for (short j = 0; j < MAX;j++)
  5.        for (short i = 0; i < MAX;i++)
  6.            if (Tablero[i][j] == 0)
  7.                Casillas.push_back(make_pair(i,j));
  8.  
  9.    register short Inicio = Casillas.size()-1;
  10.  
  11.    short Actual;
  12.    short i;
  13.  
  14.    for (i = 0; i < Casillas.size();i++)
  15.    {
  16.            Tablero[Casillas[i].first][Casillas[i].second] = i%(MAX)+1;
  17.    }
  18.  
  19.   // Ultimo_Movimiento = 1;
  20.  
  21.    while(true)
  22.    {
  23.        for (i = 1; i < MAX;i++)
  24.        {
  25.  
  26.            Tablero[Casillas[Inicio].first][Casillas[Inicio].second] = i;
  27.  
  28.            if (Resuelto(Tablero))
  29.                return true;
  30.        }
  31.  
  32.        Tablero[Casillas[Inicio].first][Casillas[Inicio].second] = 1;
  33.  
  34.        if (Inicio == 0)
  35.                Inicio++;
  36.        else
  37.        {
  38.            Actual = Inicio-1;
  39.  
  40.            Tablero[Casillas[Actual].first][Casillas[Actual].second] ++;
  41.  
  42.            while (Tablero[Casillas[Actual].first][Casillas[Actual].second] > (MAX))
  43.            {
  44.               Tablero[Casillas[Actual].first][Casillas[Actual].second] = 1;
  45.  
  46.                Actual--;
  47.  
  48.                if (Actual == -1)
  49.                {
  50.                    return false;
  51.                }
  52.                Tablero[Casillas[Actual].first][Casillas[Actual].second]++;
  53.  
  54.            }
  55.  
  56.        }
  57.  
  58.    }
  59.  
  60. }
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
goto C

Desconectado Desconectado

Mensajes: 20


Ver Perfil
Re: ¿Algoritmo existente?
« Respuesta #3 en: 28 Julio 2013, 14:54 pm »

Gracias a los dos, muchas gracias. Amchacon, te he enviado un mensaje con unos problemillas que tengo con tu programa, si no te importa, cuando tengas tiempo échale un vistacillo que estoy muy perdido jejeje.

Stakewinner00 lo que estoy tratando de hacer es un generador de fuerza bruta, lo que sucede es que ya tengo todas las partes principales del programa funcionando, solamente me falta ésta que os comento, lo cual no es fuerza bruta, pues son solamente algunas combinaciones de todas las posibles con esos caracteres. Aunque si alguno sabe de alguna manera (directamente, sin varias partes de código) de hacer todas las combinaciones posibles (fuerza bruta) de otra manera que lo diga porfa jejeje, que me adapto.

Con lo del número me refiero a que pueden ser 3 caracteres o 15, es decir, lo único en común es la manera de hacer las combinaciones, que es como explico en el ejemplo.

Saludos y gracias. :rolleyes:
« Última modificación: 28 Julio 2013, 15:19 pm por goto C » En línea

goto C

Desconectado Desconectado

Mensajes: 20


Ver Perfil
Re: ¿Algoritmo existente?
« Respuesta #4 en: 28 Julio 2013, 21:02 pm »

Amchacon, he estado mirando tu programa, el que está en C, no el de C++, y me da errores de compilación, ¿qué compilador usas?

Además agradecería que alguien me explicara un poco el código, porque no entiendo bien el funcionamiento ni cómo está estructurado.

Saludos, gracias.
En línea

Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: ¿Algoritmo existente?
« Respuesta #5 en: 28 Julio 2013, 21:08 pm »

Amchacon, he estado mirando tu programa, el que está en C, no el de C++, y me da errores de compilación, ¿qué compilador usas?

Además agradecería que alguien me explicara un poco el código, porque no entiendo bien el funcionamiento ni cómo está estructurado.

Saludos, gracias.

El código falta aplicarlo. Tienes que poner los includes necesarios, el main, etc.
En línea

goto C

Desconectado Desconectado

Mensajes: 20


Ver Perfil
Re: ¿Algoritmo existente?
« Respuesta #6 en: 28 Julio 2013, 21:46 pm »

Ya hombre, eso ya está hecho, además me lo mandó amchacon completo, pero ni con esas compila...
En línea

Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: ¿Algoritmo existente?
« Respuesta #7 en: 28 Julio 2013, 21:49 pm »

Ya hombre, eso ya está hecho, además me lo mandó amchacon completo, pero ni con esas compila...
Postea aquí el código entero y te intentamos ayudar
En línea

goto C

Desconectado Desconectado

Mensajes: 20


Ver Perfil
Re: ¿Algoritmo existente?
« Respuesta #8 en: 28 Julio 2013, 22:17 pm »

Código:
#include <stdio.h>
#include <string.h>

const char Diccionario_Default[]= {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
'p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J'
,'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3',
'4','5','6','7','8','9','\0'};

const char Diccionario_Mayusculasoff[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
'p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','\0'};

const char Diccionario_Minusculasoff[] = {'A','B','C','D','E','F','G','H','I','J'
,'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3',
'4','5','6','7','8','9','\0'};

const char Diccionaro_Numerosoff[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
'p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J'
,'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','\0'};

const char Diccionario_MayusculasNumerosoff[]= {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
'p','q','r','s','t','u','v','w','x','y','z','\0'};

const char Diccionario_MinusculasNumerosoff[]= {'A','B','C','D','E','F','G','H','I','J'
,'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','\0'};

const char Diccionario_MayusculasMinusculasoff[]= {'0','1','2','3','4','5','6','7','8','9','\0'};

char* Diccionario = Diccionario_Default;
int TamanyoDiccionario = 0;
char explora (char* Password,const char* Correcta, int desde, int hasta);

int main()
{
    char LongitudMin;
    char Opcion;
    char password[256];
    char intento[256] = "as";
    //char* valor = fgets(password,255,stdin);

    TamanyoDiccionario = strlen(Diccionario);
    puts("Introduce tu contrasenya: ");

    scanf("%s",password);

    puts("Quieres proporcionar opciones adicionales? (s/n): ");
    scanf(" %c",&Opcion);

    if (Opcion == 's' || Opcion == 'S')
    {
         char Mayuscula;
        char Minuscula;
        char Numeros;
        puts("Que longitud tiene al menos contrasenya? ");
        scanf("%d",&LongitudMin);

        if (LongitudMin < 0)
            LongitudMin = 0;

        puts("Tiene letras mayusculas? (S/N) ");
        scanf(" %c",&Mayuscula);

        puts("Tiene letras minusculas? (S/N)");
        scanf(" %c",&Minuscula);

        puts("Tiene numeros? (S/N)");
        scanf(" %c",&Numeros);

        #define Afr(tipo) (tipo == 's' || tipo == 'S')

        if (!Afr(Mayuscula) && !Afr(Minuscula) && Afr(Numeros)) // 001
            Diccionario = Diccionario_MayusculasMinusculasoff;

        if (!Afr(Mayuscula) && Afr(Minuscula) && !Afr(Numeros)) // 010
            Diccionario = Diccionario_MayusculasNumerosoff;

        if (!Afr(Mayuscula) && Afr(Minuscula) && Afr(Numeros)) // 011
            Diccionario = Diccionario_Mayusculasoff;

        if (Afr(Mayuscula) && !Afr(Minuscula) && !Afr(Numeros)) // 100
            Diccionario = Diccionario_MinusculasNumerosoff;

        if (Afr(Mayuscula) && !Afr(Minuscula) && Afr(Numeros)) // 101
            Diccionario = Diccionario_Minusculasoff;

        if (Afr(Mayuscula) && Afr(Minuscula) && !Afr(Numeros)) // 110
            Diccionario = Diccionaro_Numerosoff;

        if (Afr(Mayuscula) && Afr(Minuscula) && Afr(Numeros)) // 111
            Diccionario = Diccionario_Default;

        TamanyoDiccionario = strlen(Diccionario);// Generar Diccionario

    }
    else
        {
            LongitudMin = 0;
        }

    int hasta = LongitudMin;

    while(!explora(intento,password,0,hasta)) { hasta++;
    intento[hasta] = '\0';}

    printf("La contrasena es %s",intento);

    return 0;
}

char explora (char* Password,const char* Correcta, int desde, int hasta){
  if (desde==hasta){
    return !strcmp(Password,Correcta);
  }else{
    int i = 0;
    for (i=0; i< TamanyoDiccionario; i++){
      Password [desde] = Diccionario[i];
       if (explora (Password, Correcta, desde+1, hasta))
        return 1;
    }
  }
  return 0;
}
En línea

Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: ¿Algoritmo existente?
« Respuesta #9 en: 28 Julio 2013, 22:18 pm »

Pues ami si que me compila todo y que me da alertas podrías poner lo que te pone ati?
Citar
a.c:80:25: warning: assignment discards 'const' qualifier from pointer target ty
pe [enabled by default]
Ahora miro por que se trata, ya editare si eso.

EDITO: El error ocurre por que lo declaras como const

No estaría mejor declarar un array con todas las posibilidades y luego estableces las que el usuario elija?
« Última modificación: 28 Julio 2013, 22:31 pm por Stakewinner00 » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Detener sonido de un flash ya existente
Diseño Gráfico
SeniorX 2 4,681 Último mensaje 17 Abril 2007, 17:05 pm
por eagle17
Eliminar algo ya existente en html?
Desarrollo Web
Cergath 3 2,688 Último mensaje 2 Diciembre 2010, 14:57 pm
por Cergath
dime el algoritmo que más te gusta... ejm:algoritmo del avestruz
Programación General
jhonatanAsm 0 3,631 Último mensaje 13 Mayo 2011, 01:30 am
por jhonatanAsm
Instalar W7 Conservando información ya existente en el pc.
Windows
Gea99 3 2,526 Último mensaje 26 Febrero 2012, 16:04 pm
por dato000
append , . a un string existente
Programación C/C++
bash 1 1,402 Último mensaje 12 Junio 2015, 04:29 am
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines