信息安全实验--GPG的使用

GPG

这里参考了"阮一峰的网络日志"来进行实验的,该博客地址如下:

http://www.ruanyifeng.com/blog/2013/07/gpg.html

一、安装

sudo apt-get install gnupg

我执行安装命令时,发现系统已经自带了GPG,所以打算直接使用自带的GPG来做实验。

安装
我这里的版本是1.4.20。

版本

它有的用法以及其它很多参数,可以通过–help来查看

帮助

二、生成密钥

gpg --gen-key

回车之后,会跳出一大段的文字,让我们选择要使用的加密算法,默认是加密和签名都使用REA,这里我也选择了默认项。

类型

接下来是密钥长度,越长越安全,默认是2048位,这里也是选择默认,回车即可。

然后是期限,说明如下:

time

这里由于密钥只是我个人使用,并且能够保证有效的保管私钥,因此选择了永不过期,也是默认选项。

回答完这些问题之后,系统会让我们确认信息,选y之后可以进入个人信息的提供环节:

yes

这里填写真实信息之后,会让我们来最后确认一次:

ensure

输入O表示确定之后,系统会让我们设定私钥的密码,这样一方面可以防止误操作,也可以防止系统被侵入时有人擅自动用私钥。

passwd

这里一切就绪之后,密钥生成就开始了,这个时候,它会提示我们做一些琐事,并且如果做的不够多,它还会有提示:

random

random2

三、遇见错误及解决方式

第一次走完整个步骤的时候,它报出了如下的错误:

error

我以为是没有联网的缘故开了热点又进行了一次,依然报了这个错,于是通过百度找到了一种错误原因以及解决方式:

今天在fedora的中文翻译组上订阅的时候,用到gpg,生成密钥的时候,提示有gpg:找不到可写的公钥钥匙环:eof (gpg: no writable public keyring found: eof)的错误,百度上搜了一下,竟然就一个网页,而且还不对题;随后google一下,把对应的英文提示搜出来了,再用这英文提示搜一下,嘿,找到答案了:

cd /root

mkdir .gunpg

chmod 555 .gnupg/

原来是因为没有.gunpg这个目录造成的。

这里我看了我的root目录,发现有.gunpg这个隐藏目录,不过权限却不是555,所以我想可能这里需要root权限才能解决问题,所以我用如下命令运行了gpg

sudo gpg --gen-key

并且再跑了一遍整个流程

此时成功生成了公钥和私钥

success

这里的D9358A6C是我"用户ID"的Hash字符串,可以用来代替"用户ID"

四、生成"撤销证书"

生成"撤销证书"的目的是为了在以后密钥作废时,可以请求外部的公钥服务器来撤销公钥。

gpg --gen-revoke [用户ID]

这里用户ID,我使用了刚才生成的Hash字符串,并且填写相关信息之后,就能够生成一个吊销证书。

revoke

五、密钥管理

1.列出密钥

这里仍然需要特权执行,否则会提示权限不够

sudo gpg --list-keys

list

第一行是公钥文件名,第二行是私钥特征(2048位,Hash字符串和生成时间),第三行是用户ID,第四行是私钥的特征。

如果想要删除某个密钥,可以使用如下命令:

gpg --delete-key [用户ID]

2.输出密钥

公钥文件是以二进制形式存储的,使用armor参数可以将其转换为ASCII码显示

gpg --armor --output [输出文件名] --export [用户id]

私钥文件也可以用类似的方式转换

gpg --armor --output [输出文件名] --export-secret-keys

这里如果有多个私钥的话,可以用以下命令来输出特定的私钥

gpg -a -o [输出文件名] --export-secret-keys [特定ID]

不过感觉似乎并不是所有版本都可行的,至少我一个同学的版本这条命令执行结果是失败的

3.上传公钥

gpg --send-keys [用户ID] --keyserver hkp://subkeys.pgp.net

使用该命令,可以将公钥上传到服务器hkp://subkeys.pgp.net上,通过交换机制,所有公钥服务器最终都会包含自己的公钥。

可以生成一个公钥指纹来让他人进行核对下载到的公钥是否为真:

gpg --fingerprint [用户ID]

4.输入密钥

导入他人公钥或者自己的其他密钥

gpg --import [密钥文件]

从公钥服务器上获取他人公钥

gpg --keyserver hkp://subkeys.pgp.net --search-keys [用户ID]

下载之后还需要用其他机制验证。

六、加密和解密

1.加密

这里我现在实验目录下新建了一个test.txt

createFile

然后利用命令进行加密

sudo gpg --recipient [用户ID] --output test.en.txt --encrypt test.txt

这里recipient后面指定接受者的公钥,output后面是加密后的文件名,encrypt后面是源文件。

执行之后可以查看生成的文件。

afterEn

可以看到已经无法看出原来的内容了。

2.解密

使用如下命令解密,这里我来解密刚才生成的test.en.txt

sudo  gpg --decrypt test.en.txt

博客中的命令后面有output参数,但是我这里使用之后它会提示我用法错误,省略之后就正常了,不过文件内容也是直接在命令行中打印了出来

