0

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

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

openssl dgst -sha256 myFile |  awk '{print $2}' > myHashHex

我想那myHashHex是一个“hexdump”,不是吗?
我以为那xxd -r < myHashHex会转换......好吧,它不起作用


笔记

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

openssl dgst -sha256 -binary myFile > myHashBin

所以,我预计会xxd -r < myHashHex > newHashBin生成newHashBin = myHashBin


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

相反,我使用openssl dgst -sha256 -binary myFile| openssl dgst -sha256 > myDoubleHash
我将使用两步过程:

  1. (总是产生 myHashHex)
    openssl dgst -sha256 myFile | awk '{print $2}' > myHashHex

  2. (需要加倍时)xxd -r myHashHex | openssl dgst -sha256 > myDoubleHash

4

1 回答 1

1

Hexdump 的类型

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

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

$ printf "Computers are like old testament gods; lots of rules and no mercy." | xxd
00000000: 436f 6d70 7574 6572 7320 6172 6520 6c69  Computers are li
00000010: 6b65 206f 6c64 2074 6573 7461 6d65 6e74  ke old testament
00000020: 2067 6f64 733b 206c 6f74 7320 6f66 2072   gods; lots of r
00000030: 756c 6573 2061 6e64 206e 6f20 6d65 7263  ules and no merc
00000040: 792e                                     y.

默认情况下,xxd 将创建这种 hexdump。

对十六进制字符串使用 -p

根据xxd 手册页-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 读取或写入“普通 hexdump”,请使用该-p选项。请注意, xxd 期望标志出现在参数之前,因此如果以标志结尾,您将得到意想不到的行为。

确认

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

$ openssl dgst -sha256 <( printf "Hello World!" ) |  awk '{print $2}' > myHashHex; 
$ xxd -r -p myHashHex | openssl dgst -sha256 
(stdin)= 61f417374f4400b47dcae1a8f402d4f4dacf455a0442a06aa455a447b0d4e170
$ openssl dgst -sha256 -binary <( printf "Hello World!" ) | openssl dgst -sha256
(stdin)= 61f417374f4400b47dcae1a8f402d4f4dacf455a0442a06aa455a447b0d4e170
于 2020-09-01T08:08:01.760 回答