对称密码、非对称密码、散列算法与PKI

密码学要解决的问题:机密性、完整性、身份验证(抗抵赖性):


一、对称密码:

对称密码技术:发件人和收件人使用其共同拥有的单个密钥 ,这种密钥既用于加密,也用于解密,叫做机密密钥(也称为对称密钥或会话密钥)。

    能够提供信息机密性(没有密钥信息不能被解密)、完整性(被改变的信息不能被解密)的服务。

    对称式密码学又称:单钥密码学、秘密密钥密码学、会话密钥密码学、私钥密码学、共享秘钥密码学


 常见的对称式加密技术:

    DES(数据加密标准):分组式加密,算法源于Lucifer,作为NIST对称式加密标准;64位(有效位56位、校验8位),分组算法

    3DES:128位,分组算法

    IDEA(国际数据加密算法):128位,比DES快,分组算法

    Blowfish:32-448位,算法公开,分组算法

    RC4:流密码,密钥长度可变

    RC5:分组密码,密钥长度可变,最大2048位

    Rijndael:128位/196位/256位

    AES(高级加密标准):DES升级版,算法出自Rinjindael



对称密码的优点:

    用户只需记忆一个密钥,就可用于加密、解密;

    与非对称加密方法相比,加密解密的计算量小,速度快,简单易用,适合于对海量数据进行加密处理 。

    

对称密码的缺点:

    如果密钥交换不安全,密钥的安全性就会丧失。特别是在电子商务环境下,当客户是未知的、不可信的实体时,如何使客户安全地获得密钥就成为一大难题。

    如果用户较多情况下的密钥管理问题。N*(N-1)/2

    如果密钥多个用户被共享,不能提供抗抵赖性


例如:

    假设Alice和Bob是认识的,两人为了保证通信消息不被其它人截取,预先约定了一个密码,用来加密在他们之间传送的消息,这样即使有人截取了消息没有密码也无法知道消息的内容。由此便实现了机密性。

    blob.png

    但是,以上的实现过程存在以下问题:

    1):如果Alice和Bob是在互联网中彼此不认识的,那么Alice该如何和Bob协商(或者说传送)共享密钥(密码)?

    2):如果Alice要和100个人通信,他需要记住多少个密码?和1000个、10000个人......通信呢?

    3):如果Alice和其它人通信使用了和Bob相同的密码,那么如何知道这个消息一定是来自Bob呢?

    由此就引入了非对称密码。


二、非对称密码:

 使用一对密钥:一个用于加密信息,另一个则用于解密信息。

    两个密钥之间存在着相互依存关系:即用其中任一个密钥加密的信息只能用另一个密钥进行解密。

    其中加密密钥不同于解密密钥,公钥加密私钥解密,反之也可私钥加密公钥解密。

    密钥依据性质划分,将其中的一个向外界公开,称为公钥;另一个则自己保留,称为私钥。公钥(Public key)常用于数据加密(用对方公钥加密)或签名验证(用对方公钥解密),私钥(Private key)常用于数据解密(发送方用接收方公钥加密)或数字签名(用自己私钥加密)。

    机密性、完整性、抗抵赖性

    

常见的非对称式加密技术:

    Diffie-Hellman :最早产生,计算离散对数,是一种密钥交换协定算法,不加密、不产生数字签名。

        第一个非对称密钥协商算法,重点解决密钥分发问题

        基于“有限域上的离散对数计算困难”的难题

        通信双方在不可信的网络上交换他们彼此的公钥,再在各自的系统上生成相同的对称密钥。

        最初的Diffie-Hellman算法容易遭受到中间人***,应对这种***的方法是在接受某人的公钥前进行身份验证。

        不提供加密、数字签名功能。

    RSA:大素数分解,可加密,可签名

    EI Gamal :离散对数,可加密,可签名,最慢

    椭圆曲线:计算离散对数,功能与RSA相似,更快

    DSA:EI的变种,离散对数,不加密,可签名,比RSA慢

    背包:背包算法,可加密,可签名,已淘汰

    DSS:数字签名标准


如下:

首先,Alice为了保证消息的机密性,用Bob的公钥加密了数据,这样就只能用Bob的私钥解密消息,所以只有Bob才能看到消息。

blob.png