运行结果如下:

afterDe

这里省略decrypt也是可以的,gpg默认是执行解密。

后来我又试验了一下这里的输出文件方式,发现只要将–output参数放在–encrypt参数之前运行,就不会有问题,命令如下:

sudo gpg --output ./asc.txt --decrypt test.en.txt

decry2

可见,此时成功将解密内容输出到了asc.txt中。

七、签名

1. 对文件签名

签名的目的是为了表示某个文件确实是由本人发出的,使用sign参数来进行签名。

这里依然对之前创建的test.txt进行签名。

sudo gpg --sign test.txt

运行之后,当前目录下生成了一个demo.txt.gpg文件,也就是签名之后的文件,这里是二进制形式存储:

sign

也可以生成ASCII码的签名文件,可以使用clearsign参数

sudo gpg --clearsign test.txt

这里可以生成一个ASCII码类型的签名文件

signasc

如果想生成单独的签名文件,与文件内容分开存放的话,可以用detach-sign参数

sudo gpg --detach-sign test.txt

这样可以在目录下生成一个单独的二进制形式签名文件test.txt.sig,如果想采用ASCII码形式,需要加上armor参数。

sudo gpg --armor --detach-sign test.txt

dsignasc

可以在签名的时候同时加密,示例如下:

sudo gpg --local-user [发信者ID] --recipient [接收者ID] --armor --sign --encrypt demo.txt

2.验证签名

使用verify参数就可以用对方的公钥来对文件签名进行验证,verify参数用来验证。

sudo gpg --verify test.txt.asc test.txt

这里运行结果如下:

versign

可见验证成功。

八、DIY环节

这里我利用gpg命令配合其他shell命令以及简单的shell语句实现了一个简单的密码本程序,用来保存自己其他的密码,这样只需要保存好这个密码文件以及自己的密钥,以及其对应的密码即可。这个程序实现了创建密码本、查看所有密码、添加密码、查找密码的功能。

1.创建密码本

	touch password.txt	#创建一个新文件
	gpg --recipient LiHaoMing --output password.en.txt --encrypt password.txt	#加密这个文件生成加密文件
	rm password.txt	#删除原文件

运行如下:

create

可见,这里创建了一个新的加密文件。

2.添加密码

这个逻辑略长,不过也很好理解

	while [ -z $des ];	#当描述为空时循环执行
	do
        echo 输入密码描述,不可空	#提示语句
        read des	#读取输入
    done
    while [ -z $username ];	#当用户账号为空时循环执行
    do
        echo 输入账号,不可空	#提示语句
        read username	#读取输入
    done
    while [ -z $password ];
    do
        echo 输入密码,不可空
        read password
    done
    gpg --output password.txt --decrypt password.en.txt    #解密文件
    echo $des>>password.txt #添加描述
    echo $username $password>>password.txt
    rm password.en.txt  #移除加密文件
    gpg --recipient LiHaoMing --output password.en.txt --encrypt password.txt #加密
    rm password.txt #移除密码本

运行如下:

add

3.查看所有密码

	gpg --decrypt password.en.txt

运行如下:

read

4.查找密码

这里用grep命令配合,通过密码描述来查找对应的账号和密码

    read keyword
    gpg --decrypt password.en.txt | grep $keyword -A 1

运行如下:

find

最后利用switch语句,通过参数的选择来执行对应部分的功能即可,完整程序如下:

case $1 in
-m )
    #echo 创建新的空密码本
    touch password.txt	#创建一个新文件
    gpg --recipient LiHaoMing --output password.en.txt --encrypt password.txt #加密这个文件生成加密文件
    rm password.txt #删除原文件
    exit 0;;
-r )
    #echo 查看密码
    gpg --decrypt password.en.txt
    exit 0;;
-a )
    echo 添加密码
    while [ -z $des ];
    do
        echo 输入密码描述,不可空
        read des
    done
    while [ -z $username ];
    do
        echo 输入账号,不可空
        read username
    done
    while [ -z $password ];
    do
        echo 输入密码,不可空
        read password
    done
    gpg --output password.txt --decrypt password.en.txt    #解密文件
    echo $des>>password.txt #添加描述
    echo $username $password>>password.txt
    rm password.en.txt  #移除加密文件
    gpg --recipient LiHaoMing --output password.en.txt --encrypt password.txt #加密
    rm password.txt #移除密码本
    #echo $des $username $password
    exit 0;;
-f )
    echo 请输入要查找的关键字
    read keyword
    gpg --decrypt password.en.txt | grep $keyword -A 1
    exit 0;;
esac

这个程序还有很多需要完善的地方,比如说如果输入过程中密码输错了需要修改之类的情况没有进行处理,因此以后有时间的话可以进一步的完成这个程序,此外就是一定要保存好自己的密钥、并记住对应的密码,否则可能会让输进去的一堆密码再也找不回来。

猜你喜欢

转载自blog.csdn.net/zekdot/article/details/84001579
gpg
今日推荐