opensslで常に「出力ファイルの書き込みエラー」が発生する

opensslで常に「出力ファイルの書き込みエラー」が発生する

openssl次のコマンドを使用して5MiBランダムファイルを作成しました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その後、次のようにループデバイスを上書きしようとしました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ペアです。また、SIGPIPE5MBを受け取ったらパイプを閉じます。 openssl プロセスがパイプに書き込もうとすると、システムコールにエラーが発生します。headddEPIPEwrite()

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の前にまたはを使用してくださいheaddd

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

答え2

データ量が少なすぎると、この問題が発生する可能性があります。私はGNUパラレルユーティリティを使用しました。この問題が発生しました(出力ファイルへの書き込み中にエラーが発生しました)。 --blocksizeを使用してブロックの最小サイズを追加してこの問題を解決します。また、opensslは少し奇妙です。私が持っているすべての問題に対してこのエラー(無効な復号化、誤った復号化データ)を返します。だから注意してください。

答え3

他の回答でも問題が解決しない場合メッセージを記入してくださいより長い長さに。

キーの長さまたはその倍数を使用してください。

上記の質問には他に答えがなかったので、私がエンコードしているメッセージを確認してみることにしました。時間が短いです。キーの長さだけスペースを埋めることで問題を解決しました。

関連情報