这固然实现了机密性,然而Bob如何验证消息是来自Alice呢,因为任何人都可以得到Bob的公钥。由此就有了下面这种方式:

Alice为了向Bob证明消息确实是她发的,就用自己的私钥加密消息然后发送给Bob,Bob用Alice的公钥解密了消息,于是知道了消息的确是Alice发的,因为只有用Alice私钥加密的消息才能用她的公钥解密。

blob.png

这样便实现了身份验证,然而任何人都可以用Alice的公钥来解密消息,这样机密性又无从保证了,于是又有了下面这种方式:

Alice先用自己的私钥加密数据(实现身份验证),然后再用Bob的公钥再次加密刚才加密过的消息密文(实现机密性),然后发送给Bob,Bob先用自己的私钥解密,再用Alice的公钥解密,如此便实现了机密性和身份验证。

blob.png

然而,非对称算法本身就耗资源,运算速度慢,此处还加密了两次,对于批量数据是绝对不可接受的,有没有更好的办法呢?由此又引入了下面的混合加密:


三、混合加密

混合加密简单的说就是用非对称算法交换对称秘钥,用对称密钥加密数据。

如下:

Alice先随机生成一个会话密钥,然后用这个会话密钥加密消息,再用Bob的公钥加密会话密钥,然后把消息密文和会话密钥密文(数字信封)都发送给Bob,Bob收到消息先用自己的私钥解密数字信封,得到会话秘钥,再用会话密钥解密消息密文。

blob.png

注意,这里不能实现身份验证,Alice无法向Bob证明消息是自己发的。


四、散列算法(哈希函数、单向加密)

消息完整性:

有很多协议使用校验位和循环冗余校验(Cyclic Redundancy Check,CRC)函数来检测位流从一台计算机传送到另一台计算机时是否被更改。但校验位和循环冗余校验通常只能检测出无意的更改。

如果消息被***者截获,在更改之后重新计算校验值,这样接收方永远也不会知道位流被篡改。为了实现这种保护,需要采用散列算法来检测有意或无意的对数据的未授权更改。


Hash(哈希)函数(也称为散列函数):输入可以是任何长度消息,通过一个单向的运算产生一个定长的输出。这个输出被称之为Hash值(散列值,也被称为哈希摘要),其具有以下特点:

    Hash值应是不可预测的。

    Hash函数是单向函数,不可逆。

    Hash函数具有确定性(唯一性),对于输入X应该总是产生相同的输出Y。

    寻找任何(x,y)对使得H(x)=H(y),在计算上不可行(强无碰撞,抗“生日***”)

    对任何给定分组x,寻找不等于x的y,使得H(y)=H(x),在计算上不可行(弱无碰撞)


散列的种类:

    MD2:128位,比MD4、MD5慢

    MD4:128

    MD5:128,比MD4复杂

    HAVAL算法:可变,MD5变种

    SHA安全散列:SHA-1 160位,SHA-256 256位,SHA-384,SHA-512;

    Tiger:192位,比MD5、SHA-1快

    RIPEMD-160:160位,MD4、MD5的替代


如下:

Alice使用散列算法对消息计算出消息摘要1,然后把消息摘要1附在消息明文后面一并发送给Bob,Bob收到消息后使用相同的散列算法对消息明文计算出消息摘要2,然后和消息摘要1比较,如果相同则表示消息未遭到篡改。

blob.png

但简单的这样做并不能实现真正的完整性,假如有人在中间截获消息修改后重新计算消息摘要附在后面,Bob依然认为消息未遭到篡改。同时也不能实现身份验证,于是便有了数字签名:


数字签名:

    数字签名是指用户用自己的私钥对原始数据的哈希摘要(Hash digest)进行加密所得的数据。

    信息接收者使用信息发送者的公钥对附在原始信息后的数字签名进行解密后获得哈希摘要。通过与自己用收到的原始数据产生的哈希摘要对照,以确认以下两点:

    信息是由签名者发送的(身份验证、不可抵赖性)

    信息自签发后到收到为止未曾信得过任何修改(完整性)


数字签名标准 :

    在1991年,NIST提议了一个为数字签名标准(Digital Signature Standard,DSS)的联邦标准 FIPS 186( 使用SHA),它最近一次更新实在2013年,作为FIPS 186-4被发布,包括了DSA、RSA、ECC

    DSS有两种创建签名的方法DSA和RSA。与RSA不同,DSA只能用于数字签名,并且比RSA慢,RSA能够用于数字签名、加密以及密钥分发。


