Blog

home category

非对称加密算法RSA和应用IV - GnuPG

30 Jun 2014

GnuPG(GNU Privacy Guard, GPG)是一种加密软件,是PGP(Pretty Good Privacy)满足GPL协议的替代物,用于加密、数字签名及产生非对称密钥。GnuPG依照OpenPGP(IETF)技术标准设计。由于GPG2.0使用的新软件架构不支持某些用途,因此GPG存在两个分支版本1.x与2.0

生成密钥

生成密钥操作简单,只需按照提示一步步选择

gpg --gen-key

创建密钥

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)
Your selection?

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)

提示选择密钥种类,其中选项1默认,加密和签名都使用RSA;选项2使用DSAElgamal;选项3和4仅生成签名;直接回车选择默认

之后提示选择RSA密钥长度,默认2048位。之前提到1024位密钥在768位被破解后已受到威胁,而过长密钥需要更长的加解密时间,根据需要选择。直接回车,接着需选择密钥有效期

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)

Key expires at 2014年07月05日 星期六 17时01分08秒 CST
Is this correct? (y/N)

默认无过期时限,如果无法保证私钥安全,可选择过期时限。输入数字,可跟随w m y设置密钥有效的天数、周、月或年。输入错了?回车后还有确认的步骤。接着需填写个人信息,用于辨认密钥所有者(签名)。需输入真实姓名,邮箱地址和注释

GnuPG needs to construct a user ID to identify your key.

Real name: Your Name
Email address: [email protected]
Comment: Tutorial key
You selected this USER-ID:
    "Your Name (Tutorial key) <[email protected]>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?

结束后提示是否需修改信息,输入O确认。之后立即会跳出一个对话框要求输入用于保护私钥的密码,称为通行句。通行句使用户可以使用与此密钥有关的各项功能。输入结束后系统开始生成密钥,过程中需生成一些随机数,要求做一些随机动作提高系统随机数的自由度,保证每个密钥都不相同。一段时间后,生成密钥过程完成,返回一些信息,如

gpg: ${HOME}/.gnupg/trustdb.gpg: trustdb created
gpg: key 35D7ED67 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   2048R/35D7ED67 2014-06-30
      Key fingerprint = 62F1 855C 6C03 6D67 0D8F  9FB1 7A2B 8CED 35D7 ED67
uid                  Yichen Zhao (First) <[email protected]>
sub   2048R/53055D3E 2014-06-30

其中35D7ED67是公钥签名(uid)的哈希值,可用于替代uid来辨认公钥。为方便使用,添加环境变量export GPGKEY=35D7ED67

生成取消密钥证书

作废公钥时需使用取消密钥证书。建议在生成密钥同时制作取消密钥证书,并将取消密钥证书安全存放。使用时无需通行句即可作废公钥,方便,但泄漏后任何人都可将你的公钥作废

gpg --output revoke.txt --gen-revoke $GPGKEY

要使用以上命令,必须已存在公钥。整个过程也有向导,需选择取消公钥原因和输入可选的其他描述内容。之后会要求输入密钥的通行句,完成验证后便会导出证书到revoke.txt。使用时导入revoke.txt并重新上传公钥至公钥服务器(导入公钥和上传公钥见下文)

导出密钥

公钥使用二进制文件保存(~/.gunpg/pubring.gpg),可转换为ASCII导出,用于上传至公钥服务器

gpg --armor --output ~/mykey.txt --export $GPGKEY

也可输出私钥,使用--export-secret-keys

上传公钥

公钥服务器专门存储用户公钥,且会相互同步,尽可能使用户公钥出现在所有公钥服务器上。可将自己的公钥上传至某个公钥服务器(如Ubuntu keyserver),方便其他用户下载使用,也可以手动上传到多个公钥服务器加快同步进度

gpg --send-keys --keyserver keyserver.ubuntu.com $GPGKEY

也可通过浏览器直接上传之前导出的公钥。由于任何人都可以向公钥服务器上传公钥,因此通常将公钥指纹(fingerprint)公布,方便使用者验证

导入公钥

可通过公钥服务器查找任何一份公钥

# 查找
gpg --keyserver keyserver.ubuntu.com --search-keys $GPGKEY

# 从服务器导入公钥
gpg --keyserver keyserver.ubuntu.com --recv $GPGKEY

要使用别人的公钥,需先导入至密钥数据库。首先获取对方的公钥,然后运行

gpg --import public-key.txt

默认从stdin读入

密钥管理

进入界面后可输入help查看可操作内容。常用命令

gpg --list-keys

/**
${HOME}/.gnupg/pubring.gpg
---------------------------
pub   2048R/35D7ED67 2014-06-30
uid                  Yichen Zhao (First) <[email protected]>
sub   2048R/53055D3E 2014-06-30
**/

列出所有密钥数据库中信息,返回信息包括公钥、私钥特征和uid

gpg --list-sigs
gpg --fingerprint
gpg --list-secret-keys

其他查看信息的命令

  • gpg --delete-keys $GPGKEY,删除指定uid的公钥
  • gpg --delete-secret-keys $GPGKEY,希望删除自己的公钥,需先删除私钥
  • gpg --edit-key $GPGKEY,修改密钥指纹、签名等使用

完成以上操作,便可使用密钥加密和解密信息。

加密和解密

操作

gpg --recipient $GPGKEY --output demo.en.txt --encrypt demo.txt

将demo.txt使用公钥加密后以demo.en.txt输出。

gpg --output demo.de.txt [--decrypt] demo.en.txt

解密,接收demo.en.txt,解密以demo.de.txt输出。

签名和校验签名

若并不希望加密,仅希望给文件签名证明文件确实是我发的,使用

gpg --sign demo.txt

导出的签名文件demo.txt.gpg将被压缩,是不可读的。

gpg --clearsign demo.txt

可导出可读的签名文件,文件名demo.txt.asc。

gpg --detach-sign demo.txt

推荐此方式,将签名和原文件分开保存,保持原文件清晰。导出独立的签名文件demo.txt.sig是二进制文件,添加--armor导出ASCII形式。

gpg --local-user [sender-uid] --recipient $GPGKEY --armor --sign \
    --encrypt demo.txt

若希望同时签名和加密,执行集合了加密和签名选项的命令。若文件同时加密和签名,校验签名在解密过程中完成。

gpg --verify demo.txt.sig

手动校验

参看