如何在脚本中模拟按键? [GPG专家密钥生成]

时间:2013-05-14 09:52:29

标签: windows batch-file input gnupg

如何制作批量(或C / C ++)脚本(运行gpg命令数百次),该脚本能够模拟以下键盘输入(并且足够智能等待要求输入?)

  

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


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

  

PGP密钥的短ID是其指纹的最后8个字符。为了您的信息,PGP密钥的指纹是校验和(历史上,SHA-1)。

我对生成的PGP密钥的要求如下:

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

好。所以,我想我获得“自定义”密钥ID的解决方案是生成 lot (请注意,如果你这样做,我相信全局熵会变得非常小),并选择我喜欢的那个最多(例如,当您的电话提供商允许您在列表中选择未来的电话号码时)。

我尝试了什么

通过阅读that page in the 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)。实际上,文档说(对于Key-Usage)“允许的值是'加密','签名'和'auth'”。 cert是默认设置,但使用空白Key-Usage字段也不起作用。

我相信我必须做什么

我认为使用我想要的设置生成所有这些键的唯一方法是,没有解决方案,但模拟密钥生成就好像一个真实的人正在以交互方式运行GPG的shell。

以下是必须完成的内容的摘录:

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: […]
[…]

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

1 个答案:

答案 0 :(得分:0)

好吧,我找不到我想要的解决方案(我可以在背景中运行,而不是马车等等) - 而且我仍然愿意为了个人文化而提供更好的解决方案和答案。< / p>

无论如何,这是我提出的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}
}

这个小脚本让我得到了一大堆钥匙,其中一个钥匙我喜欢的短身份。