如何使用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 不支持解密多个合并的记录。
我正在尝试编写一个用于存档的并行压缩/加密备份脚本 使用 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 不支持解密多个合并的记录。