Buscando el pseudo-punto fijo del MD5 en Java

Por Saiyine Enviar correo el 2009-05-10 08:15:57 - Secciones: JAVA MD5 PROGRAMACION - Enlace permanente: 874

Esta es mi entrada para el reto de encontrar el punto fijo de MD5 que mencionaron el otro dia en programming.reddit. No es un código muy limpio, sino más bien una prueba de concepto para ver que tal se portaba Java... y se porta tres ordenes de magnitud más lento que las implementaciones en C tirando de OpenSSL que usa el ganador (amén de una granja de P4).

En mi maquina de casa, este código me saca unas 44.000 sumas por segundo por nucleo, muy lejos de los millones por segundo de las versiones en código nativo.

package com.saiyine.experimentos.md5;

import java.security.MessageDigest;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

public class Sumador
{
    static String hex = "01234567890abcdef";
    static Random r = new Random();
    static MessageDigest md;
    static int contador = 0;
    static long tiempo = 60;
   
    public Sumador()
    {
        try
        {
            md = MessageDigest.getInstance( "MD5" );
        } catch ( Exception e)
        {
            e.printStackTrace();
        }
    }
   
    public String md5(String cadena)
    {
        String aux ="";
            md.update( cadena.getBytes() );
            byte[] digest = md.digest();
            String moco = "";
            for ( byte b : digest )
            {
                moco = moco +","+( b & 0xff );
                String aux2 =(Integer.toHexString( b & 0xff ));
                while (aux2.length()<2)
                {
                    aux2="0"+aux2;
                }
                aux=aux+aux2;
            }
            md.reset();
        return aux;
    }

    public static int parecido(String cadena1, String cadena2, int imprimir)
    {
        int aux = -1;
        for (int i=0;i<32; i++)
        {
            cadena1 = cadena1.substring(1, 32) + cadena1.charAt(0);
            int contador = 0;
            for (int j=0;j<32; j++)
            {
                if (cadena1.charAt(j) == cadena2.charAt(j))
                {
                    contador++;
                } else
                {
                    contador=0;
                }
            }
            if (contador>aux)
                aux=contador;
        }
        if (aux > imprimir)
        System.out.println(cadena1+" - "+cadena2+ " "+aux);
        return aux;
    }
   
    public static char hexa()
    {
       int i = r.nextInt(15);
        return hex.charAt(i);
    }   
   
    public static String azar(String cadena)
    {
        return hexa() + cadena.substring(0,cadena.length()-1);
    }   
   
    public static void main(String[] args)
    {
        Sumador s = new Sumador();
       
        Timer t = new Timer();
        TimerTask task = new TimerTask()
        {
            public void run()
            {
                System.out.println((contador/tiempo)+" comprobaciones/segundo");
                contador=0;
            }
        };
        t.schedule(task, tiempo * 1000, tiempo * 1000);                 
       
        String cadena1 = s.md5(""+(r.nextLong()*r.nextLong()*r.nextLong()));
        String cadena2 = null;
           
        while (true)
        {
            cadena1 = azar(cadena1);
            cadena2 = s.md5(cadena1);
            parecido(cadena1,cadena2,8);
            contador++;
        }
    }
}

Otras entradas de la web que podrian interesarte:

  • (588)  Nov 03   LINUX   Buscando redes inalambricas
  • (576)  Oct 20   PROGRAMAS   Voipbuster, llamadas a fijo gratuitas
  • (735)  Dec 03   PRINCIPAL PLAGIABLE PAGINAS   Websnapr punto com
  • (4)  Jun 01   PRINCIPAL   ¡El nuevo aspecto de la pagina esta a punto de llegar!
  • (365)  Mar 10   ARTICULO ALGORITMOS PROGRAMACION   Algoritmo de Huffman adaptativo

  • Tu nombre (Nick):

    Tu correo (Email):
      Necesario para tu gravatar!

    Tu página (URL):

    Escribe aqui tu comentario:

           :noworry: :roll: :huh: :push: :OO 8) 8O :( :) :? :D :P :o :x :| ;) ^^ xD



    Vista previa activada.

    Vista previa (6/6/6, 6:66)


    Fondos de pantalla

    . . .

    Descargas

  • ApagaPC
    apagapc241.exe  (3280)
  • LimpiaDocus
    LimpiaDocus001.exe  (2549)
  • RCM
    rcm001.zip  (2185)
  • Popmail
    popmail-0.4-psmn.tar.gz  (2257)
  • Manual de Delphi en PDF
    delphi_pdf.zip  (2849)
  • Evangelio del Perl
    Evangelio_del_perl.pdf  (2560)
  • Excel Simpsons
    Excel Simpsons  (2798)
  • . . .

    Proyectos Online

  • Saiyine Store
  • Kunowalls!!!
  • Fondos de pantalla
  • Picaday: imagenes sexys o chocantes.
  • Scarlett: fotos de Scarlett Johansson
  • WhatsmyIP: obtener tu IP pública
  • Uma Thurman: galeria de Uma Thurman
  • FunPics: imagenes graciosas
  • . . .

    Blogs

  • Por lo que más querais, no entreis a estos: Tapanez, Yhandros, Onez.

  • Otros en español: El Mundo Today, La libreta de Van Gaal, Chavalina, Kirai, Mundo Geek, Microsiervos.

  • Mis lecturas en guiri: Michael Yon, Coding Horror, YCombinator news, MySQL Performance, Slashdot.

    . . .
  • Utilidades

  •  Coral  (1064), cacheando webs
  •  Spam.la  (1251), correo de usar y tirar
  •  Mailinator  (1220), correo de usar y tirar
  •  Bug me not  (1098), absurdos registros di NO
  •  Trashmail  (1126), correo de usar y tirar

    . . .
  • Saipuntos

    Jomer: 2
    Yhandros: 1
    Cheimy: 1

    . . .

    Busquedas


    Varios ejemplos de lo que buscaban visitantes recientes:

    . . .

    Página web ©2001-2010 Saiyine generada en s, con 4123366 visitas en total, hoy (de un total de 0 previstas).

    . . .