比较两个十六进制值作为字符串
Comparing two hex values as strings
我正在编写一个程序来创建随机字符串,然后对字符串进行哈希处理以获得它的 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;
我没有 运行 你的代码。我想看看 Integer.toHexString() 的结果,但我不确定为什么要将 Integer.toHexString() 返回的字符串调用 .toString() 再次成为字符串,尽管它不是大问题,因为值应该相同。
总而言之,我认为突出的问题可能是您从未关闭过 while 循环...至少这里没有显示。
您正在通过字节 (hash[0]
) 搜索大于字节最大值 (127) 的值 (169)。这就是您的搜索永远无法完成的原因之一。值 > 127 永远不会存在。
下一个问题是您的字符串转换模式 "%02X "
在十六进制字符串后引入了 space。假设您搜索 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
集很快填满了字节的所有可能值,之后没有找到更多新字节和打印语句未被调用。
(顺便说一句,您的代码可以通过多种方式进行优化,但这不是问题的重点。)
我正在编写一个程序来创建随机字符串,然后对字符串进行哈希处理以获得它的 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;
我没有 运行 你的代码。我想看看 Integer.toHexString() 的结果,但我不确定为什么要将 Integer.toHexString() 返回的字符串调用 .toString() 再次成为字符串,尽管它不是大问题,因为值应该相同。
总而言之,我认为突出的问题可能是您从未关闭过 while 循环...至少这里没有显示。
您正在通过字节 (hash[0]
) 搜索大于字节最大值 (127) 的值 (169)。这就是您的搜索永远无法完成的原因之一。值 > 127 永远不会存在。
下一个问题是您的字符串转换模式 "%02X "
在十六进制字符串后引入了 space。假设您搜索 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
集很快填满了字节的所有可能值,之后没有找到更多新字节和打印语句未被调用。
(顺便说一句,您的代码可以通过多种方式进行优化,但这不是问题的重点。)