PGP简易原理与入门

PGP全称为Pretty Good Privacy,主要应用于信息加密和数字签名等领域。而OpenPGP则是一个后来所发布的标准,所有PGP类型的程序全都需要遵守OpenPGP标准。PGP中有很多商业与开源的程序,GnuPG简称GPG在开源软件中最为知名,主要使用于Linux平台。

在下面的内容中,简要谈一下PGP的原理,和如何使用GPG在Ubuntu上。

PGP公钥加密

在了解公钥加密之前,需要懂一点密码学的历史。

在早期的密码学发展过程中,人们经常使用对称加密(Symmetric-key algorithm),“对称”也就是指加密和解密的过程中使用的密钥是相同的,虽然可以保证加密和解密的速度很快,但是如何安全的传递密钥则变成了一个很严重的问题,在传递密钥过程中需要保证不能泄露给敌方,一旦泄露,敌方就可以直接破解密文(密码学中使用Ciphertext作为术语)。

到了现代密码学,则有了非对称加密(Asymmetric cryptography),也被称之为公钥加密(Public-key cryptography),非常好理解,也就是指加密和解密过程使用了不同的密钥,公钥用于加密可以公开,私钥用于解密不能对外。使用公钥对明文(密码学中使用Plaintext作为术语)进行加密,只能用对应的私钥才能解密得到原本的明文。甚至连最初用来加密的公钥也不能用来解密。耳熟能详的RSA,也就是公钥加密算法的代表之一了。具体原理就…

GPG的使用

成功安装完GnuPG后,后面主要讲,生成密钥,导出密钥,导入密钥,加密与解密,上传密钥,密钥管理等一系列GPG的核心操作。

生成密钥

这个只需要这一行,但是之后会有很多选项

gpg --gen-key

在生成密钥的过程中会有很多选择,人生中也是一样,选择默认就好了hhh:

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)

Requested keysize is 2048 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) 
Is this correct? (y/N)

接下来需要填写个人信息(注释是可以为空)和设置一个密码:

Real name:
Email address:
Comment:

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?
You need a Passphrase to protect your secret key.

生成密钥是需要一段时间的,一些随机的举动可以帮助收集信息熵(香农)。

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy!

生成完毕之后,会看到自己的公钥、私钥和指纹等信息。

导出密钥

如果想到查看或者导出公钥,命令行中只需要输入一句。

# ASCII-marmored by adding --armor option
gpg --armor --export [UID]

gpg --armor --export [UID] > pubkey.asc

输出文件会像下面这样(我个人的PGP公钥):

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1

