gpt4 book ai didi

java - 将两个十六进制值作为字符串进行比较

转载 作者:太空宇宙 更新时间:2023-11-04 14:01:31 25 4
gpt4 key购买 nike

我正在编写一个程序,该程序创建随机字符串,然后对字符串进行哈希处理以获得其 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;

最佳答案

您正在通过字节 (hash[0]) 搜索大于字节最大值 (127) 的值 (169)。这就是为什么你的搜索永远不会结束的原因之一。 > 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 语句。

(顺便说一句,您的代码可以通过多种方式进行优化,但这不是问题的重点。)

关于java - 将两个十六进制值作为字符串进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29262345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com