如下:

Alice用散列算法计算出消息摘要,然后用自己的私钥加密消息摘要(数字签名),然后将消息明文和数字签名一起发送给Bob,Bob收到消息用Alice 的公钥解密数字签名得到原消息摘要(验证了Alice的身份),用相同的散列算法对消息计算消息摘要,然后将两个消息摘要进行比较,如果消息摘要相同则表示消息没有遭到篡改。

注意:这里假如有第三者Tom进行中间人***,他可以篡改消息,也可以重新计算消息摘要,但是Tom却没有Alice的私钥来加密消息摘要,此时如果Tom用自己的私钥加密消息摘要,当Bob收到消息后用Alice的公钥将无法解密数字签名得到消息摘要原文。

blob.png


综上,不能算法的不同功能:

blob.png


从上面可以看出,在这些实现过程中,公钥至关重要,那么我们又如何验证用户的公钥,就像本文的例子中,Alice如何得到Bob的公钥,得到公钥后又如何验证这个公钥就是Bob的?此时就需要一个双方都信任的第三方机构,由此引入PKI:


五、公钥基础设施(PKI)

PKI是由软件、通信协议、数据格式、安全策略等用于使用、管理、控制公钥密码体制的一套系统。它主要有三个目的:发布公钥/证书,证明绑定公钥的实体,提供一个公钥有效性的验证。

PKI提供基本服务:

    机密性

    完整性

    访问控制

    真实性

    不可否认性


数字证书:

PKI技术采用证书管理公钥,通过第三方的可信任机构认证中心CA (Certificate Authority),把用户的公钥和用户的其他标识信息(如名称、email、×××号等)捆绑在一起,在Internet网上验证用户的身份。

公钥证书是以数字方式签名的声明,它将公钥的值与持有相应私钥的主体(个人、设备和服务)的身份绑定在一起。通过在证书上签名,CA可以核实与证书上公钥相应的私钥为证书所指定的主体所拥有。

数字证书的格式是由CCITT X.509国际标准所规定的,它包含了以下几点:

    证书拥有者的姓名

    证书拥有者的公钥

    公钥的有效期

    颁发数字证书的单位

    数字证书的序列号(Serial number)

    CA的名称,并用CA的数字签名签署该证书

    CA所遵循的用来确定证书主体身份策略的标识符

    在证书中标识的密钥对(公钥及相关的私钥)的用法

    证书废止列表(CRL)的位置

ITU-T X.509并非证书的惟一格式。例如,Pretty Good Privacy (PGP)安全电子邮件是依赖PGP所独有的一种证书。


CA:

负责发放和管理数字证书的权威机构

具体功能:

    接收验证RA转发来的最终用户数字证书的申请。

    确定是否接受最终用户数字证书的申请-证书的审批。

    生成密钥对和证书

    向申请者颁发证书

    为签发的证书提供组织与责任的权威公证

    接收最终用户数字证书的查询、撤销。

    产生和发布证书废止列表(CRL)

    密钥管理(密钥备份、密钥恢复、密钥更新)

    数字证书的归档。

    密钥归档

    历史数据归档。


简单的说,PKI实现的功能就是用一个大家都信任的机构CA给用户颁发一个数字证书,证书中包含用户的公钥(这个公钥可以是用户自己生成的提交给CA的也可以是CA生成发给用户的)及相关身份信息。以本文的Alice和Bob为例,Alice为了向Bob证明自己是Alice和某个公钥是自己的,她便向一个Alice和Bob都信任的CA机构申请证书,Alice先自己生成了一对密钥对(私钥和公钥),把自己的私钥保存在自己电脑上,然后把公钥给CA申请证书,CA接受申请于是给Alice颁发了一个数字证书,证书中包含了Alice的那个公钥以及其它身份信息,当然,CA会计算这些信息的消息摘要并用自己的私钥加密消息摘要(数字签名)一并附在Alice的证书上,以此来证明这个证书就是CA自己颁发的。Bob得到Alice 的证书后用CA的证书(自签署的)中的公钥来解密消息摘要,这样就确认Alice的证书是CA发的,证书中的信息未遭到篡改,同时也得到了Alice的公钥。