我正在编写一个 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,我不想执行那么多磁盘写入。
我还应该指出,我想知道是否有办法在不循环多个管道的情况下做到这一点。
我相信你可以用 dd
dd 允许您从文件中读取并将输出发送到您想要指定的位置以及块大小。
从手册页
描述 复制文件,根据操作数进行转换和格式化。
Run Code Online (Sandbox Code Playgroud)bs=BYTES read and write up to BYTES bytes at a time
所以我猜
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)
| 归档时间: |
|
| 查看次数: |
1415 次 |
| 最近记录: |