散列函数(如SHA-256 )以二进制字符串作为输入。现在给出一个十六进制字符串,当我们将它转换为一个普通的文本字符串时,计算出的SHA-256值将是相同的。这就是我的问题所在
让我们考虑十六进制2E
中的一个简单字符串;它的SHA-256值是cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8
。
当转换成字节形式时,我们应该编写46
或046
。在任何一种情况下,SHA-256输出都不匹配:
对于46
,你会得到25fc0e7096fc653718202dc30b0c580b8ab87eac11a700cba03a7c021bc35b0c
。
对于046
,你会得到b2d084ae2bd0f4b38953ea3adb009b4f059816f93392addbcfb373399f183e88
。
如何将十六进制转换为字节,结果是相同的?规则是什么?据我所知,SHA-256需要字节格式。
我使用GitHub(这个)软件来计算SHA-256值。
发布于 2021-08-17 20:36:45
让我们考虑十六进制中的一个简单字符串: cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8,它的SHA值是:
2E
。
是的,没错。
当转换成字节形式时,我们应该写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
似乎很管用。
发布于 2021-08-19 06:17:46
我使用python来表示不同之处,当您取2E并将其编码为一个字节,并将字节编码为b'2E‘时。
https://crypto.stackexchange.com/questions/93612
复制相似问题