首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于在SHA-256输入中将十六进制转换为字节的疑问

关于在SHA-256输入中将十六进制转换为字节的疑问
EN

Cryptography用户
提问于 2021-08-17 20:22:04
回答 2查看 1.6K关注 0票数 0

散列函数(如SHA-256 )以二进制字符串作为输入。现在给出一个十六进制字符串,当我们将它转换为一个普通的文本字符串时,计算出的SHA-256值将是相同的。这就是我的问题所在

让我们考虑十六进制2E中的一个简单字符串;它的SHA-256值是cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8

当转换成字节形式时,我们应该编写46046。在任何一种情况下,SHA-256输出都不匹配:

对于46,你会得到25fc0e7096fc653718202dc30b0c580b8ab87eac11a700cba03a7c021bc35b0c

对于046,你会得到b2d084ae2bd0f4b38953ea3adb009b4f059816f93392addbcfb373399f183e88

如何将十六进制转换为字节,结果是相同的?规则是什么?据我所知,SHA-256需要字节格式。

我使用GitHub(这个)软件来计算SHA-256值。

EN

回答 2

Cryptography用户

回答已采纳

发布于 2021-08-17 20:36:45

让我们考虑十六进制中的一个简单字符串: cdb4ee2aea69cc6a83331bbe96dc2caa9a299d21329efb0336fc02a82e1839a8,它的SHA值是:2E

是的,没错。

当转换成字节形式时,我们应该写46或046。

都不是。

对字节使用十六进制的全部思想是表示字节的值。因此,2E是单个字节的十六进制表示。您还可以使用其他表示形式,如二进制文件中的00101110

如果您将它解释为ASCII文本,它将是“点”字符。因此,在大多数系统上,printf "\x2E" | sha256sumprintf "." | sha256sum是相同的。因此,在您的网站上,您可以简单地使用一个点作为文本。使用echo也可以做到这一点,但是echo存在太多的可移植性问题,不能被认为是printf的可靠替代方案。

通常,我们不使用小数来表示字节。如果你这样做了,你很可能不得不对它进行具体的编程。例如,在Java中,您可以使用byte b = 46byte[] ba = { 46 },然后在哈希算法中使用。如果您真的想使用命令行对其进行编程,那么printf "\\x$(printf "%x" 46)" | sha256sum 似乎很管用

票数 7
EN

Cryptography用户

发布于 2021-08-19 06:17:46

  • 列表项目

我使用python来表示不同之处,当您取2E并将其编码为一个字节,并将字节编码为b'2E‘时。

  • python有一个用于ex的方法bytes.fromhex()。
  • v=bytes.fromhex('474039')
  • 此处v被打印为b'G@9‘
  • 使用binascii.hexlify(v)解码,输出为b'474039‘
票数 0
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/93612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档