将Openssl rsautl的输出转换为base64编码。

3

我有一个在 shell 脚本中的命令:

echo -n $2 | openssl rsautl -encrypt -pubin -inkey $1

其中 $2 代表一个字符串参数,$1 是要使用的公钥。

我希望输出是等效的 base64 字符串,但是在命令结尾加上 | base64 看起来不起作用 (可能是因为加密输出中包含空字符并且截断了 base64 输入)。

是否可以在不创建密文中间文件的情况下完成 base64 编码?

例如,我希望将

echo -n "asdf" | openssl rsautl -encrypt -pubin -inkey key.pub.pem

输出类似于

stWslUhRRCk/bZveABLG7fA8z9ZkYc+lBBd5QhvyGNwuI2T5v2sk8aJL3X3Xerrogsu35Wk5O839..........

而不是二进制不可读字符


你能再清楚一些吗?openssl rsautl -encrypt -pubin -inkey $1的输出有空字符吗?你能给我们展示一些样本值吗? - Inian
你提到的命令输出一个二进制值,代表加密后的消息。在这个输出中,很可能有一个字节等于\0,当bash将其写入变量或向base64写入时,会被解释为空终止符。我会尽力澄清上述内容。 - user2565010
那么您的要求是什么?您能展示一下需要的样本值和期望的输出吗? - Inian
2个回答

10
首先,我必须声明我无法重现您的问题,这可能取决于bash版本。
我知道两种将openssl rsautl的输出传递给base64的方法,而无需使用stdout和文件进行管道处理。

Bash进程替换

Bash能够直接将操作的输出传递给某些命令,同时程序认为它正在将输出写入文件。
echo "foo"|openssl rsautl -encrypt -pubin -inkey key -out >(base64)

命名管道

您可以使用mkfifo命令创建一个命名管道,然后像使用文件一样使用它。

mkfifo /tmp/mypipe
echo "foo" | openssl rsautl -encrypt -pubin -inkey key -out /tmp/mypipe &
base64 /tmp/mypipe
rm /tmp/mypipe

1
你的Bash进程替代命令是我一直在寻找的(尽管它要求私钥进行加密)。我想要一个可以将数据加密成base64编码字符串的一行代码。我不知道我可以通过将输出放在括号内将其重定向到另一个命令(这样它就不会创建名为base64的文件)。我最初尝试使用 |base64 而不是 >(base64),但是它没有起作用,这就是我的问题所在。 - user2565010

1
echo "foo" | openssl rsautl -encrypt -inkey rsa_key.pub -pubin | openssl base64

OpenSSL Base64会将二进制加密代码作为输入,并生成可读的Base64格式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接