欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

对称加密与非对称加密

程序员文章站 2024-03-16 18:37:40
...

对称加密:

     优点: 对称加密是最简单的一种加密方式,加密和解密用的是同一个秘钥,由于它的效率高,所以频繁被用到加密文件中。

但是对称加密的秘钥管理很难。

     缺点:通常在传送公钥时容易被截获,所以一般采用非对称加密的方式来传送公钥。

语法:

          gpg  -c   文件                           加密文件

          gpg   -d  加密的文件               解密文件

           gpg    -o   新文件名(此文件存储本次解密的文件)-d  加密的文件       解密文件到指定文件中

实例:

  

[[email protected] ~]# cat hello.txt 
1728473902
[[email protected] ~]# gpg -c hello.txt         #加密hello.txt文件,此过程需要自己设定密码
can't connect to `/root/.gnupg/S.gpg-agent': No such file or directory
Xlib:  extension "RANDR" missing on display "localhost:11.0".

(pinentry-gtk-2:121525): GLib-GObject-CRITICAL **: Object class GtkSecureEntry doesn't implement property 'editing-canceled' from interface 'GtkCellEditable'
Xlib:  extension "RANDR" missing on display "localhost:11.0".

(pinentry-gtk-2:121528): GLib-GObject-CRITICAL **: Object class GtkSecureEntry doesn't implement property 'editing-canceled' from interface 'GtkCellEditable'
[[email protected] ~]# ll hello.txt.gpg       #加密后文件自动添加了后缀
-rw-r--r--. 1 root root 59 Sep  1 19:21 hello.txt.gpg
[[email protected] ~]# cat hello.txt.gpg         #cat被加密的文件,打开乱码
kQ?㟉*Ѱ®чd-x®wC¶ƭ2¢tϨJՏb8[[email protected] ~]# 

[[email protected] ~]# gpg -d hello.txt.gpg       #解密被加密的文件,此过程需要输入设定的密码
gpg: 3DES encrypted data
can't connect to `/root/.gnupg/S.gpg-agent': No such file or directory
Xlib:  extension "RANDR" missing on display "localhost:11.0".

(pinentry-gtk-2:121548): GLib-GObject-CRITICAL **: Object class GtkSecureEntry doesn't implement property 'editing-canceled' from interface 'GtkCellEditable'
gpg: encrypted with 1 passphrase
1728473902                    #解密出的内容
gpg: WARNING: message was not integrity protected
[[email protected] ~]# gpg -o new.txt -d hello.txt.gpg     #将解密的文件存入new.txt文件中,相当于重定向到new.txt文件中,也可以这样表示:gpg -d hello.txt.gpg > new.txt
gpg: 3DES encrypted data
can't connect to `/root/.gnupg/S.gpg-agent': No such file or directory
Xlib:  extension "RANDR" missing on display "localhost:11.0".

(pinentry-gtk-2:121595): GLib-GObject-CRITICAL **: Object class GtkSecureEntry doesn't implement property 'editing-canceled' from interface 'GtkCellEditable'
gpg: encrypted with 1 passphrase
gpg: WARNING: message was not integrity protected
[[email protected] ~]# cat new.txt          #打开解密后的文件
1728473902

 非对称加密:

       优点: 非对称加密为数据的加密与解密提供了安全的方式,它使用一对秘钥,公钥和私钥,公钥可以让任何人获取;但是公钥加密的数据只能由私钥来解密。若两个人通信则都使用对方的公钥来加密数据即可

      缺点:耗费时间较长

      语法:

     centos6 生成公私钥:
                 gpg --gen-key     (根据提示生成公私钥)
     公私钥存储的目录:
                 /root/.gnupg
    查看公私钥:
                gpg -k/-K
   centos7生成公私钥
             gpg --gen-key      (根据提示生成公私钥)

  公私钥存储的目录:
     /root/.gnupg
 查看公私钥:
     gpg -k/-K

从cennos6中将公钥导出
    gpg  -a --export  -o  文件名c6(此文件存储导出的centos6公钥)
将centos6的公钥传给centos7
    利用scp将   文件名c6(上步的文件。即存储centos6公钥的文件)传给centos7
centos7将centos6的公钥(上步传的文件,文件名c6)添加到自己的公钥文件中
     gpg --import  文件名c6(上步的文件)
     gpg -k(查看一下)
用centos6的公钥加密文件
    gpg -e -r  公钥名(centos7导入centos6的公钥)          文件(centos7要加密的文件)
将加密的文件传给centos6
利用scp将centos7利用centos6的公钥加密的文件传给centos6
centos6解密
gpg -o 新文件(解密的内容存储文件) -d 加密的文件
查看解密文件
cat 新文件  (上步的新文件)

实例:

[[email protected] ~]# gpg --gen-key     #centos6需要在虚拟机上操作此步骤
[[email protected]~]# ll .gnupg/
total 32
-rw-------. 1 root root 7856 Sep  1 19:55 gpg.conf
drwx------. 2 root root 4096 Sep  1 19:55 private-keys-v1.d
-rw-------. 1 root root 1166 Sep  1 19:56 pubring.gpg
-rw-------. 1 root root 1166 Sep  1 19:56 pubring.gpg~
-rw-------. 1 root root  600 Sep  1 19:56 random_seed
-rw-------. 1 root root 2544 Sep  1 19:56 secring.gpg
-rw-------. 1 root root 1280 Sep  1 19:56 trustdb.gpg
[[email protected]~]# gpg -k            #查看centos6的公钥
/root/.gnupg/pubring.gpg
------------------------
pub   2048R/DCB153F8 2018-09-02
uid                  centos6
sub   2048R/29FFD23F 2018-09-02

