簡體   English   中英

比較兩個十六進制值作為字符串

[英]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()的結果,但我不確定為什么您要通過.toString()再次將Integer.toHexString()返回的字符串稱為字符串,盡管這並不是一個大問題,因為值應相同。

總而言之,我認為懸而未決的問題可能是您從未關閉過while循環……至少這里沒有顯示。

您正在字節( hash[0] )中搜索值(169),該值大於字節的最大值(127)。 這就是您的搜索從未完成的原因之一。 值> 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設置快速填充了所有可能的byte值,此后不再找到新的字節,並且不調用print語句。

(順便提一下,您的代碼可以通過幾種方式進行優化,但這不是問題的重點。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM