我正在编写一个创建随机字符串的程序,然后散列字符串以获取其MAC。我想查看散列的第一个字节,看看是否等于特定的十六进制值。 (简化了前映像攻击。)我的代码成功地从每个哈希中拉出第一个字节,但没有正确地比较它。因此,即使两个字节相等,while循环也不会识别它并且无限期地继续运行。
Random generator = new Random();
Boolean found = false;
int i;
String test="";
int whatIWant = 169;
while(found == false)
{
String x = "";
i = 0;
while(i<15000)
{ //String x = "";
int y = generator.nextInt(220)+20;
x = x + Integer.toHexString(y);
i++;
}
byte[] hexMessage = DatatypeConverter.parseHexBinary(x);
MessageDigest cript = MessageDigest.getInstance("SHA-512");
cript.reset();
cript.update(hexMessage);
byte[] hash = cript.digest();
test = String.format("%02X ", hash[0]);
if(test.equalsIgnoreCase(Integer.toHexString(whatIWant).toString()))
found = true;
答案 0 :(得分:0)
我没有运行你的代码。我想看看Integer.toHexString()的结果,我不知道你为什么要调用Integer.toHexString()返回的字符串再次成为.toString()的字符串,尽管它不是一个大问题,因为价值应该是一样的。
总而言之,我认为突出的问题可能是你从未关闭过你的循环...至少它没有在这里显示。
答案 1 :(得分:0)
您正在通过字节(hash[0]
)搜索大于字节最大值(127)的值(169)。这是您的搜索永远不会完成的一个原因。值&gt; 127永远不会在那里。
下一个问题是你的字符串转换模式"%02X "
在十六进制字符串之后引入了一个空格。假设您搜索127 ... "7F "
永远不会等于"7F"
,所以再次,您的搜索将永远不会完成,即使是范围内的字节值也是如此。
如果您有兴趣,请尝试将其添加到您的代码中:
圈外:
Set<Integer> foundBytes = new TreeSet<Integer>();
在循环结束时:
if (hash[0] != whatIWant) {
if (foundBytes.add((int)hash[0])) {
System.out.printf("[%3d] %s\n", foundBytes.size(), foundBytes);
}
}
如果您将搜索值设置为大于127,您会注意到foundBytes
集快速填满所有可能的字节值,之后不再找到新字节且print语句不是调用
(您的代码可以通过BTW的几种方式进行优化,但这不是问题的重点。)