[[email protected]~]# gpg -K            #查看centos6的私钥
/root/.gnupg/secring.gpg
------------------------
sec   2048R/DCB153F8 2018-09-02
uid                  centos6
ssb   2048R/29FFD23F 2018-09-02
[[email protected]~]# gpg --gen-key       #centos7公私钥的生成;可以在Xshell中操作
[[email protected]~]# gpg -k               #查看centos7的公钥
/root/.gnupg/pubring.gpg
------------------------
pub   2048R/F6CD18D0 2018-09-02
uid                  centos7
sub   2048R/79FAF346 2018-09-02

[[email protected]~]# gpg -K                 #查看centos7的私钥
/root/.gnupg/secring.gpg
------------------------
sec   2048R/F6CD18D0 2018-09-02
uid                  centos7
ssb   2048R/79FAF346 2018-09-02
[[email protected]~]# gpg -a --export -o public.txt               #centos6生成公钥文件    
[[email protected]~]# scp public.txt [email protected]:/root    #centos6的公钥发送centos7
[[email protected]~]# gpg --import public.txt         #centos7导入centos6的公钥到自己的公钥中
gpg: key DCB153F8: public key "centos6" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
[[email protected]~]# gpg -k                     #centos7再次查看自己的公钥
/root/.gnupg/pubring.gpg
------------------------
pub   2048R/F6CD18D0 2018-09-02
uid                  centos7
sub   2048R/79FAF346 2018-09-02

pub   2048R/DCB153F8 2018-09-02
uid                  centos6
sub   2048R/29FFD23F 2018-09-02

[[email protected]~]# echo "hello" > centos6.txt   #centos7生成要加密的文件
[[email protected]~]# gpg -e -r centos6 centos6.txt   #centos7用centos6的公钥加密文件

[[email protected]~]# cat centos6.txt.gpg   #查看加密的文件,发现乱码
 
ݶ)ÿG¸6)k
        %@p*/
             *µܔɪоݨ(
) ໯1ccɍ¢ᦹ⚸ћ7C¦^+"՘<9>ʁ§GI4-U¸ \fí9؄f]䩷㚾V¥ؐ{;k̀8谶0'u離Y¯ꇪϙV*ĥRˡ¤|*x߽º-¡͈l:M 5E
   W6»wহa¥Z=D퇠ޱpd,"͠@ьŖ˓ϋ£×i䆺

¼mR堐¡H'Aa֠?½㝺>*eg£ƚI[[email protected] ~]# Xshell
[[email protected]~]# scp centos6.txt.gpg [email protected]:/root       #centos7将加密的文件发给centos7
[[email protected]~]# gpg -o centos.txt -d centos6.txt.gpg   #centos6加密文件
[[email protected]~]# cat centos.txt           #centos6打卡解密后的文件
hello

对称加密与非对称加密的效率对比:

#非对称加密和解密所用的时间
[[email protected] ~]# ll -h access_log1
-rw-r--r--. 1 root root 7.0M Sep  1 20:24 access_log1
[[email protected] ~]# scp access_log1 [email protected]:/root
[[email protected] ~]# time gpg -e -r cetnos6 access_log1 

real	0m1.611s
user	0m0.056s
sys  	0m0.006s
[[email protected] ~]# scp access_log1.gpg [email protected]:/root
[[email protected] ~]# time gpg -d access_log1.gpg >/dev/null

real	0m3.600s
user	0m0.333s
sys	    0m0.010s

#对称加密和解密的时间
[[email protected] ~]# time gpg -c access_log1
real	0m8.131s
user	0m0.300s
sys	    0m0.001s
[[email protected] ~]# time gpg -d access_log1.gpg >/dev/null
eal  	0m2.595s
user	0m0.295s
sys	    0m0.001s

centos7利用centos6的公钥加密来实现非对称加密所用的时间sys  0.006s,而centos6利用对称加密所用的时间  sys  0.01s;

centos6解密利用非对称加密的问价所用的时间  sys  0.001s,而centos6利用非对称加密所用的时间  sys  0.001s

总结:由以上的例子可以看出,非对称加密和解密耗时较长,不利于通信的速率,但是安全性比较好,而对称加密相反,

         加密和解密的速度很快,但是容易被其他人窃取公钥,所以应该利用非对称加密来加密对称加密的公钥,然后在利用对称加密来实现通信。

补充:

time:

real时间是指挂钟时间,也就是命令开始执行到结束的时间。这个短时间包括其他进程所占用的时间片,和进程被阻塞时所花费的时间。

user时间是指进程花费在用户模式中的CPU时间,这是唯一真正用于执行进程所花费的时间,其他进程和花费阻塞状态中的时间没有计算在内。

sys时间是指花费在内核模式中的CPU时间,代表在内核中执系统调用所花费的时间,这也是真正由进程使用的CPU时间。