如何使用GnuPG和GNU并行进行大文件并行加密?
我正在尝试使用GNU parallel,xz和GnuPG编写一个并行压缩/加密备份脚本,用于归档 。核心部分脚本的是:如何使用GnuPG和GNU并行进行大文件并行加密?
tar --create --format=posix --preserve-permissions --same-owner --directory $BASE/$name --to-stdout . \
| parallel --pipe --recend '' --keep-order --block-size 128M "xz -9 --check=sha256 | gpg --encrypt --recipient $RECIPIENT" \
| pv > $TARGET/$FILENAME
没有GnuPG的加密,它的伟大工程(解压缩和解压的作品), 但加入并行加密后,它的失败,并提示以下错误:解密:
[don't know]: invalid packet (ctb=0a)
gpg: WARNING: encrypted message has been manipulated!
gpg: decrypt_message failed: Unexpected error
: Truncated tar archive
tar: Error exit delayed from previous errors.
由于未压缩的大小与gnu并行的块大小(大约125M)相同,因此我认为它与GnuPG支持部分块加密有关。我怎么解决这个问题?
FYI
约随机数生成
https://unix.stackexchange.com/questions/105059/parallel-pausing-and-resuming
包
tar --create --format=posix --preserve-permissions --same-owner --directory $BASE/$name --to-stdout . |
parallel --pipe --recend '' --keep-order --block-size 128M "xz -9 --check=sha256 | gpg --encrypt --recipient $RECIPIENT;echo bLoCk EnD" |
pv > $TARGET/$FILENAME
拆开
cat $TARGET/$FILENAME |
parallel --pipe --recend 'bLoCk EnD\n' -N1 --keep-order --rrs 'gpg --decrypt | xz -d' |
tar tv
需要以确保我们一次只传递一条记录。 GnuPG不支持解密多个合并记录。
的GnuPG不支持级联多个加密数据流,并在一次解密他们的另一个平行GPG encrption问题。您将不得不存储多个文件,并分别对其进行解密。如果我没有弄错,你的命令甚至会混合所有并行GnuPG实例的输出,所以结果或多或少是随机垃圾。
无论如何:GnuPG还负责压缩,看看--compression-algo
选项。如果您更喜欢使用xz
,请应用--compression-algo none
,这样GnuPG不会尝试再次压缩已压缩的消息。加密有CPU指令大量支持我们今天,xz -9
实际上可能比加密更加时间密集(虽然我没有基准测试)。
哇!很好的回答和问题编辑thx。这就是我想知道的。我不知道gpg关心的压缩问题,我会在我的工作上尝试'--compression-algo none'。 正如你所说。几十兆字节的xz -9是一个比gpg encrption大的过程,但gpg过程也不是微不足道的时间。无论如何,我会报告两个测试执行时间。 –
也许你也可以看看Facebook的新zstd算法,如果你能够获得足够新的软件支持,一些基准测试表明,在竞争压缩比率上CPU性能优越。也许没有达到'xz -9',但是实现的计算开销要小得多。 –
是的,我已经花了一些时间在该管道进程上应用Facebook的全新zstd算法,但是zstd的进程创建行为看起来与xz,gzip不同。所以我成功创建了一个并行压缩的zstd arhive文件,但它的压缩率和时间比旧的'xz -9'设置更差。它看起来需要更多的研究。 –
that's mainly a gpg issue. gpg does not support multithreading and probably never will. you can search the web about the why.
it even got worse with gpg v2: you cannot even run multiple gpg v2 instances in parallel because they all lock the gpg-agent which is now doing all the work........ maybe we should look for an alternative when doing mass encryption.
从技术上讲,这涉及另一个问题:OpenPGP指定使用不支持多线程加密的CFB模式变体,因此您必须启动多个单独的加密流(您已经这样做)。第二个引号是可以通过运行多个线程或实例来解决的,当然(如果不支持,这是GnuPG的限制)。 –
感谢您的评论。我会测试并报告你的命令 –
@Old Tange:我不知道'--rrs'。使用自定义分隔符是个好主意。有一件事我不能在你的命令中得到它是'-N1'选项。这个选项在这种情况下做了什么?手册页说*与-pipe一起使用-N是要读取的记录数。这比--block。* –
thx稍微慢一些,以便快速回答。只是好奇如果我错过'-N1'选项,平行传递多条记录到管道? –