加密可以分为对称加密和非对称加密。两者的主要区别就是是否使用同一个秘钥,对称加密需要用同一个秘钥。非对称加密不需要用同一个秘钥,而是需要两个秘钥:公开密钥(publickey)和私有密钥(privatekey),并且加密密钥和解密密钥是成对出现的。
对称加密算法
对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。
不足之处是,交易双方都使用同样钥匙,安全性得不到保证。
常见的对称加密有DES,3DES,AES,Blowfish,Twofish,IDEA,RC6,CAST5 等。
非对称加密算法
密钥是成对出现。使用一对“私钥-公钥”,用私钥加密的内容只有对应公钥才能解开
常见的非对称加密有 RSA、ESA、ECC 等。
公钥:公开给所有人。不能通过公钥反推出私钥;public key
私钥:自己留存,不公开。有且只有一个对应的私钥;secret key
特点:通过私钥加密的密文只能通过公钥能解密,通过公钥加密的密文也只能通过私钥能解密。
但由于算法强度比对称加密复杂,加解密的速度比对称加解密的速度要慢。
来查看本机系统中ssh中的密钥都长啥样呢。pub结尾的就是公钥,key结尾的就是私钥
#ls /etc/ssh/
ssh_host_dsa_key.pub ssh_host_key.pub ssh_host_rsa_key.pub
ssh_config ssh_host_dsa_key ssh_host_key ssh_host_rsa_key
查看系统中密码加密算法
#authconfig --test|grep password
shadow passwords are enabled
password hashing algorithm is sha512
常见加密算法工具
md5: 128bits、 sha1: 160bits、 sha224
sha256、 sha384、 sha512
常用工具
md5sum
sha1sum
sha512sum
openssl
gpg
• rpm -V
需要先导入光盘中的GPG-KEY:
#rpm --import /dvd/RPM-GPG-KEY-CentOS-6
或安装好的系统的
#rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
#rpm -K /dvd/Packages/kernel-2.6.32-696.el6.x86_64.rpm
/dvd/Packages/kernel-2.6.32-696.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
可以利用加密算法对文件进行计算以便发现是否被篡改
md5sum --check 保存的计算结果文件
#sha512sum --check file.sum
b: FAILED
sha512sum: WARNING: 1 of 1 computed checksum did NOT match
使用gpg实现对称加密与解密
对称加密file文件
#gpg -c sshd_config
输入2次密码之后,会生成一个sshd_config.gpg
#file sshd_config.gpg
sshd_config.gpg: data
解密此加密过的file,输入正确的密码即可
-o 是指定输出位置,必须放在前面。
#gpg -o /tmp/sshd -d sshd_config.gpg
使用gpg工具实现非对称公钥加密与解密
#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) 默认回车
Requested keysize is 2048 bits
Please specify how long the key should be valid.选择密钥有效期
0 = key does not expire
Key is valid for? (0) 1y
Key expires at Sun 13 Jan 2019 08:02:46 PM CST
Is this correct? (y/N) y 是否确认以上信息
GnuPG needs to construct a user ID to identify your key.
Real name: gpg 保存一个名字
Name must be at least 5 characters long 至少需要5个字符
Real name: gpg-key-a
Email address: [email protected] 邮件地址
Comment: 备注
You selected this USER-ID:
"gpg-key-a
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O 保存是O
再接输入2次密码
然后,加密过程就根据加密长度,会让你随机输入字符,总这就是你不断的敲东西啦。可以开多个终端窗口,批量发送信息。挺有意思的。
这个操作在图形界面下只需要动动鼠标就好了
生成了一对密钥。
#ls ~/.gnupg/
gpg.conf private-keys-v1.d pubring.gpg pubring.gpg~ random_seed secring.gpg trustdb.gpg
pubring.gpg 公钥
secring.gpg 私钥
#gpg -k
/root/.gnupg/pubring.gpg
------------------------
pub 2048R/4CBA6F6A 2018-01-13 [expires: 2019-01-13]
uid gpg-key-a
sub 2048R/215FAF14 2018-01-13 [expires: 2019-01-13]
导出公钥
#gpg -a --export -o gpg-a-pubkey
在另外一个系统导入公钥
#gpg --import gpg-a-pubkey
#gpg -k 能看到导入的公钥
/root/.gnupg/pubring.gpg
------------------------
pub 2048R/4CBA6F6A 2018-01-13 [expires: 2019-01-13]
uid gpg-key-a
sub 2048R/215FAF14 2018-01-13 [expires: 2019-01-13]
加密文件
#gpg -e -r gpg-key-a gpg.conf -r 是指定加密的公钥名
回到导出公钥的主机,执行解密
#gpg -d gpg.conf.gpg
成功
OpenSSL
开源项目
三个组件:
openssl: 多用途的命令行工具,包openssl
libcrypto: 加密算法库,包openssl-libs
libssl:加密模块应用库,实现了ssl及tls,包nss,openssl命令:
两种运行模式:交互模式和批处理模式
直接使用openssl回车进入交互模式,输入?列出命令菜单。
命令分为:
标准命令Standard commands
消息摘要命令Message Digest commands
加密命令Cipher commands
openssl命令
帮助:man enc ,man dgst
对称加密
语法:
openssl enc
常用选项有:
-in filename: 指定要加密的文件存放路径
-out filename: 指定加密后的文件存放路径
-salt: 自动插入一个随机数作为文件内容加密,默认选项
-e: 可以指明一种加密算法,若不指的话将使用默认加密算法。支持的算法在man中
-d: 解密,解密时也可以指定算法,若不指定则使用默认算法,但一定要与加密时的 算法一致
-a/-base64: 使用-base64位编码格式
示例
#openssl enc -e -des3 -a -in issue -out issue.des3
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
#ll
-rw-r--r-- 1 root root 33 Jan 14 16:11 issue
-rw-r--r-- 1 root root 78 Jan 14 16:25 issue.des3
#cat issue.des3
U2FsdGVkX1+eOWAl9ZWtfyLzZY/4+256W1QduATECmFFuhYhc9pX2HZAe9AQ9l/o
K3aVnlttg4s=
解密
#openssl enc -d -des3 -a -in issue.des3 -out issue2
单向加密:
openssl dgst
常用选项有:
-out filename: 将加密的内容保存到指定文件中
示例
#openssl dgst issue 默认是MD5
MD5(issue)= 1ad7bcb8447ccaaeb490feea29c6f6df
#openssl dgst -sha512 issue
生成用户密码:
openssl passwd
帮助:man sslpasswd
常用选项
-salt string:加入随机数,最多8位随机数
-in file:对输入的文件内容进行加密
-stdion:对标准输入的内容进行加密
openssl passwd -1 -salt SALT(最多8位)
openssl passwd -1 –salt centos
生成随机数:
openssl rand
帮助:man sslrand
openssl rand -base64 NUM
NUM: 表示字节数
生成密钥对:
openssl genrsa
帮助:man genrsa
openssl rand -base64 NUM
NUM: 表示字节数
#openssl genrsa -out issue.key -des3 2048
或
#(umask 066;openssl genrsa -out issue.key -des3 2048) 使用这绿色的参数是非对称加密
生成后必须放到一个安全的地方,并且修改权限不让其他人查看
使用非对称加密后的key会有这些字样:Proc-Type: 4,ENCRYPTED
将加密key解密
#openssl rsa -in issue.key -out issue.key2
从私钥中提取出公钥
常用选项:
-in filename:指明私钥文件
-out filename:指明将提取出的公钥保存至指定文件中
-pubout:根据私钥提取出公钥
#openssl rsa -in issue.key -pubout -out issue.key.pub
cat issue.key.pub
-----BEGIN PUBLIC KEY-----
总结,用你的公钥来加密文件,只有你的私钥才能解密。安全性提高。