Hash

關於在 SHA-256 輸入中將十六進制轉換為字節的疑問

  • August 19, 2021

諸如 SHA-256 之類的雜湊函式將二進製字元串作為輸入。現在給定一個十六進製字元串,當我們將其轉換為普通文本字元串時,計算出的 SHA-256 值將是相同的。這就是我的問題

讓我們考慮一個簡單的十六進製字元串2E;它的 SHA-256 值為cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8.

當轉換為字節形式時,我們應該寫46or 046。在任何一種情況下,SHA-256 輸出都不匹配:

因為46你會得到 25fc0e7096fc653718202dc30b0c580b8ab87eac11a700cba03a7c021bc35b0c.

因為046你會得到b2d084ae2bd0f4b38953ea3adb009b4f059816f93392addbcfb373399f183e88.

我們如何從十六進制轉換為字節以使結果相同?都有些什麼樣的規矩?據我所知,SHA-256 需要字節格式。

我已經使用這個(GitHub)軟體來計算 SHA-256 值。

讓我們考慮一個簡單的十六進製字元串:2E它的 SHA 值為:

cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8

對,那是正確的。

當轉換為字節形式時,我們應該寫 46 還是 046。

兩者都不。

使用十六進製表示字節的整個想法是表示字節的值。2E單個字節的十六進製表示也是如此。您還可以使用其他表示形式,例如00101110二進制。

如果您將其解釋為 ASCII 文本,它將是“點”字元。在大多數係統上也是printf "\x2E" | sha256sum如此。printf "." | sha256sum因此,在您的網站上,您可以簡單地使用一個點作為文本。也可以使用它來執行此操作,echoecho存在太多可移植性問題,無法被視為printf.

通常我們不使用小數表示字節。如果你這樣做,你可能必須專門對其進行程式。例如,在 Java 中,您可以使用byte b = 46byte[] ba = { 46 }然後在雜湊算法中使用它。如果您真的想使用命令行對其進行程式,那麼它printf "\\x$(printf "%x" 46)" | sha256sum 似乎可以工作

引用自:https://crypto.stackexchange.com/questions/93612