題 使用管道的gpg對稱加密


我正在嘗試生成密鑰來鎖定我的驅動器(使用帶有LUKS的DM-Crypt)從中提取數據 /dev/random 然後使用GPG加密。

在我正在使用的指南中,它建議使用以下命令:

dd if=/dev/random count=1 | gpg --symmetric -a >./[drive]_key.gpg

如果您在沒有管道的情況下執行此操作並將其提供給文件,則會彈出一個(n?)curses提示符,以便您輸入密碼。但是,當我輸入數據時,它會重複以下消息四次並凍結在那裡:

pinentry-curses: no LC_CTYPE known assuming UTF-8

它還說 can't connect to '/root/.gnupg/S.gpg-agent': File or directory doesn't exist但是我假設這與它沒有任何關係,因為它甚至在輸入來自文件時也會出現。

所以我想我的問題可以歸結為:有沒有辦法迫使gpg從命令行接受密碼,或者用其他方式讓它工作,或者我必須從中寫入數據 /dev/random 到一個臨時文件,然後加密該文件? (據我所知,由於我在LiveCD上執行此操作並且尚未創建交換,因此應該沒有辦法將其寫入磁盤。)


4
2018-06-03 03:49


起源


GPG的 --no-use-agent 應告訴gpg不使用代理程序,並接受在終端中鍵入的密碼...至少在gpg 1.x中,該版本似乎仍在當前的Ubuntu和Mint版本中使用 - Xen2050


答案:


確保你擁有tty:

# ls -l $(tty)
crw--w----. 1 foo tty 136, 0 Mar  1 16:53 /dev/pts/0
# chown root $(tty)

設置GPG_TTY:

# export GPG_TTY=$(tty)

gpg / pinentry應該在這些步驟之後工作。


10
2017-07-18 20:25



非常感謝!這幫助我手動管道gpg,並修復了我在keybase命令行客戶端管道到gpg幕後的問題。 - ajk


嗯...最後,我決定只寫出一個文件,然後對該文件進行加密,假設由於沒有交換,並且文件系統處於ram狀態,它將在下一次關閉時死亡。

但是,對於任何發現這個問題的人的參考(以及鞏固我的想法),我會寫下一個我發現在創建initramfs後很長時間才能工作的程序。

您需要做的是在開始使用外部pinentry程序輸入密碼之前返回到gpg版本。據我所知,這發生在版本2中。假設您當前正在安裝Linux,您將需要獲得靜態編譯的gpg <2.0版本。

使用Gentoo非常容易,只需要以下命令:

USE="static" emerge -a1 "<gnupg-2"

只要確保使用 ldd 在將它們複製到您的拇指驅動器之前確認它們實際上是靜態的,以便您可以在安裝期間使用它們。

在其他發行版上,我建議你看看@你的包管理器,如果這不起作用,那麼我會嘗試下載源代碼,並從中進行編譯。


3
2018-06-11 23:13