パイプを16バイトのシーケンスに分割するには?

パイプを16バイトのシーケンスに分割するには?

特定のファイルを自動的に復号化するbashスクリプトを作成しています。ただし、ファイルは単に全体をエンコードするのではなく、16バイト単位で暗号化されます。

これを行う理由を簡単に説明する疑似コードは次のとおりです。

cat encrypted.bin | \
buffer and output 16 bytes when asked | \
openssl --args >> decrypted.bin

データを分割するには、本質的にパイプを開閉する必要がありますが、bashでこれを行う方法がわかりません。調べたところ、split暗号化されたファイルが数GBになる可能性があるので、それほど多くのディスクを書きたいとは思わない。

また、複数のパイプで繰り返さずにこれを行う方法があるかどうか疑問に思います。

ベストアンサー1

私はあなたが使用できると信じていますdd

ddを使用すると、ファイルから読み込み、ブロックサイズを指定したい場所に出力を送信できます。

マニュアルページから

説明ファイルをコピーし、オペランドに基づいて変換し、フォーマットします。

   bs=BYTES
          read and write up to BYTES bytes at a time

だから私の考えでは

dd if=encrypted.bin bs=16|openssl --args >> decrypetd.bin

あなたのために働く必要があります。 opensslでテストしていませんが。

修正するjordamnのコメントに基づいて(jordamnに感謝)

インラインモードはすべてをopensslに直接転送するのではなく、16個のチャンクをパイプに転送します。

#Get the file size in bytes
total=`ls -l encrypted.bin|awk '{print $5}'`
echo  $total;
ret=0;
i=0;
counter=0;
while [ $counter -lt $total ]
do
   #counter to know how many block we read
   counter=$(($i * 16))
   #skip is the number of block based on our setting to skip
   dd if=encrypted.bin skip=$i ibs=16 bs=16 count=1 status=none |openssl --args >> decrypit.bin
   i=$(($i+1))
done

おすすめ記事