如何将管道拆分为 16 字节序列?

tjb*_*jbp 3 bash pipe

我正在编写一个 bash 脚本来自动解密某个文件;然而,该文件以 16 字节块加密,而不是简单地整体编码。

这里有一些伪代码来简要解释我为什么要这样做:

cat encrypted.bin | \
buffer and output 16 bytes when asked | \
openssl --args >> decrypted.bin
Run Code Online (Sandbox Code Playgroud)

我基本上需要打开和关闭管道以拆分数据,并且不确定如何在 bash 中完成此操作。我看过split,但由于加密文件可能有几个 GB,我不想执行那么多磁盘写入。

我还应该指出,我想知道是否有办法在不循环多个管道的情况下做到这一点。

Bit*_*Nix 7

我相信你可以用 dd

dd 允许您从文件中读取并将输出发送到您想要指定的位置以及块大小。

从手册页

描述 复制文件,根据操作数进行转换和格式化。

   bs=BYTES
          read and write up to BYTES bytes at a time
Run Code Online (Sandbox Code Playgroud)

所以我猜

dd if=encrypted.bin bs=16|openssl --args >> decrypetd.bin
Run Code Online (Sandbox Code Playgroud)

应该为你工作。虽然我没有用 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
Run Code Online (Sandbox Code Playgroud)

  • 小心使用`dd`。不要管它。http://unix.stackexchange.com/questions/17295/when-is-dd-suitable-for-copying-data-or-when-are-read-and-write-partial (2认同)

归档时间:

查看次数:

1415 次

最近记录:

11 年,12 月 前