OpenSSLバッファリングの問題

OpenSSLバッファリングの問題

すぐに暗号化したいストリームがありますが、問題はopensslstdinから十分なバイトを読み取ることができる場合にのみ暗号化し、そうでなければ待機することです。

次の例を確認してください。

$ (echo Hello world; sleep 3) | cat -
Hello world
$ (echo Hello world; sleep 3) | openssl base64 | openssl base64 -d
Hello world

最初の場合は出力がすぐに表示されますが、2番目の場合は3秒待つ必要があります。

この動作を防ぐにはどうすればよいですか?試してみましたが、unbuffer -pこのstdbuf -i0場合は機能しません。

より明確にするためにこれを使用する方法を説明します(このコマンドはネットワーク経由でオーディオストリームを送信するために使用されます)。

### Not encrypted: works well
# Server
nc -ul 1234 | gst-launch fdsrc ! opusparse ! opusdec ! fdsink | pacat --latency-msec=20
# Client
parec --latency-msec=20 | gst-launch fdsrc ! audioparse rate=48000 channels=2 ! opusenc ! fdsink | nc -u localhost 1234

### Encrypted: doesn't work
# Server
nc -l -u 1234 | openssl aes-256-cbc -pass pass:test -salt -d | gst-launch fdsrc ! opusparse ! opusdec ! fdsink | pacat --latency-msec=20
# Client
parec --latency-msec=20 | gst-launch fdsrc ! audioparse rate=48000 channels=2 ! opusenc ! fdsink | openssl aes-256-cbc -pass pass:test -salt | nc -u localhost 1234

ベストアンサー1

あなたの例では、2つのことを間違っています。

  1. ブロックパスワードを使用しています。 rc4などのストリームパスワードまたはCFBモードのブロックパスワード(効果的にストリームパスワードに変換)を使用する必要があります。
  2. エンコーディングにbase64を使用しています。 Gillesが述べたように、opensslのbase64には80バイトのバッファが必要です。 base64エンコーディングを削除すると、期待した動作が表示されます。

aes-128-cfb:

(echo Hello world ; sleep 3) | openssl enc -aes-128-cfb -pass pass:test -bufsize 1 | openssl enc -d -aes-128-cfb -pass pass:test -bufsize 1

rc4:

(echo Hello world ; sleep 3) | openssl enc -rc4 -pass pass:test -bufsize 1 | openssl enc -d -rc4 -pass pass:test -bufsize 1

ただし、バッファサイズを小さくすると、暗号化操作を実行するのに必要なCPU時間が長くなることを指摘する必要があります。

% time sh -c 'dd if=/dev/urandom bs=8k count=1 | openssl enc -rc4 -pass pass:test | openssl enc -d -rc4 -pass pass:test > /dev/null'
1+0 records in
1+0 records out
8192 bytes transferred in 0.001175 secs (6972350 bytes/sec)
sh -c   0.01s user 0.01s system 167% cpu 0.009 total
% time sh -c 'dd if=/dev/urandom bs=8k count=1 | openssl enc -rc4 -pass pass:test -bufsize 1 | openssl enc -d -rc4 -pass pass:test -bufsize 1 > /dev/null'
1+0 records in
1+0 records out
8192 bytes transferred in 0.001070 secs (7655913 bytes/sec)
sh -c   0.02s user 0.03s system 187% cpu 0.027 total

8Kバッファを使用した場合、ユーザー時間とシステム時間はそれぞれ0.01秒しかかからなかったが、使用時間は-bufsize 1それぞれ0.02秒、0.03秒で合計5倍増加した。 CPU パーセント報告値も 20 増加しました。これが問題にならない場合は、bufsizeを1として使用してください。ただし、その場合は、アプリケーションに最適なサイズを見つけるためにベンチマークする必要があります。

おすすめ記事