我在为类分配创建强力java代码时遇到了一些麻烦。教授对我的帮助不大,希望有人可以借给我一些帮助。教授提供了两种方法md5_bytes
和mini_md5_bytes
。迷你字节用于解码24位而不是完整散列。我试图自己去做,我撞墙了。随机字符串生成器是我尝试使用随机字符串最终找到预选字s的哈希。我很感激帮助。
public class BruteForce {
static int num_bytes=24;
static String rand = "";
static String s = "aefbcefacefeacaecefc";
static byte[] random = null;
static byte[] md = null;
public static void main(String[] args) throws Exception{
md = mini_md5_bytes(s, num_bytes);
if(s.equalsIgnoreCase(rand)){
System.out.println(rand);
}
else{
rand = brute(md, s);
}
}
public static byte[] mini_md5_bytes(String s, int num_bytes){
byte[] md = md5_bytes(s);
return Arrays.copyOf(md,num_bytes);
}
public static byte[] md5_bytes(String s){
MessageDigest md;
try {
md = MessageDigest.getInstance("MD5");
md.update(s.getBytes());
return md.digest();
} catch( java.security.NoSuchAlgorithmException e) {
return null;
}
}
public static String brute(byte[] md, String s) throws Exception{
while(!s.equalsIgnoreCase(rand)){
rand = RandomStringGenerator.generateRandomString(20,RandomStringGenerator.Mode.ALPHA);
byte[] random = mini_md5_bytes(rand, num_bytes);
if((Arrays.equals(random, md))){
rand = s;
return rand;
}
}
return null;
}
}
答案 0 :(得分:1)
虽然MD5是no longer considered safe for crypto,但这并不意味着MD5很容易暴力。
正如其他人在评论中建议的那样,不要尝试随机字符串(特别是因为随机数的生成很慢)。 Brute force是关于尝试所有组合,直到找到匹配项。
此外,通过阅读mini_md5_bytes()
,您似乎不希望找到具有完全相同的MD5哈希的两个字符串,但只是使用相同的MD5“前缀”。
如果是这种情况,请使用较小的数字num_bytes
。也许从1或2开始,然后增加数字直到你的工具变得太慢。顺便说一句,请注意您使用num_bytes=24
,即192位,而MD5 produces just 128 bits。
另外,你为什么要使用s.equalsIgnoreCase(rand)
?如果你想暴力破解MD5哈希,那么你不应该关心输入字符串s
。那个字符串甚至不应该是输入!如果s
是输入,您可以使用rand = s
,您就可以完成了。您的目标是找到哈希冲突,而不是找到原始字符串。
这是brute()
功能的正确签名:
public static String brute(byte[] md) throws Exception
这是while
- 循环的正确条件:
while(!Arrays.equals(random, md))