Linux简单介绍加密解密算法
对称加密
加密方和解密方使用是同一个密钥,加密解密的速度都很快,先将数据明文
分成数据块儿,一般来讲是大小相同的,如果到最后剩下的不能与其他数据块儿的
大小相同,那么就给它添加一些填充物,然后对每个数据块儿逐个加密,
然后把加密后的数据块儿发给对方,每一次管理一块儿,
但是,加密后的块儿怎么处理,因为每一个块儿都是单独处理,对方在破解数据时
每一块儿独立破解,也就是说这样的加密过程对反破解并没有任何帮助,
对于加密以后的数据块儿的处理有以下两种方法
ECB:每一块儿单独加密,加密一个传递一个,
CBC:加密或密文块儿链,通过抑或运算实现,每一个数据块儿,在发送给对方
之前会实现将此数据块儿与此前的数据块儿做一次抑或运算,并把结果发送给对方
所以得不到第一个块儿,得到其他也就没有用,即使是第一块,也会和一个随机数
进行抑或运算
其最大好处在于,做两次抑或运算后可以将数据还原
算法:DES:数据加密标准,使用56位的密钥长度
AES:高级加密标准,可以使用128、192、256三种长度的密钥
3DES:对原有加密3次,
Blowfish
Twofish
RC6
IDEA
CAST5
缺陷:1、一个人跟众多对象通信的时候需要记的密码过多
2、密钥分发困难,是最大的难题,没有一种可靠的手段将密钥送给一个
没有见过面的对象
非对称加密
公钥加密算法:DSA,RSA,EIGamal
加密方和解密方使用不同的密钥
功能:加密解密
用户的身份认证,RSA两者都可以实现,而DSA只能加密数据
公钥,私钥
公钥是从私钥中抽出的一段特征,公钥隐含在私钥中
现在主流的密钥长度是2048
缺陷:1、加密速度慢,比对称加密慢3个数量级 1000倍,一个数量级10倍
2、公钥加密一般不用于加密数据,主要用于实现用户认证,数据加密
主要是通过对称加密实现的
如何实现用户认证:
现在假设,有两个通信的对象,一个较小黑,一个较小白,现在小黑给小白发了
一封电子邮件,但是,小白在接受邮件的时候不希望自己的邮件的内容被篡改,
这时小黑就将邮件内容加密且说自己是小黑,并产生一个公钥和一个私钥,
私钥小黑会随身携带
而且不能外泄,公钥则连同邮件一起发给小白,这是小白拿着小黑的公钥如果能够
解密,则说明小黑就是小黑...这就实现了认证,但是如果小黑加密的数据很大,再加上
公钥加密要用很久时间,等加密好,小黑也无语了,所以小黑加密的不是数据
而是这段数据的特征值,说到特征值,下面就说一下单向加密》》》
单向加密
雪崩效应:输入的数据有一点点不同,结果会有巨大不同,主要目的在防暴力破解
单向加密就是去计算一段数据的特征值,加密过程是不可逆的,是去计算一段数据的特征码,是独一无二的,用于对
数据完整性的校验
无论你输入的数据是多长,输出的结果都是一样长度
MD5:message digest,输出结果固定长度128bit
SHA1:secure hash algorithm安全的哈希算法,输出结果固定长度160bit
身份认证:
单向加密在实现用户身份认证的时候不会去加密整段数据,而是先去计算这段数据的特征值,
把它的特征值用私钥加密,加密以后附着在数据后面,一起发给对方,在对方收到以后,对方
可以验证两方面的内容,第一用户的身份,第二数据的完整性,接收方先用发送方的公钥对其解密
如果能解密就验证了对方了身份,此时接收方会获得这段数据的特征值,然后接收方也用相同的
算法进行运算,得到一个数据的特征值,如果这两个特征值相同,则说明数据在发送过程完好无损
如果不相同,则说明数据有改动
假设还是小黑和小白通信,双方都希望在数据的发送过程中,既能实现用户身份验证,
又能实现数据加密,还能实现数据的完整性,那该怎么办呢?
现在小黑在发送数据前,先将数据用单向加密,计算出特征值,然后再用私钥解密将特征值加密
接下来会再用产生一个一次性的密码,用小白的公钥将这个密码加密然后放在数据后,最后再用对称加密
将全部加密,这时就是密文了,到了小白那里以后,小白先用自己的私钥拿到那个密码,然后再用那个
密码解密,获得数据的特征值,然后再用单向解密计算出一个特征值,如果这两个值相同,则说明
数据完好,以上过程就实现了三重验证
这三项结合起来是现在电子商务的基础。
可以实现这整个过的工具:
opssh
gpg
但是这两个过程还存在问题,小白怎样去获得小黑的公钥呢?在传输公钥的时候也有可能
出现欺骗,这怎么解决了?
IKE:互联网密钥交换,实现双方使眼色交换密钥,和密钥本身不在互联网上
传播
PKI:公钥基础设施,或公钥基础架构,CA证书颁发机构,证书内放的就是通信人的公钥信息
怎样基于证书通信:
双方在通信时都出示证件,这个证件由某个权威机构发放,只要验证证件内的有效信息
就可以验证对方的身份,但是在发证的时候怎样防止中间出现欺骗呢?
这又是一个鸡生蛋,蛋生鸡的问题,想想该如何解决呢?
所以一些操作系统在安装时就已经将一些权威的发证机构的证书放在你的电脑里了,这样在一定程度
上可以解决一些问题
证书的格式:X509,PKCS
证书废弃列表:CRL
最常见的攻击“man in the middle”主要是双方身份无法验证
会话劫持,
数据插入,
数据篡改,
这些都是常见的威胁
加密解密用于:
1、用户密码/数据嗅探 password/data sniffing
2、数据操纵,data manipulation
3、authentication manipulation 认证
4、equivalent to mailing on postcards
这几个方面
加密算法的基本法则:kerckhoff's principle
1、一般来讲加密本身并不靠算法,算法固然很关键能将明文变成密文
但是一项真正的加密过程,你的数据是否会被破解,主要不能过强依赖于算法本身,
而要依赖于密码,算法的研究周期很长,更改一个密码很简单,但是更换一个算法就麻烦了
算法需要耗费很多精力,只要算法不公开,就无从下手破解
2、电子商务的过程中不仅要保证数据加密,还要保证不被别人看见
算法:
1、随机数来源靠得住
########openssl#########l
用C语言实现了很多种常见的加密算法:
三个组件:
1、libcrypto 库文件 专门实现加密解密的库文件,
2、libssl 库文件,主要是实现https这样协议
3、openssl 多用途加密工具,还可以制作一个CA出来
一般来讲openssl都会装上,使用一个openssl加一个错误的选项就能看见它的使用
选项
单项加密时的用法:
openssl enc -des3 -salt -a -in inittab -out inittab.des3
实现对于一个文件加密 enc是加密 -des3是加密算法 -salt 加入杂质
-in后面跟文件名 -out加密后放在哪个文件里
openssl enc -d -des3 -salt -a -in inittab.des3 -out inittab
-d表示解密
openssl dgst -sha inittab 表示计算inittab文件的特征值
用户认证时passwd的用法,怎么去帮你生成一个类似于保存在/etc/shadow文件里的密码一样
openssl passwd -1 -1表示使用MD5算法
[root@server46 ~]# openssl passwd -1
Password:
Verifying - Password:
$1$7HW0kv8y$IntkyNppqtTQ2fHAJ1FMk1
openssl passwd -1 -salt 杂质 这样计算结果就一样了
[root@server46 ~]# openssl passwd -1
Password:
Verifying - Password:
$1$7HW0kv8y$IntkyNppqtTQ2fHAJ1FMk1
[root@server46 ~]# openssl passwd -1 -salt 7HW0kv8y
Password:
$1$7HW0kv8y$IntkyNppqtTQ2fHAJ1FMk1
man sslpasswd可以查看用法
非对称加密:
openssl怎样发证:
切换目录到/etc/pki/tls/certs
make *.key就可以产生一个密钥
make *.cert可以生成一个证书,主要是看文件后缀生成文件,是redhat提供的便捷方式
make my.key就可以生成一个密钥
(umask 66;openssl genrsa 1024 > my.key)
生成私钥文件
这是在一个子shell里进行,umask只对后面的这一个命令有效,umask执行完以后就恢复到原来
提取公钥:
openssl rsa -in my.key -pubout -out myr.pubkey
[root@server46 certs]# (umask 66; openssl genrsa 1024 > my.key)
Generating RSA private key, 1024 bit long modulus
...++++++
........++++++
e is 65537 (0x10001)
[root@server46 certs]# cat my.key
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDRSlvZZ7p7sRbczdGhcw/8z5mzEKIjDZw63ffsxCDC9XWKO0vE
FaxbPrgwZYF+iu8QHUKVzuJoqO8MmfY7p9aGz2WT2GQ/wUTnjsbL8mNbSclV/2m8
K0XZqSLsKzuhaBOFC+sylQvnZiXP23slNWZIuV0EVh9k2ULSV4f8B5QtywIDAQAB
AoGATNkA4NM1pjVgL7NjReT5+dpAlX+GCVj2BKd8YXOik/ONNTSQnW9X2ikteJfM
9KoPHdugl2FfwQ5GuFnQEBeQrUV5SnR09k2OZTsdOMVNXqamf4V/rXidOs+L3RVK
Q4X6vpasS1CJ1/q/fCcsi1Nl0nLcV9stLXbmEzYqE6+hwAECQQDqxrbF5W9j5vVM
ZkKmvx1ViojwTJovlkOtl6RSkqHMR3msnHhizbc+iGrGiP/vH9H+AvDK7AJPNVng
kHAa5YGbAkEA5DXX0dIajPoAdLvmNG1kNY1fp6IJjfR8UJRWeOwjhVjul1yp47hP
bM/f55OmowdsQamfNVwk4P5iYIcZ8uwfkQJBAJoXToLYsaF6Rumb/IcAzLoGMRa2
0EQHdegLrVhc0UEIcH2wPPtsVab/VkV0SbaixerX9z7YZDOkqpbPdiTRGZ0CQBWv
2DakVMmY6HovcQ0CaEd+i9yOVYIb/cRalG0hY67EaMgRkkOFvGaGyqxjJ67Ogccr
q2mSvB51jjvGGv0u20ECQQCHvgJkF3xHkQnahqCTTgym0CNocHhVfyo6KveIfBAk
Vz69+zsGK2kKBOseSbgRKqVmM21Iqu0aZatjEevHwZIo
-----END RSA PRIVATE KEY-----
[root@server46 certs]# openssl rsa -in my.key -pubout -out my.pubkey
writing RSA key
[root@server46 certs]# cat my.pubkey
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRSlvZZ7p7sRbczdGhcw/8z5mz
EKIjDZw63ffsxCDC9XWKO0vEFaxbPrgwZYF+iu8QHUKVzuJoqO8MmfY7p9aGz2WT
2GQ/wUTnjsbL8mNbSclV/2m8K0XZqSLsKzuhaBOFC+sylQvnZiXP23slNWZIuV0E
Vh9k2ULSV4f8B5QtywIDAQAB
-----END PUBLIC KEY-----
发证步骤:
1、首先生成一对密钥(S/P密钥)
2、然后把公钥放在一个叫证书颁发请求里(里面包括你的公钥,姓名,地址,等一些列描述信息)
发送到证书颁发机构
3、CRT证书就生成了
自己成为CA:
1、cd /etc/pki/CA
有一个 private 文件,里面专门放CA的私钥文件
2、给自己生成一个密钥
(umask 66; openssl genrsa 2048 > private/cakey.pem[这里只能叫cakey.pem])
ll private
给自己发证书:
openssl req -new -x509 -key private/cake.pem -out cacert.pem
openssl req -new -x509 -key private/cake.pem -out cacert.pem
接下来会提示你输入一些信息
写完之后就是一个自签的证书
接下来就可以给别人发证了
view plaincopy to clipboardprint?
openssl req -new -x509 -key private/cake.pem -out cacert.pem -days3655
openssl req -new -x509 -key private/cake.pem -out cacert.pem -days3655
3、编辑cA的配置文件
view plaincopy to clipboardprint?
vim /etc/pki/tls/openssl.cnf这里定义了
vim /etc/pki/tls/openssl.cnf这里定义了
找到【 CA_default 】字段
修改 dir 改为绝对路径
这里有些目录没有需要我们手动建立,在这个配置文件内我们都能找到
然后还可以修改默认信息
到这里才 算是一个完整的CA
4、接下来给web服务器做一个证书:
view plaincopy to clipboardprint?
cd /etc/httpd
mkdir ssl
cd ssl
(umask 66;openssl genrsa 2048 > web.key)
cd /etc/pki/CA
mkdir certs crl newcerts
touch index.txt serial
echo 01 > serial
openssl req -new -key wed.key -out wed.csr 这是一个证书颁发请求
opssl ca -in wed.csr -out web.crt 颁发证书
cd /etc/httpd
mkdir ssl
cd ssl
(umask 66;openssl genrsa 2048 > web.key)
cd /etc/pki/CA
mkdir certs crl newcerts
touch index.txt serial
echo 01 > serial
openssl req -new -key wed.key -out wed.csr 这是一个证书颁发请求
opssl ca -in wed.csr -out web.crt 颁发证书
然后敲两次回车 就ok了