加解密技术

一.加密/解密
1.什么是算法?什么是密钥?
算法:加密/解密所使用的转换规则
密钥:加密/解密所使用的指令或代码

2.加密的目的和方式
--确保数据的机密性
加密的方式:
   对称加密:加密/解密用同一个密钥
   非对称加密:加密/解密用不同的密钥(公钥/私钥)
--保护信息的完整性
   信息摘要:基于输入的信息生成长度较短 位数固定的散列值

3.常见的加密算法:

对称加密:
--DES,Data Encryption Standard 数据加密算法
--AES,Advanced Encryption Standard 高级加密算法
非对称加密:
--RSA,Rivest Shamirh Adleman 由发明者的三个人名组成
--DSA,Digital Signature Algorithm 数字签名算法

信息摘要:
--MD5,Message Digest Algorithm 5
--SHA,Secure Hash Algorithm

4.MD5完整性检验

系统中的每个文件都有一个唯一的MD5值,当文件被修改之后,MD5值也会随之改变;
我们可以利用这一特性,通过查看文件的MD5值来判断文件是否经过修改,防止别人的“恶作剧”。

root@localhost test]# md5sum a.txt    //创建一个测试文件,查看一下MD5值
bf7b0cb3765580ec2f58c215319aeea8  a.txt
[root@localhost test]# vim a.txt     //做不容易被发现的更改,比如在行尾添加一个空格
[root@localhost test]# md5sum a.txt     //再次查看其MD5值
456466dcc2b97adf52a50c94183e7266  a.txt   //发现MD5值已经改变

5.GnuPG,加密工具

1)GnuPG,GUN Privacy Guard,最流行的数据加密,数字签名工具软件

[root@localhost test]# gpg --version    //查看软件版本
gpg (GnuPG) 2.0.14
libgcrypt 1.4.5
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: ~/.gnupg
支持的算法:
公钥:RSA, ELG, DSA
对称加密:3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128,
              CAMELLIA192, CAMELLIA256
散列:MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
压缩:不压缩, ZIP, ZLIB, BZIP2

二.使用GPG加/解密文件

对称方式:
--加密操作:-c或者--symmetric
--解密操作:-d或者--decrypt

[root@localhost test]# gpg -c test.txt

[root@localhost test]#ls    //加密后会生成一个gpg的文件
test.txt test.txt.gpg
[root@localhost test]# file test.txt*    //查看文件类型
test.txt:     ASCII text
test.txt.gpg: data

[root@localhost test]# gpg -d test.txt.gpg > dtest.txt   //解密-d

非对称方式:
工作原理:
公钥解密,私钥解密
 用户A和用户B加密通信,用户B先生成一对密钥对,然后用户B把自己的公钥上传到互联网上,用户A获取到用户B的公钥之后,用用户B的公钥进行加密,生成加密的数据,最后用户B用自己的私钥揭开加密数据,其他人由于没有用户B的私钥,所以接不开加密数据。

1、非对称密钥成对出现,使用收件人的公钥加密,发给收件人,收件人有一个与之对应的私钥,才能解密。
2、bob要给alice发一个加密的文件,需要使用alice的公钥加密
*************************** 前期准备************************************
用ssh -X 的方式分别登录到bob和alice,不要用su的方式

--alice创建密钥对:--gen-key
--alice导出公钥:--export --armor 或-a
--bob导入公钥:--import
2.1
[alice@rhel6-1 ~]$ 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.

请选择您要使用的密钥种类:
  (1) RSA and RSA (default)
  (2) DSA and Elgamal
  (3) DSA (仅用于签名)
  (4) RSA (仅用于签名)
您的选择?             //设置用户信息,私钥口令
...
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动    
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。

                       //过程中让你填写的密码是用于保护私钥的
公钥和私钥已经生成并经签名。

