Linux 下 gpg 加密与解密工具的简单使用
GPG 是加密和数字签名的免费工具,大多用于加密信息的传递。除了仅用密码加密外,GPG最大的不同是提供了“公钥/私钥”对。利用你的“公钥”别人加密信息不再需要告诉你密码,随时随地都能发送加密信息。而这种加密是单向的,只有你的“私钥”能解开加密。数字签名又是另一大使用方向。通过签名认证,别人能确保发布的消息来自你,而且没有经过修改。
使用 GPG 实现对称加密
gpg命令对称加密的简单用法
示例:
对称加密 file 文件
$ gpg -c file
# 会弹出对话框,输入密码后会生成加密文件
$ ls
file file.gpg
# 发往另一台主机
$ scp file.gpg 192.168.1.102:/testdir/
root@192.168.1.102's password:
file.gpg 100% 46 0.0KB/s 00:00
在另一台主机上解密 file
$ gpg -d file.gpg
# 此处会提示输入密码
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
# 解密内容直接显示在标准输出
aa
gpg: WARNING: message was not integrity protected
# 将解密内容保存至file文件中
$ gpg -o file -d file.gpg
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
gpg: WARNING: message was not integrity protected
$ cat file
aa
使用 GPG 工具实现公钥加密
GPG 命令非对称加密的简单用法
- 创建密钥 $ gpg --gen-key
- 查看公钥 $ gpg --list-key
- 查看私钥 $ gpg --list-secret-key
- 公钥删除 $ gpg --delete-keys 标识名
- 私钥删除 $ gpg --delete-secret-keys 标识名
- 公钥导出 $ gpg --export 标识名 > 导出文件名(多以gpg,asc为文件后缀)
- 私钥导出 $ gpg --export-secret-key 标识名 > 导出文件名(多以asc为文件后缀)
- 密钥导入 $ gpg --import 密钥文件
- 加密文件 $ gpg --recipient 标识名 --encrypt 文件名
- 解密文件 $ gpg --output 新文件名 --decrypt 加密文件名
- 修改密钥 $ gpg --edit-key 标识名
示例
在 hostB 主机上用公钥加密,在 hostA 主机上解密
$ gpg --gen-key
# 输入命令之后会出现交互界面
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
请选择您要使用的密钥种类:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (仅用于签名)
(4) RSA (仅用于签名)
您的选择? #回车选择默认
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048)
您所要求的密钥尺寸是 2048 位
请设定这把密钥的有效期限。
0 = 密钥永不过期
<n> = 密钥在 n 天后过期
<n>w = 密钥在 n 周后过期
<n>m = 密钥在 n 月后过期
<n>y = 密钥在 n 年后过期
密钥的有效期限是?(0)
密钥永远不会过期
以上正确吗?(y/n)y
You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
真实姓名:Groot
电子邮件地址:groot@linux.com
注释:test
您选定了这个用户标识:
“Groot (test) <groot@linux.com>”
更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?o
您需要一个密码来保护您的私钥。
#此时会弹出对话框
请输入密码:********
请再次输入密码:********
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
gpg: /root/.gnupg/trustdb.gpg:建立了信任度数据库
gpg: 密钥 45D0E9B1 被标记为绝对信任
公钥和私钥已经生成并经签名。
gpg: 正在检查信任度数据库
gpg: 需要 3 份勉强信任和 1 份完全信任,PGP 信任模型
gpg: 深度:0 有效性: 1 已签名: 0 信任度:0-,0q,0n,0m,0f,1u
pub 2048R/45D0E9B1 2016-11-29
密钥指纹 = F5E5 8D6F AD19 F92F 4F23 59AC 8C70 5D5D 45D0 E9B1
uid Groot (test) <groot@linux.com>
sub 2048R/3B5795EF 2016-11-29
################### 以上为交互内容####################
这里,首先要一个钥匙对才能公钥加密,这里根据系统情况不同,可能内容为英文。需要用户交互输入的地方,都通过"<====输入"这个标记指出来了。若对输入信息有所改动 ,可把 ~/.gnupg 目录下除 gpg.conf 以外的文件删除 ,再运行 gpg --gen-key 命令 ,或者使用 gpg 的 edit 选项 . 钥匙对放在 ~/.gnupg 目录下
在hostA主机上查看公钥
[root@zh ~]# gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub 2048R/BFB93149 2016-11-29
uid Groot (text) <groot@linux.com>
sub 2048R/29810E3D 2016-11-29
此处 pub(公匙)--- public key , ID : BFB93149 sub(私匙)--- secret key or private key , ID : 29810E3D 假如没使用root进行操作,可能会输出如下信息:"gpg: Warning: using insecure memory!" 警告没有锁定内存页 ,一般是连接网上操作有关安全方面的问题 ,没有事情的 ,可以作这样的改动 "# chmod 4755 /usr/bin/gpg"。
在hostA主机上导出公钥到groot.pubkey
[root@zh ~]# gpg -a --export -o groot.pubkey
[root@zh ~]# ll groot.pubkey
-rw-r--r-- 1 root root 1715 11月 29 10:32 groot.pubkey
从hostA主机上复制公钥文件到需加密的B主机上
[root@zh ~]# scp groot.pubkey hostB:/testdir/
The authenticity of host 'hostB (192.168.1.111)' can't be established.
ECDSA key fingerprint is fd:8d:a5:6e:ac:4d:45:05:48:81:19:a9:de:62:a3:44.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hostB,192.168.1.111' (ECDSA) to the list of known hosts.
root@hostB's password:
groot.pubkey 100% 1715 1.7KB/s 00:00
在需加密数据的hostB主机上生成公钥/私钥对 gpg --list-keys gpg --gen-key
在hostB主机上导入公钥
[root@zheng ~]# gpg --import /testdir/groot.pubkey
gpg: 密钥 BFB93149:公钥“Groot (text) <groot@linux.com>”已导入
gpg: 合计被处理的数量:1
gpg: 已导入:1 (RSA: 1)
[root@zheng ~]# gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub 2048R/BFB93149 2016-11-29
uid Groot (text) <groot@linux.com>
sub 2048R/29810E3D 2016-11-29
用从hostA主机导入的公钥,加密hostB主机的文件file,生成file.gpg
[root@zheng ~]# gpg -e -r Groot gpgtest
[root@zheng ~]# ll gpg*
-rw-r--r--. 1 root root 16 11月 29 10:53 gpgtest
-rw-r--r--. 1 root root 355 11月 29 11:01 gpgtest.gpg
复制加密文件到hostA主机
[root@zheng ~]# scp gpgtest.gpg hostA:/testdir/
The authenticity of host 'hosta (192.168.1.105)' can't be established.
ECDSA key fingerprint is cc:6d:c9:4a:8f:78:7a:b7:87:01:6d:c8:2d:28:cd:26.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hosta,192.168.1.105' (ECDSA) to the list of known hosts.
root@hosta's password:
gpgtest.gpg 100% 355 0.4KB/s 00:00
在hostA主机解密文件
[root@zh ~]# gpg -o gpgtest -d /testdir/gpgtest.gpg
您需要输入密码,才能解开这个用户的私钥:“Groot (text) <groot@linux.com>”
2048 位的 RSA 密钥,钥匙号 29810E3D,建立于 2016-11-29 (主钥匙号 BFB93149)
# 此时会弹出对话框,输入密码即可
gpg: 由 2048 位的 RSA 密钥加密,钥匙号为 29810E3D、生成于 2016-11-29
“Groot (text) <groot@linux.com>”
[root@zh ~]# cat gpgtest
hello,I'm Groot
节选自:https://blog.51cto.com/groot/1879615
更多参考: