http://linux.chinaunix.net/techdoc/system/2009/04/30/1109541.shtml
一、GnuPG的简介
我们在网上的发送的邮件是明文的,可以被截获、被我们的服务商获得、甚至可以被搜索出来。这是很恐怖的事情,如果是一般嘘寒问暖的信也就罢了,若是私秘信件就危险了。所以呢,加密也就很有必要了!!
我这里所要说的PGP是比较成熟的加密算法(但还没有成为标准),由于PGP算法太安全(破解它需要3亿年),属于美国政府严禁传入中国的计算机产品。我
们现在能够得以使用GnuPG(它是PGP的开源产品),是要感谢GNU和自由软件运动,这也是我们推崇开源运动的原因!!
二、准备工作
我的学习环境:
OS:CentOS5 linux
软件:gpg (GnuPG) 1.4.5(一般linux系统都会自带)
支持的算法:
公钥:RSA, RSA-E, RSA-S, ELG-E, DSA
对称加密:3DES, CAST5, BLOWFISH, AES, AES192,
AES256, TWOFISH
散列:MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512,
SHA224
压缩:不压缩, ZIP, ZLIB, BZIP2
关于PGP的win下的应用可以查看http://www.pgp.org.cn/index.php
就是PGP中国,那里有有详尽的学习资料。
三、操作流程(蓝色字标识是我的注释)
1、生成KEY
代码如下:
$gpg --gen-key
gpg (GnuPG) 1.4.5; Copyright (C) 2006 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.
请选择您要使用的密钥种类:
(1) DSA 和 ElGamal (默认)
(2) DSA (仅用于签名)
(5) RSA (仅用于签名)
您的选择? (在此输入选项1、2、5,选1即可,回车)
DSA 密钥对会有 1024 位。
ELG-E 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048)(直接输入4096即可)
......
请设定这把密钥的有效期限。
0 = 密钥永不过期
= 密钥在 n 天后过期
w = 密钥在 n 周后过期
m = 密钥在 n 月后过期
y = 密钥在 n 年后过期
密钥的有效期限是?(0) (输入密钥的有效期,一般0即可)
......
以上正确吗?(y/n) (回答y即可)
您需要一个用户标识来辨识您的密钥;本软件会用真实姓名、注释和电子邮件地址组合
成用户标识,如下所示:
“Heinrich Heine (Der Dichter) ”
真实姓名: (输入你的姓名,如张三,允许汉字)
电子邮件地址: (输入你的邮箱地址,如abc@gmail.com)
注释: (输入你的备注,比如你这个邮箱的用途之类的,可以不填写)
......
更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?(输入O)
您需要一个密码来保护您的私钥。
请输入密码: (输入一个密码,当你使用你的私钥解密、签名的时候使用)
再输入一次: (呵呵,不用说了吧)
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
+++++.++++++++++.++++++++++++++++++++++++++++++++++++++++
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
++++++++++++++++++++.+++++.+++++++++++++++...++++++++++++
(在这个过程中随机敲一些字母数字,或者干脆不要管它了,去作其他的事)
++++++++++++++++++++.+++++.+++++++++++++++...++++++++++++
gpg: 密钥 xxxxxxxx 被标记为绝对信任
公钥和私钥已经生成并经签名。
gpg: 正在检查信任度数据库
gpg: 需要 3 份勉强信任和 1 份完全信任,PGP 信任模型
gpg: 深度:0 有效性: 3 已签名: 0 信任度:0-,0q,0n,0m,0f,3u
pub xxxxx/xxxxxxxx 2007-05-20
密钥指纹 = xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
uid 张三 (张三的私人邮箱)
sub xxxxx/xxxxxxxx 2007-05-20
注:生成的key会保存在home/.gnupg/目录下,如:公钥文件pubring.gpg,私钥文件secring.gpg
2、发布公钥
代码:
$ gpg --export -a -o filenamepub.asc (导出你的公钥)
$ gpg --export-secret-keys -a -o filenamesec.asc (导出你的私钥,留作备份)
$ gpg --list-key(列出你的公钥,记下你的KEY,就是下面红色标识部分)
pub xxxxx/xxxxxxxx 2007-05-20
uid 张三 (张三的私人邮箱)
sub xxxxx/xxxxxxxx 2007-05-20
$ vi ~/.gnupg/gpg.conf
......
keyserver wwwkeys.nl.pgp.net(添加该行)
......
$ gpg --keyserver wwwkeys.nl.pgp.net --send-keys KEYID
gpg: 将密钥‘xxxxxxxx’上传到 hkp 服务器 wwwkeys.nl.pgp.net
(上传公钥到公钥服务器上)
$ gpg --search-keys zhangsan@gmail.com (搜索公钥)
gpg: 搜索“zhangsan@gmail.com”,在 hkp 服务器 wwwkeys.nl.pgp.net 上
(1) 张三 (张三的私人邮箱)
1024 bit DSA key xxxxxxxx, 创建于:2007-05-20
Keys 1-1 of 1 for "zhangsan@gmail.com". 输入数字以选择,输入 N 翻页,输入 Q 退出 >1(输入1就是下载搜到的公钥)
gpg: 下载密钥‘xxxxxxxx’,从 hkp 服务器 wwwkeys.nl.pgp.net
gpg: 密钥 xxxxxxxx:“张三 (张三的私人邮箱)”未改变
gpg: 合计被处理的数量:1
gpg: 未改变:1
$ gpg --import filenamepubkey.asc (导入对方李四的公钥)
3、加密和解密
呵呵忙了大半天,终于可以实战应用了!^_^!
eg:你要发给同事李四一个文件fileA.txt, 用如下命令加密:
$ gpg -r "KEYID/UID" -e fileA.txt
(KEYID就是上文提到的红色标识项,当然是李四的KEYID,UID是“李四 (李四的私人邮箱) ”,会生成一个加密文件fileA.txt.gpg)
李四收到密件后,因为他有对应的密钥,解密命令如下:
$ gpg -o fileA.txt -d fileA.txt.gpg
4、签名
上面的例子中,李四得到了fileA.txt.gpg,但是没有任何信息来证明他来自三,为表明发件人的身份,需要签名。
$ gpg -s -r "李四KEYID" -e blog (-s表示签名)
当李四解密这个密件的时候,会看到你的签名。如:
$ gpg -o fileA.txt -d fileA.txt.gpg
gpg: 完好的签名,来自于“张三 (张三的私人邮箱)”
明文也可以签名!!如:
$ gpg -b -a fileB.txt
会生成一个签名文件fileB.txt.asc,然后你可以将fileB.txt和fileB.txt.asc一起寄出。
收件人使用如下命令来判断签名,如:
$ gpg --verify fileB.txt.asc