如何在 Openssl 中生成十六进制输出?

How to generate the output in hexadecimal in Openssl?

最后,我可以使用“-a”开关获得 base64 格式的输出;有我可以使用的十六进制开关吗?

echo '0: 63616e746765747468697332776f726b' | xxd -r | openssl enc -aes-128-ecb -a -K 00000000000000000000000000000000

如果我运行那个代码,我会得到这个:

N2+bVLU8fIS7ucFW1Qr/xwFD22PuZrDN/59pkXaAFR4=

...不知何故它也是错误的,因为它应该只是这个:

N2+bVLU8fIS7ucFW1Qr/xw==

无论如何,我只需要能够想出这个输出:

376f 9b54 b53c 7c84 bbb9 c156 d50a ffc7

Q1。不行,openssl enc不能输出十六进制,只能输出binary/raw或base64。但是您显然有 xxd 可用,其主要目的是将其转换为十六进制,以便通过管道输入,然后 cut -c10-50 删除最左边的地址和最右边的可打印 ASCII 部分以获得您显示的确切格式 xxxx xxxx etc;或者 xxd -p 执行 'plain' xxxxxxxxod -An -tx1 一步执行 xx xx xx xx etc

Q2。您将获得两个密文块(的 base64 编码),因为使用非流密码的 enc 默认为 PKCS#5 填充,而您的明文恰好是一个块(AES 为 16 字节)。 添加 -nopad 以获得您要求的输出。


这里是整个地方的顺序

问题:您输入的是十六进制,希望输出是十六进制,但是 openssl enc 接受二进制(非十六进制)输入并生成二进制或 base64(但不是十六进制)输出。

推论:您必须将输入从十六进制转换为二进制。您还必须将输出从二进制转换为十六进制。虽然这两个都包含单词 'hex' 和 'binary',但它们是不同的东西。

第 1 步:将输入从十六进制转换为二进制,因为您有十六进制并且需要二进制输入 enc

 echo 0: 63616e746765747468697332776f726b | xxd -r 

第 2 步:执行从二进制到二进制的加密(无填充)

 openssl enc -aes-128-ecb -nopad -K 00000000000000000000000000000000 

省略步骤:请勿使用 -a 转换为 base64。 你不需要 base64。

第 3 步:将二进制转换为十六进制,因为您有二进制但想要十六进制

xxd -p

TOTAL(使用 $ 的最小 shell 提示,您的可能不同):

$ echo 0: 63616e746765747468697332776f726b | xxd -r \
| openssl enc -aes-128-ecb -nopad -K 00000000000000000000000000000000 | xxd -p
376f9b54b53c7c84bbb9c156d50affc7
$

这是你要求的结果,除了没有空格,你后来说你不需要。

如果您确实想要间距,请使用 xxd 而不使用 -p 并添加 cut,如我最初所说:

$ echo 0: 63616e746765747468697332776f726b | xxd -r \
| openssl enc -aes-128-ecb -nopad -K 00000000000000000000000000000000 | xxd | cut -c10-50
376f 9b54 b53c 7c84 bbb9 c156 d50a ffc7
$