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使用DSA和Elgamal;选项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
手动校验