信息安全技术实用教程-第4版---张同光---ISBN-9787121423031---3.4.3实例——用非对称加密算法加密文件
https://www.cnblogs.com/ztguang/p/12828764.html
主 编: 张同光
ISBN号: 978-7-121-42303-1 9787121423031
出版日期: 2021-11-20
出版社: 电子工业出版社
页码: 定价:¥69.80元
3.4.3 实例——用非对称加密算法加密文件
根据虚拟机KaliLinux的vdi文件KaliLinux.vdi创建虚拟机KaliLinux-2,具体的创建过程可以参考第一章的1.7.4节和网络资料,虚拟机KaliLinux-2的主要参数设置如图3.55所示,网络连接方式选择“网络地址转换(NAT)”。
注意:VirtualBox导入vdi时报错“Cannot register the hard disk because a hard disk with UUID already exists.”,解决方法是打开带管理员权限的PowerShell,切换到VirtualBox安装目录(比如C:\Program Files\Oracle\VirtualBox),执行如下命令:
.\VBoxManage.exe internalcommands sethduuid C:\ztg\VirtualBox-OS-vdi\KaliLinux.vdi
图3.55 创建虚拟机KaliLinux-2
3.4.3.1 用GnuPG加密文件
GnuPG软件包(Gnu Privacy Guard,Gnu隐私保镖),软件包的名称是gpg。
1.在虚拟机KaliLinux中,创建密钥对
在虚拟机KaliLinux中,创建一个用来发送加密数据和进行解密数据的密钥。
执行gpg --gen-key命令,生成密钥,如图3.56所示,根据提示输入相关信息。
图3.56 创建密钥
现在已经在.gnupg目录中生成了一对密钥且存在于文件中,进入.gnupg目录进行查看,如图3.57所示。
图3.57 .gnupg目录内容
2.在虚拟机KaliLinux中,提取公共密钥
为了使对方(虚拟机KaliLinux-2)使用刚才生成的公共密钥(1FCB3E8FEA808287),需要用命令将公共密钥提取出来,发送给对方。执行命令gpg --export 1FCB3E8FEA808287 > pub.key,将公共密钥提取到文件pub.key中。
3.KaliLinux-2收到KaliLinux的公共密钥
在虚拟机KaliLinux-2中,收到对方(虚拟机KaliLinux)的公共密钥后(在虚拟机和宿主机之间通过拖放的方法),执行命令gpg --import pub.key把这个公共密钥放到自己的pubring.kbx文件(钥匙环文件)里,执行命令gpg --delete-secret-and-public-key 1FCB3E8FEA808287可以将公共密钥从钥匙环文件中删除。命令的执行如图3.58所示。
图3.58 保存别人的公共密钥
执行gpg –kv命令查看目前存放的别人的公共密钥,如图3.59所示。
图3.59 查看公共密钥
图3.60 用公共密钥加密文件
4.KaliLinux-2使用KaliLinux的公共密钥加密文件
在虚拟机KaliLinux-2中,执行gpg -ea -r 1FCB3E8FEA808287 gpg_temp.txt对gpg_temp.txt文件进行加密。
-e:代表加密。
-a:代表ASCII格式。
-r:后面是公共密钥标识。
1FCB3E8FEA808287:为密钥标识。
该命令执行后,在当前目录下生成了一个同名的gpg_temp.txt.asc的文件,即加密后的文件。具体执行过程如图3.60所示。
5.KaliLinux对KaliLinux-2发来的加密文件进行解密
KaliLinux收到KaliLinux-2发来的加密文件gpg_temp.txt.asc后,执行gpg -o gpg_temp2.txt -d gpg_temp.txt.asc命令,用私有密钥对加密文件进行解密。
-o:输出文件。
-d:表示解密。
在当前目录下生成了解密后的文件gpg_temp2.txt。具体执行过程如图3.61所示。
图3.61 对加密文件进行解密
3.4.3.2 用OpenSSL加密解密文件
在安全性要求比较高的环境下,可以借助OpenSSL工具对数据进行加密,这样能进一步的保障数据的安全性,几乎所有的Linux发行版里都会预装OpenSSL。OpenSSL可以实现消息摘要、文件的加密和解密、数字证书、数字签名和随机数字。SSL是Secure Sockets Layer的缩写,是支持在Internet上进行安全通信的标准,并且将数据密码技术集成到协议中。数据在离开计算机之前被加密,然后只有到达它预定的目标后才被解密。
下面介绍2种使用OpenSSL加密解密方法:(1)使用密码加密解密;(2)使用密钥加密解密。
1.使用密码加密解密
1)对文件加密或解密
第1步:在虚拟机KaliLinux中,执行如下命令加密一个文件,test1.txt为原始文件,test1.txt.aes为加密之后的文件。
echo openssl enc test > test1.txt
openssl enc -e -aes256 -in test1.txt -out test1.txt.aes
其中,
enc:表示对文件进行对称加密或解密;
-e:表示对一个文件进行加密操作;
-aes256:表示使用aes256算法进行加密或解密;
-in:表示需要被加密的文件;
-out:表示加密之后生成的新文件。
加密过程中会要求输入一个加密密码,重复输入两次即可完成对文件的加密。
第2步:在虚拟机KaliLinux-2中,执行如下命令解密一个文件,test1.txt.aes为加密的文件,test1.txt为解密之后的文件。
openssl enc -d -aes256 -in test1.txt.aes -out test1.txt
其中,
enc:表示对文件进行对称加密或解密;
-d:表示对文件进行解密操作;
-aes256:表示使用aes256算法进行加密或解密;
-in:表示需要被解密的文件;
-out:表示解密之后生成的新文件。
解密一个文件的时候会要求输入加密文件时设置的密码才能进行解密。
2)配合tar对文件夹加密或解密
第1步:在虚拟机KaliLinux中,执行如下命令打包并加密文件夹。
mkdir -p testdir/{a,b,c}
echo openssl des3 testdir > testdir/a/testdir.txt
tar czvf - testdir | openssl des3 -salt -k password -out testdir.tar.gz
该例中以des3加密方式,设置密码为password的方式加密testdir文件夹并将加密后的文件输出为testdir.tar.gz。使用-k参数,这样就免出了让提示输密码的麻烦。这样可以方便以脚本的方式对敏感文件进打包并加密。
上面的操作也可以分两步来完成,第一步先通过tar czvf testdirtmp.tar.gz testdir进行打包备份。第二步再通过openssl des3 -salt -k password -in testdirtmp.tar.gz -out testdir.tar.gz的方式加密。
第2步:在虚拟机KaliLinux-2中,执行如下命令解密并解包文件夹。
openssl des3 -d -k password -salt -in testdir.tar.gz | tar xzvf -
上述操作的具体过程如图3.62所示。
图3.62 使用密码加密解密
2.使用密钥加密解密
有时会出现忘记密码的情况,另外如果密码设置的太简单,很容易被破解,这时可以能过密钥的方式进行加密和解密。
第1步:在虚拟机KaliLinux中,执行如下命令生成一个2048位的密钥文件test.key。
openssl genrsa -out test.key 2048
test.key密钥文件包含了公钥和密钥两部分,该文件即可以用于加密和解密。可以将公钥从test.key密钥文件中提取出来,供自己或他人用于加密(仅能用来加密,无法用来解密)。
第2步:在虚拟机KaliLinux中,执行如下命令从test.key密钥文件中提取出公钥。
openssl rsa -in test.key -pubout -out test_pub.key
其中test_pub.key为公钥文件,密钥文件test.key包含公钥和私钥。
第3步:在虚拟机KaliLinux-2中,执行如下命令利用公钥test_pub.key加密文件。
echo openssl rsautl test > test2.txt
openssl rsautl -encrypt -in test2.txt -inkey test_pub.key -pubin -out test2.txt.en
此处利用公钥加密test2.txt文件,并输出为test2.txt.en,-in指定要加密的文件,-inkey指定密钥,-pubin表明是用纯公钥文件加密,-out为加密后的文件。
第4步:在虚拟机KaliLinux中,执行如下命令利用密钥文件test.key中的私钥解密一个文件。
openssl rsautl -decrypt -in test2.txt.en -inkey test.key -out test2.txt
此处利用私钥解密test2.txt.en文件,并输出为test2.txt,-in指定要解密的文件,-inkey指定密钥,-out为解密后的文件。
上述操作的具体过程如图3.63所示。
图3.63 使用密钥加密解密