加密解密


名词:

    明文:直接可以看懂的数据

    密文:经过某些算法,把明文变成杂乱无章的代码。

    算法:处理明文和密文的方法

    密钥:加密解密时算法使的代码


加密类型

    对称加密 :加密和解密使用同一个密码。一般加密与解密速度相对较快。

                常用的算法:

                            DES:已被破解。使用56位加密

                            3DES:三倍于DES的加密算法,DES的升级

                            AES:高级加密标准,可以自己选择加密位数。

                            blowfish:


    非对称加密:加密与解密不使用同一个密钥,而是私钥加密只能公钥解密,公钥加密只能私钥解密。公钥从私钥中提取出来。由于密钥相对较长,加密解密所用时间较长。私钥只有自己留存,公钥可以让任何人拥有。需要一对密钥。

                    常用算法:

                            RSA:此算法可以做加密和身份认证。

                            DSA:只能用于身份认证。


    单向加密:用来抽取数据的特征码,特征码长度固定。用来确认数据是否变动过。数据只要有稍微变动,特征码有天大的差别。

                    常用的算法:

                            MD5   :输出长度128位

                            SHA1  :输出160位长度

                            SHA384

                            SHA256



密钥交换方式

            使用对方的公钥加密后发给对方

            使用DH算法交换密钥。


密钥颁发机构

CA:Certification Authority 数字证书认证中心,解决数字证书所有者公开的公钥身份确认。一般是可信任的第三方机构。

RA:Registration Authority 数字证书注册审批机构,给申请数字证书者发放证书,发放前对申请者进行审合登记,它是CA的延伸机构。

PKI:Public Key Infrastructure,公钥基础设施,由密钥管理(发放,吊销),密钥合法性验证,认证机构,密钥发放等组成。为数据完整性,隐私性,数据身份认证等提供基础服务。



通用证书认证协议标准由x.509定义。有三个版本,


CA搬发的证书包含了以下内容(x.509最新版本)

    版本号:证书格式使用x.509的那个版本。用来区分不同版本

    证书序列号:在CA中的维一标识。用一个整数标识。

    算法参数:给此证书签名时使用到的算法

    发行者名称:由谁颁发

    有效期限:证书有效使用时间

    主体名称:证书拥有者名称,由申请者自己填写。如果用在主机上,此名称必须为主机名。

    公钥:最关键的部分,由申请者自己填写。

    发行者的ID:颁发此证书机构的维一标识

    主体ID:给证书拥有者的维一ID

    其它信息:

    CA签名:CA用自己的私钥对此证书的特征码加密。以保证此证书的合法性。



openssl,ssh安全套接字(secure sockets layer).openssl,ssl协议一种实现,是开源的。用来对互联网通信之间的数据加密传输。借助它,可以达到数据的保密性,数据完整性和数据身份认证。此功能工作于tcp/ip协议模型的应用层与传输层之间,如果传输需要加密,就借助ssl传输。


spacer.gifwKiom1PeGNiymkGAAAD2QJBmhtI014.jpg



ssl通信模型


为了保证数据完整性,隐私性,数据发送者身份真实性,数据需要经过以下加工。

    验证对方公钥合法性:使用ca的公钥取出对方公钥中ca签证过的对方公钥特征码,自己计算对方公钥特征码与ca签证中的特征码对比对。如果不一样,视为不受信任。(此时为对方颁发密钥的ca机,构必须为自己所信任。)

    发送端,前提:需要向ca机构申请证书,并且得到对方的合法公钥。

        1,有数据需要加密传时,先使用单向加密给源数据计算一个特征码。由特征码可以保证数据完整性。

        2,使用自己的私钥对特征码加密,这样就可以保证源数据特征码是自己所计算。标识了特征码的身份。此步为数字签名。

        3,使用对称加密,生成一个密码,用此密码加密源数据和已经过签名的特征码,这一步保证了数据的隐私性。

        4,使用对方的公钥加密上一步使用的密码,这一步保证了密码只有对方才可以看到。使密码可靠传输有所保证。

        5,把加密后的密码与数据一并发送给对方。

    接收端,

        1,得到数据后,先用自己的私钥解密对称加密使用的密码。

        2,使用解密后的密码对数据解密,得到源数据和对方签名过的数据特征码。

        3,使用对方的公钥对特征码解密,自己计算源数据牲码并与对方给出的特殊码做比对。来保证源数据完整性和源数据发送者的身份。

                 3.1 如果需要验证对方公钥的合法性,取出对方证书中ca签名部分解密,计算对方公钥的特征码与解密后的特征码比对。比对无误则受此证书。

wKiom1PeQaWBDnhzAAJojiEsD_8076.jpg

            

                在实际应用中,此模型只使用了一部分,因ca所颁发证书有使用费用,通常服务器没认证客户端使用其它机制。使用ssl客户端向与服务器端第一次通信时会索要服务器端的证书,并且根据自己信任ca公钥来确保服务器端的证书无误。如果对方的证书不是自己信任ca颁发的证书,一般会向用户提示,这时用户需要自行选择是否信任此服务器。如与12306交易时,由于12306证书颁发机构没有在windows系统中系统,交易时会提示用户是否信任此站点。




openssl,命令使用

#rpm -qa openssl #查看当前系统是否安装了openssl

#rpm -ql openssl  #查看openssl安装包都生成了那些文件

#openssl version    #查看当前系统使用openssl的版本


openssl软件功能主要有三个部分组成

   /usr/bin/openssl  :多用途命令行工具,可以加密解密,         

   /usr/lib64/libssl.so.10  :ssl协议实现,使用ssl传输数据时调用此库

   /usr/lib64/libcrypto.so.1.0.1e :加密库,其它程序加密解密时调用此库,里面有很多种加密算法


命令使用方法

spacer.gifwKiom1PeGOexVIoNAANPGF_-EEc053.jpg


使用openssl对文件进行对称加密

    ens 子命令的选项,

        -des3 :指定加密使用的算法,比如此处指定算法为des3

        -in filename:指定要加密的文件名。

        -out filename:指定加密后文件名

        -pass :指定加密使用的密码

        -a :使用base64编码处理,加密文件使用。

        -e :表示此过程为加密

        -d:表示此过程为解密

        -salt:加密时添加额外特性,以增加加密强度。如果不指定,默认使用此选项。


加密wukui.txt文件的过程

[root@wukui ~]# echo aaabbb >> wukui.txt 
[root@wukui ~]# openssl enc -des3 -e -in wukui.txt -out wukui.txt.enc -a  
enter des-ede3-cbc encryption password:                   #输入密码
Verifying - enter des-ede3-cbc encryption password:   #再次输入密码

[root@wukui ~]# cat wukui.txt.enc 
U2FsdGVkX19i59EEB5m8+enxgNKVdmaC 
[root@wukui ~]# cat wukui.txt 
aaabbb 


解密wukui.txt.enc过程

[root@wukui ~]# cat wukui.txt.enc 
U2FsdGVkX19i59EEB5m8+enxgNKVdmaC 
[root@wukui ~]# openssl enc -d -des3 -a -salt -in wukui.txt.enc -out wukui.test 
enter des-ede3-cbc decryption password:     #输入密码
[root@wukui ~]# cat wukui.test 
aaabbb 


openssl 计算文件的特征码

    dgst 子命令选项

        -md5 :指定算法

        -out filename:指定特征码输出到的文件名,如果不指定文件名,会直接打印到屏幕上。

[root@wukui ~]# openssl dgst -md5 wukui.txt.enc                           #使用openssl命令计算
MD5(wukui.txt.enc)= 014cfd3c170fbaa5bca8a288c1e88c4d             #计算后结果
[root@wukui ~]# md5sum wukui.txt.enc                                            #使用md5sum命令计算
014cfd3c170fbaa5bca8a288c1e88c4d wukui.txt.enc                          #计算后结果


MAC:消息摘要码,单向加密的延伸类应用,保证数据在传输中数据完整性,但不依赖公钥机制。使用的算法有CBC-MAC,HMAC等。



passwd 子命令,用来加密密码。

    -1:使用md5加密

    -salt abcdefgh :指定额外的字符串到加密中,以增加密码强度。

    -in filename :指定读取密码的文件

    -stdin :表示密码从标准输出读取。

示例:

[root@wukui ~]# openssl passwd -1 -salt asdf 
Password:    #输入密码
$1$asdf$RPWJ/sut29dokbBFHCkFE/


rand 子命令,输出随机字符串

#openssl rand -base64  6     #生成大小写字母,带字符和数字的随机字符串

#openssl rand -hex 6            #生成小写字母和数字的随机字符串 

#openssl passwd -1 `openssl rand -hex 6`    #使用随机数指定salt方式加密密码。


密钥生成

gendsa:生成dsa算法密钥

genrsa:生成rsa算法的密钥

    -out filename:生成后密钥文件名。

     # openssl genrsa 4096 #生成rsa算法的密钥,长度为4096(可选长度为1024,2048,4096等)

示例1:

        [root@wukui ~]# openssl genrsa -out wukui.key 4096 

        Generating RSA private key, 4096 bit long modulus


        .........................................................................++


        ...........++


        e is 65537 (0x10001)


        [root@wukui ~]# ll wukui.key

        -rw-r--r-- 1 root root 3243 Aug 2 11:05 wukui.key

        [root@wukui ~]# chmod 600 wukui.key                               #密钥文件只应该让属主有rw权限

示例2:

       #   (umask 077;openssl genrsa -out wukui.key 4096)           #这样就密钥权限就为600了

rsa :从rsa算法生成的密钥中提取公钥

    -in filename:指定密钥文件

    -pubout:表示提取公钥

    -text:输出为纯文本格式

    -noout:不输出密码编码版本。

    -out filename :指定输出到那个文件中

示例:

    # openssl rsa -in wukui.key -text -pubout -noout -out wukui.key.pub  #把公钥输出到一个文件中

    # openssl rsa -in wukui.key -pubout   #查看密钥的公钥