在已知格式的字符串的情况下从MD5中查找字符串?

时间:2016-05-22 19:04:10

标签: java hash md5

我有一个挑战要完成从给定的MD5哈希中获取字符串。例如,我在此问题中需要获得的字符串格式为:1)来自霍比特人的矮人,2)数字1-9999,以及3)彩虹的颜色。这是给定的MD5哈希值:24c64b83434eb1dccc5beb6162c954cb

例如,在这种情况下,字符串可能具有以下格式:fili287yellow或类似的东西。

以下是一些Java shellcode作为解决挑战的起点:

//Made with help from http://www.mkyong.com/java/java-md5-hashing-example/

import java.security.MessageDigest;

public class md5_shellcode {

public static void main(String[] args){

    //Add your code here

}

/**
 * Md5 hash function, do not modify
 * @param dwarf Dwarf in the company of Thorin
 * @param number Number 1 - 9999
 * @param color Color of the rainbow
 * @return md5 hash of dwarf + number + color
 */
public static String md5Hash(String dwarf, int number, String color){

    try{

        MessageDigest m = MessageDigest.getInstance("MD5");

        m.update((dwarf + number + color).getBytes());

        byte b[] = m.digest();

        StringBuffer s = new StringBuffer();

        for(int i = 0; i < b.length; i++)

            s.append(Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1));

        return s.toString();

    }

    catch(Exception e){

        System.out.println("lol");

    }

    return "Error";

}

}

我该如何解决这个问题?脚本本身会是什么样的?

对不起,如果这是一个新手问题!我通常不会考虑这些目标,因此解决这样的挑战非常困难!

1 个答案:

答案 0 :(得分:2)

将散列解码回生成它的字符串是不可能的。找到答案的唯一方法是尝试散列不同的字符串,直到找到产生正确散列的字符串。我不打算为你写出一个完整的工作解决方案,但它有这种一般形式:

  1. 建立可能的矮人名单列表。
  2. 建立可能的颜色列表。
  3. 对于名称,数量和颜色的每种组合:
    1. 构建候选字符串
    2. 哈希吧
    3. 测试您是否获得了正确的哈希值。
  4. 您的程序可能具有以下一般形式:

    public static void main(String[] args) {
        String[] dwarves = { "fili", ... };
        String[] colors = { "red", ... };
    
        for (String dwarf : dwarves) {
            for (int ii = 1; ii <= 9999; ++ii) {
                for (String color : colors) {
                    String candidate = dwarf + ii + color;
                    // Hash and test the candidate
                }
            }
        }
    }