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

对称密码、非对称密码、散列算法与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是认识的,两人为了保证通信消息不被其它人截取,预先约定了一个密码,用来加密在他们之间传送的消息,这样即使有人截取了消息没有密码也无法知道消息的内容。由此便实现了机密性。

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

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才能看到消息。

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

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

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

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

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

三、混合加密

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

如下:

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

注意,这里不能实现身份验证,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比较,如果相同则表示消息未遭到篡改。

但简单的这样做并不能实现真正的完整性,假如有人在中间截获消息修改后重新计算消息摘要附在后面,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的公钥将无法解密数字签名得到消息摘要原文。

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

从上面可以看出,在这些实现过程中,公钥至关重要,那么我们又如何验证用户的公钥,就像本文的例子中,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的公钥。

原文地址:http://blog.51cto.com/lidongfeng/2068348

时间: 2024-08-28 07:33:36

对称密码、非对称密码、散列算法与PKI的相关文章

MD5(单向散列算法)原理分析

注:本文章转载于网络. MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. MD5功能:    输入任意长度的信息,经过处理,输出为128位的信息(数字指纹):    不同的输入得到的不同的结果(唯一性):    根据128位的输出结果不可能反推出输入的信息(不可逆): MD5属不属于加密算法:    认为不属于的人是因为他们觉得不能从密文(散列值)反过来得到原文,即没有

加密散列算法——MD5

引用wiki的定义,散列函数(或散列算法,英语:Hash Function)是一种从任何一种数据中创建小的数字"指纹"的方法.该函数将数据打乱混合,重新创建一个叫做散列值的指纹.散列值通常用来代表一个短的随机字母和数字组成的字符串.好的散列函数在输入域中很少出现散列冲突.在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到.(具体专业术语请自行度娘) MD5是单向散列算法的一种,全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD

散列函数之单散列算法解决冲突问题

1. 问题 问题同<简单散列函数算法> 设有10个非负整数,用不多于20个的储存单元来存放,如何存放这10个数,使得搜索其中的某一个数时,在储存单元中查找的次数最少? 问题类似于,有10个带号码的球,放到编号为{0, 1, 2, -, 19}共20个盒子中,每个盒子最多放一个,问如何放,使能够用最少的次数打开盒子,知道任一个球所在的盒子编号? 2. 分析 <简单散列函数算法>中,已经分析得出,只要能解决冲突问题,就能将查找时间降为常量范围内. 思路:当一个数发生冲突时,再找一个没有

Java哈希散列算法简介 - MD5 &amp; SHA-512

Java哈希散列算法简介 - MD5 & SHA-512 在日常的开发工作中,我们常常会碰到这样的一个场景:我们需要有一种可靠的行之有效的方法来检验跟判断数据在传输过程当中的完整性.最常见的一种情况就是当我们传输文件的时候,由于网络故障或者其他的一些因素,可能会出现我们下载下来的文件不完整,这给我们日常的开发和维护带了一些难题:另外的一个较为常用的场景就是:有没有一种行之有效的方法让我们可以很方便的判断服务器上的文件是不是有最新的数据更新,比如我们现在的移动Hybird App开发,我们经常会发

Android数据加密之SHA安全散列算法

前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好奇心,所以趁着晚上没啥事,来学习一下. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 Android数据加密之Des加密 Android数据加密之MD5加密 Android数据加密之Base64编码算法 SHA加密算法 SHA(Secure Hash A

数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)

数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊----每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4. 鲍勃收信后,用私钥解密,看到信件内容. 5. 鲍勃给苏珊回信,写完后用Hash函数,生成信件的摘要(digest). 6. 然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature). 7. 鲍勃将这个签名,附在信件下面,一起发给苏珊. 8. 苏珊收信后,取下数

个人理解c#对称加密 非对称加密 散列算法的应用场景

c#类库默认实现了一系列加密算法在System.Security.Cryptography; 命名空间下 对称加密 通过同一密匙进行加密和解密.往往应用在内部数据传输情况下.比如公司a程序 和B程序 .a程序要给B程序发送数据 但是为了防止明文发送 数据被窃取.那么我就定了一个协议传输的数据的byte字节都统一+1  而接收数据的情况下将Byte字节统一-1 然后就能获得正确的 数据(当然这个是一个简单的加密) ,真正应用的加密肯定比这个复杂很多 非对称加密 传输数据的双方有各自的公钥和私钥  

加解密算法一:散列算法、对称加解密

.Net中的加解密操作所涉及的对象都在命名空间System.Security.Cryptography下,所以应先在程序中添加using System.Security.Cryptography. 1.散列算法: 用来产生一些数据片段(例如消息或会话项)的散列值的算法.好的散列算法具有在输入数据中的更改可以更改结果散列值中每个比特的特性:因此,散列对于检测在诸如消息等大型信息对象中的任何变化很有用.此外,好的散列算法使得构造两个独立的有相同散列的输入不能通过计算方法实现. 典型的散列算法包括 M

散列算法和哈希表结构

散列算法和哈希表结构 算法概述 Hash ,一般翻译做" 散列" ,也有直接音译为" 哈希" 的,就是把任意长度的输入(又叫做预映射, pre-image ),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不 同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值.简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数. 哈希表 数组的特点是:寻址容易,插入和删除困难: