
すぐに暗号化したいストリームがありますが、問題はopenssl
stdinから十分なバイトを読み取ることができる場合にのみ暗号化し、そうでなければ待機することです。
次の例を確認してください。
$ (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つのことを間違っています。
- ブロックパスワードを使用しています。 rc4などのストリームパスワードまたはCFBモードのブロックパスワード(効果的にストリームパスワードに変換)を使用する必要があります。
- エンコーディングに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として使用してください。ただし、その場合は、アプリケーションに最適なサイズを見つけるためにベンチマークする必要があります。
答え2
unbuffer
stdioバッファリングによって遅延が発生するのではなく、opensslプログラムがデータを処理する方法によって遅延が発生するため、同様の解決策は機能しません。
openssl base64
、openssl enc
デフォルトopenssl dec
のバッファサイズは8kBで、optionsを使用して指定できます-bufsize
。入力または出力がBase64の場合、opensslはBase64ライン全体を一度に処理できると予想しているため、バッファサイズは80バイト以上減りません。
… | openssl aes-256-cbc -pass pass:test -salt -bufsize 16 | …