Openssl 如何在终端将十六进制哈希转换为二进制?

Openssl 如何在终端将十六进制哈希转换为二进制?,openssl,binaryfiles,hexdump,xxd,Openssl,Binaryfiles,Hexdump,Xxd,主要问题:如何使用xxd-r? 次要细节。此命令输出十六进制哈希: openssldgst-sha256 myFile | awk'{print$2}>myHashHex 我想myHashHex是一个“hextump”,不是吗我以为xxd-rmyHashBin 因此,我期望xxd-rnewHashBin生成newHashBin=myHashBin PS:to测试。现实生活中的问题是使用sha256sum维护所有数据,并且仅在一个过程中将其转换为双sha256 相反,我使用的是openssl

主要问题:如何使用
xxd-r

次要细节。此命令输出十六进制哈希:

openssldgst-sha256 myFile | awk'{print$2}>myHashHex
我想
myHashHex
是一个“hextump”,不是吗
我以为
xxd-r
会转换成。。。嗯,它不起作用


笔记 测试/比较。我认为这在二进制中是相同的(没有标题):

openssldgst-sha256-binary myFile>myHashBin
因此,我期望
xxd-rnewHashBin
生成newHashBin=myHashBin


PS:to测试。现实生活中的问题是使用sha256sum维护所有数据,并且仅在一个过程中将其转换为双sha256

相反,我使用的是
openssl dgst-sha256-binary myFile | openssl dgst-sha256>myDoubleHash

我将使用两个步骤:

  • (始终生成myHashHex)
    openssl dgst-sha256 myFile | awk'{print$2}>myHashHex

  • (需要双精度时)
    xxd-r myHashHex | openssl dgst-sha256>myDoubleHash

  • 转储的类型 问题是xxd需要一个格式化的十六进制转储,但您正在发送一个十六进制数字符串。这就是xxd所说的“普通hextump”

    格式化的hextump如下所示(引用Joseph Campbell的话):

    $printf“计算机就像旧约中的神,有很多规则,没有仁慈。”| xxd
    00000000:436f 6d70 7574 6572 7320 6172 6520 6c69计算机是li
    00000010:6b65 206f 6c64 2074 6573 7461 6d65 6e74如旧约
    00000020:2067 6f64 733b 206c 6f74 7320 6f66 2072神;大量的r
    000000 30:756c 6573 2061 6e64 206e 6f20 6d65 7263不含水星
    00000040:792e y。
    
    默认情况下,xxd将创建这种类型的hextump

    使用-p表示十六进制字符串 根据,
    -r
    希望读取格式化的hexdump:

    -r | -revert
        reverse operation: ... 
        Use the combination -r -p to read plain hexadecimal 
        dumps without line number information and without a particular column layout. 
        ...
    
    重申一下,默认情况下,
    xxd-r
    需要一个格式化的hexdump。要读取或写入带有xxd的“普通十六进制转储”,请使用
    -p
    选项。请注意,xxd希望标志出现在参数之前,因此如果以标志结束,则会出现意外行为

    验证 如果您可以看到两次运行openssl(最初使用
    -binary
    )和使用xxd运行openssl会产生相同的结果

    $openssldgst-sha256 myHashHex;
    $xxd-r-p myHashHex | openssl dgst-sha256
    (标准DIN)=61f417374f4400b47dcae1a8f402d4f4dacf455a0442a06aa455a447b0d4e170
    $openssl dgst-sha256-二进制