mQENBFnieT4BCADaCZpnljFhuyomf1LHSYlc2bxvzqgEUtmWVURVLeuXYX8jeNe8
+Vh4uyf5egNgseOVj09f5vgJO1vKYGhMrgEVKK5Uj92SzAF2DKXo/A1K8+aEQrtk
+l69DZXId7bL28dg/hUN93Zxynd2nuGjqa4W5u8DlYZoZFFkZfSthDQaqGfOyOLq
Qel41AKaYa76TdxzCbdPp1pbVb/3Yx/fdMNx4fgG7IbjKYdI8Q3+9dxDX0eeOb7n
ilirRomKpjcptxp59xVGwugcl+RbCJCuAQXEe2gYYXR2LpV+kftTLCNM9nXhwUDb
8hZRI6wRj2jl1ERY+b2fLhhlx8Yp6aMoJW73ABEBAAG0JUppbndlaSBXYW5nIDww
amlud2VpMC53YW5nQGdtYWlsLmNvbT6JATgEEwECACIFAlnieT4CGwMGCwkIBwMC
BhUIAgkKCwQWAgMBAh4BAheAAAoJEI4u2fW6I1X8UlQH/iEdvyxiCbzv0fZ6cRSD
QnSdGY+uhM9wm/WWVEu+BHMllWxEfD0Fx8h9FVgXLW0IrwDXo1mbUB2nniOITmbN
LbIV+gsi2e2gfGtsLuyR1Cvld2VY0gZV+AJxfJ/Np6s89HN1noSFCBH8uvr2M8AS
zG7Mc47RNpyhz3ksuI2UE56acS+tXvoJJK9f3uaJ6lPldE/x7Y+QWkTXdPPD4lzG
Pk+r/52dgPYCrHtdBwkkpa2FbMf3DlVPCfHOtSN4Hin+v6dncWHcq9nm9jkswKO2
fAKKFcxni0FKnooXU/QARcW1krHa3EZr+7hza9qGzzoIPaWRA61djnHE7qCWINDe
eU25AQ0EWeJ5PgEIALegujdjgWQMruE61++15UA6nb30lu36NY3MBh8pyOZ3wRcj
J9XEgUViUL+oS/zz1rbBos62NS7ST5AyKQqmGskc10Xb7Oy4/7hhYg16bwyTnyJd
imMY8Y68rQY39fP8dS4A9eF7X++yHsV6iVrWmsbKa4gRaznq6nsYgr2tu2l5XDSw
81yyY36ITOxZ+/V4BulaeD+mniJSTVQ+apVmZwbvL5XIHrauYEUCL2nBPApDWJKT
vypVmCoA8qI9N5TvwdfPe8ii7diggewESZ+q2dohP2l02poiWcCF+1UriPKyEgx0
U3+8xBc0lxC9L2SMzU3QF4qc64v3za9GNjnYA88AEQEAAYkBHwQYAQIACQUCWeJ5
PgIbDAAKCRCOLtn1uiNV/F/NCADBp3awfgykYSuES65pXZxdjE0Gcv5mygUIytM4
LYZmoOdnlkG3hiUxuv2hW2L6mqiAEM2h6nBPZg5FIRLsDo16LfZgvsDfx/4cKXLE
gp//nnTvdydJI9OzGky1uBJ2/IkXOzgK4JpY7PE6RstiA8dZ5ngDReTJZD9HX3rt
OwAzEg6qvUW/e+wW6T740VBX/45gIQmMCL8oqTy4q2okcO1i7SD3g0U+/7r0tKlb
1tbOJqBIdr/n5s/myB3+MGV5mvcX9B61INWjAu5U06lqZnv24Vh1YV2kXqijc7sQ
cG7VVN+1ohHIRn597pnTjdgFd2/ctCZb5bnX8qqkuUAqP4nx
=GuaK
-----END PGP PUBLIC KEY BLOCK-----

导入密钥

主要用于导入别人的公钥,很好理解,跟导出命令类似。

gpg --import pubkey.asc

加密与解密

对于想要加密的文本plain.txt,使用以下命令进行加密:

gpg --encrypt --armor < plain.txt > cipher.txt --recipient [UID]

这样会得到一个cipher.txt文件。

对于想要解密的文本cipher.txt,使用以下命令进行解密:

gpg --decrypt cipher.txt

密钥服务器

密钥服务器是一个用于存储和公开密钥的场所,用户只需要上传自己的公钥,然后所有的密钥服务器就都会包含上传完的公钥。下面的命令使用的是hkp://pgp.mit.edu的服务器。

gpg --keyserver hkp://pgp.mit.edu --send-keys [UID]

如果想要查找并获得别人的公钥,可以使用以下命令:

gpg --keyserver hkp://pgp.mit.edu --search-keys [UID]
gpg --keyserver hkp://pgp.mit.edu --recv-keys [KeyID]

可以通过检查指纹,来验证公钥的真实性。有很多人在自己的博客上,只写了指纹,说明他们的公钥应该在密钥服务器就可以获得。

gpg --fingerprint [UID]

密钥管理

密钥管理这里主要就是几个操作(查看、删除、编辑)。

# List information about keys
gpg --list-keys
# Display key fingerprints
gpg --fingerprint
# Remove a public key
gpg --delete-key [UID]
# Remove a public and private key
gpg --delete-secret-key [UID]
# Presents a menu for operating on keys
gpg --edit-key [UID]

Read more: