Linux GPG

Linux GPG

我们先来看看下面这句命令是什么意思

1
rngd -r /dev/urandom

什么是随机数
很多软件和应用都需要随机数,从纸牌游戏中纸牌的分发到 SSL 安全协议中密钥的产生,到处都有随机数的身影。随机数至少具备两个条件:
数字序列在统计上是随机的
不能通过已知序列推算后面的序列
自从计算机诞生起,寻求用计算机产生高质量的随机数序列的研究就一直是研究者长期关注的课题。一般情况下,使用计算机程序产生一个真正的随机数是很难的, 因为程序的行为是可预测的,计算机利用设计好的算法结合用户提供的种子产生的随机数序列通常是“伪随机数”(pseudo-random number),伪随机数就是我们平时经常使用的“随机数”。伪随机数可以满足一般应用的需求,但是在对于安全要求比较高的环境和领域中存在明显的缺点:
伪随机数是周期性的,当它们足够多时,会重复数字序列
如果提供相同的算法和相同的种子值,将会得出完全一样的随机数序列
可以使用逆向工程,猜测算法与种子值,以便推算后面所有的随机数列
只有实际物理过程才是真正的随机,只有借助物理世界中事物的随机性才能产生真正的随机数,比如真空内亚原子粒子量子涨落产生的噪音、超亮发光二极管在噪声的量子不确定性和放射性衰变等。

随机数为什么如此重要
生成随机数是密码学中的一项基本任务,是生成加密密钥、加密算法和加密协议所必不可少的,随机数的质量对安全性至关重要。最近报道有人利用随机数缺点成功 攻击了某网站,获得了管理员的权限。美国和法国的安全研究人员最近也评估了两个 Linux 内核 PRNG——/dev/random 和/dev/urandom 的安全性,认为 Linux 的伪随机数生成器不满足鲁棒性的安全概念,没有正确积累熵。可见随机数在安全系统中占据着非常重要的地位。

快速的给内核熵池喂随机数

  • Entropy(熵)
  • PRNG(伪随机生成器)
  • RNG(随机数生成器)

有两种方法可以从熵池中获取内核随机数。
一种是通过内核导出的随机数接口,另一种是通过特殊的设备文件/dev/random和/dev/urandom。

前面一种是给程序员大哥们用的,咱这样的菜鸟暂时是搞不懂了。

第二种方式,/dev/random & /dev/urandom
这两个特殊设备都是字符型设备。我们可以在用户空间通过read系统调用读这两个设备文件以此获取随机数。
这两个设备文件的区别在于:如果内核熵池的估计值为0时,也就是熵池不足的时候,/dev/random将被阻塞,而/dev/urandom不会有这个限制,它继续使用软件算法继续生成随机数,当然这时候的随机数算是伪随机数了。
有时候,我们在生成密钥的时候,需要用到随机数,如果熵池不足的时候,它会要我们敲键盘,晃鼠标什么的,是不是觉得特sha叉。可以通过下面这条命令,用urandom给内核熵池喂大量的随机数。。。

rngd -r /dev/urandom

嗯,至于这种方式的随机性强度够不够,那恐怕得算法师来解答了。。。

/dev/random和/dev/urandom是unix系统提供的产生随机数的设备,很多应用都需要使用random设备提供的随机数,比如ssh keys, SSL keys, TCP/IP sequence numbers等等。

而random设备的random pool是从基于中断的IRQS里面取值,IRQS跟一些特殊的硬件绑定,基于这些硬件的interrupts将会提供给random设备。

看一下当前系统现有的随机数有多少

1
2
[root@linux ~]# cat /proc/sys/kernel/random/entropy_avail
130

所以这条命令的作用就是用来生产 随机数的 以免随机数不足 导致出现安全性问题

1
rngd -r /dev/urandom

我们继续

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@linux ~]# gpg --gen-key
gpg (GnuPG) 2.0.14; Copyright (C) 2009 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.

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? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)

第一步我们选择1。RSA and RSA
然后我们回车 使用默认的 2048位加密 足够了
更安全的使用 4096

1
2
3
4
5
6
7
8
9
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)
Key does not expire at all
Is this correct? (y/N) y

为你生成的 key 是否有过期限制
这个 随便你选择

1
2
3
4
5
6
7
8
9
GnuPG needs to construct a user ID to identify your key.

Real name: pwnster
Email address: h@gov.ink
Comment: cisco
You selected this USER-ID:
"pwnster (cisco) <h@gov.ink>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o

填写一些信息

剩下就是输入密码了

查看我们的秘钥信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@linux ~]# gpg -k
/root/.gnupg/pubring.gpg
------------------------
pub 2048R/1489AAAC 2018-02-11
uid testme (1) <testme@126.com>
sub 2048R/248C1E46 2018-02-11

pub 2048R/F75F706B 2018-02-11
uid testme (1) <testme@126.com>
sub 2048R/2B05507E 2018-02-11

pub 2048R/79648924 2018-05-11
uid pwnster (cisco) <h@gov.ink>
sub 2048R/4E53DC4C 2018-05-11

导出公钥和私钥

1
2
3
4
5
[root@linux ~]# gpg -o pwnster.pri --export-secret-keys pwnster
[root@linux ~]# gpg -o pwnster.pub --export pwnster
[root@linux ~]# ls
anaconda-ks.cfg ftp install.log install.log.syslog pwnster.pri pwnster.pub
[root@linux ~]#

文件加密实验

1
2
3
4
5
6
7
8
9
10
11
[root@linux ~]# echo "hello moto" > ptest
[root@linux ~]# cat ptest
hello moto
[root@linux ~]# gpg -r pwnster -e ptest
[root@linux ~]# ls
anaconda-ks.cfg ftp install.log install.log.syslog ptest ptest.gpg pwnster.pri pwnster.pub
[root@linux ~]# cat ptest.gpg
?
?NS?L?.(LMSR*??Rː?`???բqu]d?4UFE???
?A?Gu???lO?:?,p??2?Z@?<J?ɏ????x??V??q?#?mA??y???p?`?D6.?m??о???'o?\?h??S?R/?V?-?џʟ?j????!?Iaɧ!?+?????? ???T&+?ڀ"???H??$???$?x??5?3w?dOpc6?`tM?`???s??vW5??*L?E?7,i?s-??X??J??'5x??n??o?K?'????L)o`?=}??????g\V1??Y??=?8$??[root@linux ~]#
[root@linux ~]#
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@linux ~]# gpg -r pwnster -d ptest.gpg > test

You need a passphrase to unlock the secret key for
user: "pwnster (cisco) <h@gov.ink>"
2048-bit RSA key, ID 4E53DC4C, created 2018-05-11 (main key ID 79648924)

can't connect to `/root/.gnupg/S.gpg-agent': No such file or directory
pinentry-curses: no LC_CTYPE known - assuming UTF-8
gpg: encrypted with 2048-bit RSA key, ID 4E53DC4C, created 2018-05-11
"pwnster (cisco) <h@gov.ink>"
[root@linux ~]# cat test
hello moto
[root@linux ~]#