如何在 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' xxxxxxxx
或 od -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
$
最后,我可以使用“-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' xxxxxxxx
或 od -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
$