關於在 SHA-256 輸入中將十六進制轉換為字節的疑問
諸如 SHA-256 之類的雜湊函式將二進製字元串作為輸入。現在給定一個十六進製字元串,當我們將其轉換為普通文本字元串時,計算出的 SHA-256 值將是相同的。這就是我的問題
讓我們考慮一個簡單的十六進製字元串
2E
;它的 SHA-256 值為cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8
.當轉換為字節形式時,我們應該寫
46
or046
。在任何一種情況下,SHA-256 輸出都不匹配:因為
46
你會得到25fc0e7096fc653718202dc30b0c580b8ab87eac11a700cba03a7c021bc35b0c
.因為
046
你會得到b2d084ae2bd0f4b38953ea3adb009b4f059816f93392addbcfb373399f183e88
.我們如何從十六進制轉換為字節以使結果相同?都有些什麼樣的規矩?據我所知,SHA-256 需要字節格式。
我已經使用這個(GitHub)軟體來計算 SHA-256 值。
讓我們考慮一個簡單的十六進製字元串:
2E
它的 SHA 值為:cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8
對,那是正確的。
當轉換為字節形式時,我們應該寫 46 還是 046。
兩者都不。
使用十六進製表示字節的整個想法是表示字節的值。
2E
單個字節的十六進製表示也是如此。您還可以使用其他表示形式,例如00101110
二進制。如果您將其解釋為 ASCII 文本,它將是“點”字元。在大多數係統上也是
printf "\x2E" | sha256sum
如此。printf "." | sha256sum
因此,在您的網站上,您可以簡單地使用一個點作為文本。也可以使用它來執行此操作,echo
但echo
存在太多可移植性問題,無法被視為printf
.通常我們不使用小數表示字節。如果你這樣做,你可能必須專門對其進行程式。例如,在 Java 中,您可以使用
byte b = 46
或byte[] ba = { 46 }
然後在雜湊算法中使用它。如果您真的想使用命令行對其進行程式,那麼它printf "\\x$(printf "%x" 46)" | sha256sum
似乎可以工作。