如何使用GnuPG和GNU parallel做大文件并行加密?

How to do large file parallel encryption using GnuPG and GNU parallel?

我正在尝试编写一个用于存档的并行压缩/加密备份脚本 使用 GNU parallel、xz 和 GnuPG。脚本的核心部分是:

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 parallel的块大小相同(大约125M),我认为这与GnuPG对部分块加密的支持有关。我该如何解决这个问题?


仅供参考

关于随机数生成的另一个并行 gpg 加密问题

https://unix.stackexchange.com/questions/105059/parallel-pausing-and-resuming

GnuPG 不支持连接多个加密流并同时解密它们。您将不得不存储多个文件,并单独解密它们。如果我没记错的话,你的命令甚至会混淆所有 GnuPG 并行实例的输出,所以结果或多或少是随机垃圾。

无论如何:GnuPG 也负责压缩,看看 --compression-algo 选项。如果您更喜欢使用 xz,请应用 --compression-algo none,这样 GnuPG 就不会尝试再次压缩已经压缩的消息。加密得到 CPU-instructions ourdays 的大量支持,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.

https://answers.launchpad.net/duplicity/+question/296122

编辑:不。可以同时 运行 多个 gpg v2 实例,gpg-agent 没有任何问题。

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
需要

-N1 来确保我们一次传递一条记录。 GnuPG 不支持解密多个合并的记录。