gpg: 正在检查信任度数据库
gpg: 需要 3 份勉强信任和 1 份完全信任,PGP 信任模型
gpg: 深度:0 有效性:  1 已签名:  0 信任度:0-,0q,0n,0m,0f,1u
pub   2048R/96A314F4 2014-04-26
密钥指纹 = B9FE F46D 26AF B55F D0A3  94D7 1E4B 2764 96A3 14F4
uid                  alice <adj@asldj.com>
sub   2048R/8805B9B4 2014-04-26
                       //看到类似信息,表示密钥对生成成功
[alice@rhel6-1 ~]$ gpg --list-keys
/root/.gnupg/pubring.gpg            //查看公钥详细信息
------------------------
pub   2048R/96A314F4 2014-04-26
uid                  alice <adj@asldj.com>
sub   2048R/8805B9B4 2014-04-26

[alice@rhel6-1 ~]$ gpg --list-secret        //查看私钥相关信息

2.2  alice把公钥传递给bob

[alice@rhel6-1 ~]$ gpg -a --export > /tmp/alice.pub    //上传公钥

选项-a代表用ASSIC码的方式加密

2.3  bob收到alice的公钥后,用其加密文档

[bob@rhel6-1 ~]$ gpg --import /tmp/alice.pub         //导入公钥
gpg: 密钥 96A314F4:“alice <adj@asldj.com>”未改变
gpg: 合计被处理的数量:1
gpg:           未改变:1
[bob@rhel6-1 ~]$ gpg --list-keys        //bob查看导入的公钥
/home/bob/.gnupg/pubring.gpg
----------------------------
pub   2048R/A3820BAE 2013-12-04
uid                  alice <alice@tarena.com>
sub   2048R/60AFF7EC 2013-12-04
*************************加解密操作****************************************

--加密操作:--encrypt 或-e
--指定目标用户:--recipient(受体)或-r
--解密操作:--decrypt或-d

加密文件:
[bob@rhel6-1 ~]$ gpg -ear alice bob.txt

2.4  bob把加密后的文件发给alice
[bob@rhel6-1 ~]$ cp bob.txt.asc /tmp/

2.5  alice解密文件
[alice@rhel6-1 ~]$ cp /tmp/bob.txt.asc .
[alice@rhel6-1 ~]$ gpg bob.txt.asc        //用私钥解密
[alice@rhel6-1 ~]$ ls
bob.txt  bob.txt.asc
[alice@rhel6-1 ~]$ cat bob.txt
this is from bob

一次加密传输至此完成!

三、使用GPG实现签名

1、签名可实现的功能:
(1)身份认证,表明用户确实是他声称的那个人
(2)数据完整性,数据一旦被篡改,签名就会失效
(3)认可:不可抵赖
2、alice发送签名文件给bob
2.1  alice签名一个纯文本文件
[alice@rhel6-1 ~]$ echo 'alice file' > alice.txt
[alice@rhel6-1 ~]$ gpg -b alice.txt    //-b选项创建签名
[alice@rhel6-1 ~]$ ls
alice.txt  alice.txt.sig
2.2  把原文和签名文件发送给bob
[alice@rhel6-1 ~]$ cp alice.txt* /tmp/
2.3  验证签名
[bob@rhel6-1 ~]$ cp /tmp/alice.txt* .
[bob@rhel6-1 ~]$ ls
alice.txt  alice.txt.sig
[bob@rhel6-1 ~]$ gpg --verify alice.txt.sig
gpg: 于 2013年12月04日 星期三 15时59分51秒 CST 创建的签名,使用 RSA,钥匙号 A3820BAE
gpg: 完好的签名,来自于“alice <alice@tarena.com>”
gpg: 警告:这把密钥未经受信任的签名认证!
gpg:       没有证据表明这个签名属于它所声称的持有者。
主钥指纹: D780 8E96 D660 D394 1001  BF02 22BF 7AF9 A382 0BAE

2.4  把alice.txt的内容稍做修改存盘,再次验证
[bob@rhel6-1 ~]$ vim alice.txt
[bob@rhel6-1 ~]$ gpg --verify alice.txt.sig
gpg: 于 2013年12月04日 星期三 15时59分51秒 CST 创建的签名,使用 RSA,钥匙号 A3820BAE
gpg: 已损坏的签名,来自于“alice <alice@tarena.com>”