1

如何制作gpg能够模拟以下键盘输入(并且足够智能以等待输入被询问)的批处理(或 C/C++)脚本(运行数百次命令)?

8↵</kbd>
S↵</kbd>E↵</kbd>Q↵</kbd>
4096↵</kbd>
0↵</kbd>y↵</kbd>
Jean Dupont↵</kbd>
↵</kbd>
born 1970-01-01 in Paris, France↵</kbd>
O↵</kbd>
correct horse battery staple↵</kbd>
correct horse battery staple↵</kbd>


我想为自己生成一个 PGP 密钥对(用于私人通信),但我希望密钥的短 ID 易于记忆,FFFFFFFE例如。

PGP 密钥的短 id 是其指纹的最后 8 个字符。供您参考,PGP 密钥的指纹是校验和(历史上为 SHA-1)。

我对生成的 PGP 密钥的期望如下:

  • 它的短 id(见上文)必须易于记忆。
  • 我希望我的钥匙是“不寻常的”,所以我必须使用--expert模式。
    • 默认情况下,生成的密钥既可以加密(E)也可以签署其他人的密钥(C,“cert”),但我希望我的密钥签署其他人的密钥。

好的。所以,我想我获得“自定义”密钥 id 的解决方案是生成大量密钥(请注意,如果你这样做,我相信全局熵会非常减少),然后选择我最喜欢的一个(比如当你的电话提供商允许您在列表中选择您未来的电话号码)。

我试过的

通过阅读doc 中的该页面,我想我可以使用gpg --batch --expert --gen-key gpg-keygen-settings.txt以下设置文件:

Key-Type: RSA
Key-Length: 4096
Key-Usage: cert
Name-Real: Jean Dupont
Name-Comment: born 1970-01-01 in Paris, France
Expire-Date: 0
Passphrase: correct horse battery staple
%commit
%echo Done.

但它不会让我创建一个仅用于签署其他人的密钥 ( cert) 的密钥。实际上,文档说 (for Key-Usage) “<em>允许的值是 'encrypt'、'sign' 和 'auth'</em>”。cert是默认值,但使用空白Key-Usage字段也不起作用。

我认为我必须做的事

我认为使用我想要的设置生成所有这些密钥的唯一方法是,没有解决方案,只能模拟密钥生成,就好像真人在交互式运行 GPG 外壳一样。

以下是必须做的摘录:

C:\> gpg --gen-key --expert
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
Your selection? 8

Possible actions for a RSA key: Sign Certify Encrypt Authenticate
Current allowed actions: Sign Certify Encrypt

   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection?

[…]

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: […]
[…]

所以,呃。非常感谢。奇怪的要求,我知道。轻笑

4

1 回答 1

0

好吧,我没有找到我正在寻找的解决方案(我可以在后台运行的东西,而不是错误的等等)——我仍然对我的个人文化持开放态度,以获得更好的解决方案和答案。

无论如何,这是我想出的AutoHotkey脚本。很脏。我编写了一点代码,然后放弃并使用AutoScriptWriter工具录制宏,并调整代码以满足我的需要(哈哈)。最烦人的是学习如何与 GPG-Agent (pinentry) 交互。

Loop 100
{
    Run, cmd.exe /k "gpg --expert --gen-key"
    WinWait, C:\Windows\SYSTEM32\cmd.exe - gpg  --expert --gen-key, 
    IfWinNotActive, C:\Windows\SYSTEM32\cmd.exe - gpg  --expert --gen-key, , WinActivate, C:\Windows\SYSTEM32\cmd.exe - gpg  --expert --gen-key, 
    WinWaitActive, C:\Windows\SYSTEM32\cmd.exe - gpg  --expert --gen-key, 

    Sleep 1500

    Send +8{Enter}
    Send S{Enter}C{Enter}Q{Enter}
    Send +4+0+9+6{Enter}
    Send +0{Enter}o{Enter}
    Send Jean Dupont{Enter}
    Send {Enter}
    Send born {Shift Down}1970{Shift Up}6{Shift Down}01{Shift Up}6{Shift Down}01{Shift Up} in Paris, France{Enter}O{Enter}
    ; The "6" keypress above is to make a - on French AZERTY keyboards.

    WinWait, pinentry, 
    IfWinNotActive, pinentry, , WinActivate, pinentry, 
    WinWaitActive, pinentry,

    Send, correct horse battery staple{ENTER}
    Sleep 1500
    Send, correct horse battery staple{ENTER}
    Sleep 10000
    ;Send exit{Enter}
}

这个小脚本让我得到了一大堆密钥,其中一个有一个我喜欢的短 id。

于 2013-05-14T19:51:53.050 回答