openssl 中总是“写入输出文件时出错”

openssl 中总是“写入输出文件时出错”

openssl我使用以下命令创建了一个 5 MiB 随机文件head

$ openssl enc -aes-256-ctr -pass pass:1o0SxTnYvbtjFtKLiuv3ccPebLOJiUU -nosalt < /dev/zero | head -c 5M > /mnt/pny1/file1

它创建了一个正确大小的文件,但也给出了错误消息:

error writing output file

我尝试了一下dd并得到了相同的结果:

$ openssl enc -aes-256-ctr -pass pass:1o0SxTnYvbtjFtKLiuv3ccPebLOJiUU -nosalt < /dev/zero | dd of=/mnt/pny1/file2 bs=1M count=5 iflag=fullblock
5+0 records in
5+0 records out
error writing output file
5242880 bytes (5.2 MB) copied, 0.0194212 s, 270 MB/s

openssl然后我尝试使用with覆盖循环设备cat

# openssl enc -aes-256-ctr -pass pass:1o0SxTnYvbtjFtKLiuv3ccPebLOJiUU -nosalt < /dev/zero | cat > /dev/loop0
cat: write error: No space left on device
error writing output file

总是error writing output file

为什么会出现此错误以及如何防止它?

答案1

这是 openssls 对SIGPIPE.当他们收到 5 MB 时head也会dd关闭管道。当 openssl 进程尝试写入管道时,这会EPIPE在系统调用中产生错误:write()

EPIPE    fd is connected to a pipe or socket whose reading end is closed. When this
         happens the writing process will also receive a SIGPIPE signal.

然后 openssl 由于信号而死亡,而不是正常退出。您可以在您的示例中使用以下命令进行检查:

$ openssl enc -aes-256-ctr -pass pass:password -nosalt < /dev/zero | head -c 5M >file
error writing output file
$ echo ${PIPESTATUS[@]}
1 0

$PIPESTATUS数组包含管道内进程的退出值。您会看到 openssl 进程已退出,退出代码为 1。


但是,要克服该错误,请在管道中的 openssl 之前使用head或:dd

$ head -c 5M /dev/zero | openssl enc -aes-256-ctr -pass pass:password -nosalt >file
$ echo ${PIPESTATUS[@]}
0 0

答案2

如果解密的数据太少,那么你可能会遇到这个问题。我使用了 GNU 并行实用程序。遇到这个问题(写入输出文件时出错)。通过使用 --blocksize 添加块的最小大小来修复此问题。另外,openssl 有点奇怪,它在我遇到的任何问题上都会返回此错误(解密密码错误,解密数据错误)。所以要注意。

答案3

如果其他答案不能解决您的问题,尝试填充消息到更长的长度。

使用密钥的长度或其倍数。

没有其他答案可以回答上述问题,因此我决定检查我正在编码的消息。时间很短。我用空格填充了它,直到密钥的长度,然后修复了它。

相关内容