GPG:加密管道中的数据一段时间,然后停止

GPG:加密管道中的数据一段时间,然后停止

我们有以下情况:我们想从类似文件的流(/dev/ttyACM0即串行接口)中获取数据,并使用 gpg 对其进行加密。目前,我们使用

cat /dev/ttyACM0 | gpg -e -r [keyid] --trust-model always > output_file

我们的问题是:ttyACM0 将在一定时间内传送数据,然后停止,但 ttyACM0 本身将保持原位,因此读取将继续,并且 gpg 不会终止。如果我们使用超时 ( timeout [time] cat /dev/ttyACM0 | gpg ... &) 运行整个过程并让超时终止该进程,则一些数据将丢失,并且在解密时,我们会收到一条错误消息:

gpg: block_filter 0x00005589367a73c0: read error (size=16358,a->size=16358)
gpg: block_filter 0x00005589367aab80: read error (size=13254,a->size=13254)
gpg: WARNING: encrypted message has been manipulated!
gpg: block_filter: pending bytes!
gpg: block_filter: pending bytes!

解密成功,但结尾处缺少一些数据。这可能与 GPG 以非空缓冲区终止有关。

我们如何才能让它工作而不因 gpg 缓冲而丢失一些数据?我不知道有任何 SIGXXX 可以让 gpg 完成操作、写出结果然后终止。该过程应该在 Raspberry Pi Zero 上运行,因此理想情况下它不应该比正常加密带来显着的开销,并且出于合规性原因,我们不能先将所有内容导入文件然后再加密,我们需要在从串行接口接收它时直接对其进行加密。

答案1

如果你把放在timeout管道中间,那么gpg将会干净地退出:

cat /dev/ttyACM0 | timeout ${TIMEOUT} cat | gpg -e -r ${RECIPIENT} > ${OUT_FILE}

我无法完全解释这一点,但我相信这是由于管道错误(信号)的处理/传播方式造成的。

笔记:我有问了这个问题尝试更好地理解这一点。


请注意,即使使用以下方法也会失败:

$ timeout 5 cat < /dev/urandom | gpg -e -r ${RECIPIENT} > myfile.gpg

gpg: Terminated caught ... exiting
Terminated

相关内容