❶ HTTPS的前世今生和原理详解
HTTPS网络:
HTTP是明文传输的协议,数据很容易被窃听和篡改,并且攻击者很容易冒充客户端和服务端,HTTPS可以解决这两个的安全问题。HTTS仍是HTTP协议,只是在HTTP与TCP之间添加了用于加密数据的TSL/SSL协议。很多其它应用层的协议也采用在传输层之上添加TSL/SSL协议来保证安全,如FTPS、IMAPS。
加密和解密使用的是同一个密钥。加密和解密的双发都需要持有同一个密钥。常见对称加密算法:AES、DES、3DES。
加密和解密使用的是不同的密钥,加密时使用的密钥称为公钥匙,解密是使用的密钥称为私钥。使用公钥加密的密文只能用私钥解开。公钥可以发布出去使用,但私钥一定不能泄漏。常见的非对称加密算法:RSA、背包算法、ECC。
数字签名用于校验数据是否被篡改,即数据是否和原数据是否一致。
数字签名包含签名和验证两个运算。数字签名具有不可抵赖性,签名验证正确后就不能否认。
数字签名一般包含一个自己知道的私钥和一个公开的公钥,与传统的加密不同的是签名时使用私钥,验证签名是使用公钥。
1994年Netscape提出了SSL协议并制订了SSL协议的原始规范,即SSL1.0。但由于SSL1.0使用的是弱加密算法而受到密码学界的质疑,所以SSL1.0并没有公共发布。
SSL1.0之后Netscape对SLL协议规范进行了重大改近,并在1995年发布 SSL2.0协议 。虽然SSL2.0版本被认为是一个相当强大且健壮的协议,但仍存在一些易受攻击的漏洞,所以并没有得到广泛的使用。
由于SSL2.0的安全问题,Netscape联合哈佛的Paul Kocher等人重新设计了SSL协议,并在1996年发布,即SSL3.0版本,该版本较2.0版本有较大的差别。 SSL 3.0协议 获得了互联网广泛认可和支持。
随着互联网的飞速发展,网络安全越来越重要,业界非常迫切的需要一个标准的安全协议,于是IETE接手了SSL协议,并将其更名为 TSL(Transport Layer Security Protocol,安全传输层协议 ,并在1999年发布了TSL1.0版本。
不过TSL1.0于SSL3.0差别并不大(TLS 1.0 内部的协议版本号其实是3.1)。
虽然TSL是SSL的升级,但一些称呼上还存在混淆,所以大家通常将二者统称为SSL/TLS协议。
TSL1.1 于2006年发布,主要是修复了一些漏洞。
TSL1.2于2008年发布,1.2版本主要移除了一些老旧的加密套件,并引入了 AEAD 加密模式。1.2版本是目前应用最广泛的版本。
TSL1.3 于2018年发布。1.3版本在2014年提出,经4年的反复修改直到第28个草案才于2018年正式纳入标准。
1.3版本相较1.2版本有很大的改动,即增强了安全性也也大大提升了访问速度。主要有以下改动:
在公网通讯时想要保证通信信道的安全,目前来看只有将通信的数据进行加密后可防止窃听、冒充和篡改。
防止窃听:
数据加密后传输的就是加密后的密文,这些密文即使被窃听了但在没有解密的密钥的情况下是得不到真正的内容的。
防冒充和篡改:
通讯的数据加密后传输,在没有加密用的秘钥的情况下时无法构造出合法的数据包的,也就无法冒充或篡改数据。
将通信数据加密后传输可以解决很多的安全问题,但要实现通信的加密最为关键的点在于通信的双发用于加密的密钥怎么协商才能保证密钥不被泄漏和篡改那?密钥协商是HTTPS中最大的难点。
通信时使用对称加密,并且在客户端请求时直接将对称加密的密钥返回给客户端。
但在安全的信道建立起来之前任何传输仍是明文的,使用明文风发密钥毫无安全性可言,并且由对称加密使用同一个密钥,所以第三方在窃听到密钥后即可以窃听和篡改数据也可以冒充客户端和服务端。 所以直接分发对称加密的密钥显然行不通。
为方便说明这里只看客户端单向向服务端发送数据的情况,服务端向客户端发送数据与其类似。
通信时使用非对称加密,在客户端请求时将公钥放回给客户端。
但返回公钥时仍然是明文传输的,所以公钥还是很容易就会被泄漏,泄漏了公钥后,虽然第三方无在没有密钥的情况下是没法窃听数据或直接冒充服务端,但由于泄漏了公钥第三方还是可以冒充客户端或者进行‘中间人’攻击。
所以单纯使用非对称加密也是行不通的。
'中间人’攻击:
只要通信时使用的密钥不泄漏,那么在通信时完全没必要使用非对称加密,毕竟对称加密的效率更高。所以可以在通信正式开始前使用非对称加密来协商出通信时使用的对称加密的密钥,步骤如下:
虽然对称加密与非对称加密结合可以使我们或得两种的优点,但这样还是无法避免‘中间人’攻击。
DH密钥协商算法不会直接交互密钥,而是交互用于生产密钥的参数,DH算法基于当前‘无法’对大数进行质数分解来保证即使参数泄漏了,第三方也无法通过参数推导出密钥。
DH算法密钥协商步骤:
通过以上步骤客户端和服务端就协商出了密钥s,并且整个过程中没有传输过s。为了防止被破解a和b通常非常大,p 是一个至少 300 位的质数,g一般很小通常是3或者5.
但DH算法的缺点也很明显,DH无法防止冒充,还是会受到中间人攻击。
数字证书(digital certificate),又称公开密钥认证(Public key certificate)或身份证书(identity certificate),用来下发公钥匙和证明公钥拥有者的身份。
证书由第三机构颁发用来验证服务提供方的合法性,使用时服务提供方将证书给到客户端,客户端通过特定的机制验证书的合法性,从而信任提供证书的服务端和证书中的公钥。
数字证书以文件的形式存在,证书文件中包含了公钥信息、拥有者身份信息(主体)、以及数字证书认证机构(发行者)对数字证书自身的数字签名,证书的数字签名用来保证证书没有被篡改。
一般我们向CA申请证书时不用我们我们提供公钥和私钥,CA会给我们分配一个密钥对,并将公钥写到证书中,然后将证书和私钥给我们。
证书有统一的标准,其合法性(证书是否过期、数字签名是否有效、颁发的机构是否可信)通过一定的程序按标准来进行验证,如浏览器会保证HTTPS证书是否是合法的,linux下openSSL库提供了证书验证功能。
核对证书后若证书可信,就可以使用证书中的公钥对数据进行加密与证书的拥有者进行通信。
HTTPS的证书在扩展字段中包含了域名相关的信息,所以HTTPS的证书在申请的时候CA会严格的校验申请的机构或个人是否真的拥有这个域名。
数字证书认证机构(英语:Certificate Authority,缩写为CA)。证书标准是公开的任何人都可以去制作证书,但自己制作的证书是不受信任的,只有权威的CA机构颁发的证书才被信任。
权威的CA证书审核和部署流程严苛而繁杂,所以权威的根证书的有效期一般在几十年内。
也只有权威的CA的根证书会被各大操作系统支持,将其预制与操作系统内。
证书一般遵循X.509规范,主要包含以下内容:
CA生成的证书包含以上内容和一些扩展字段外,还包含CA使用自己的私钥对这些内容进行加密后的密文。在验证证书时使用CA的根证书对秘文进行验证,从而判断证书是否是合法的。
权威结构使用根证书来签发二级CA证书,二级CA证书可以给其它服务签发证书。但不是所有证书都可以继续签发新的证书,证书使用基础约束扩展来限制证书的签发,我们普通申请到证书基础约束扩展都是False的。查看根证书的基本约束可以看到证书颁发机构为‘是’。
根证书并不直接签发服务的证书,只要基于以下两点:
上一级证书对下一级证书进行签名,签名值包含在证书中,可以使用上一级证书中的公钥来验证下一级证书的签名值。根证书的签名是自己签的,并且验证签名的公钥包含在根证书中。
完整的证书连的关系应该有服务器放回,但有的并没有返回,对于没有放回完整证书连的证书,证书中的扩展字段CA 密钥标识符( Authority Key Identifier)记录了证书的上一个证书,通过该字段获取到上一级中间证书,再从中间证书的该字段中继续向上查找,直到根证书。
服务端最好可以返回证书连,这样可以避免浏览器自己去查找,提示握手速度。服务器返回的证书链并不包含根证书,根证书预至与操作系统内部。
在linux中openssl库会集成根证书。openssl的根证书的存放路径通过‘openssl version -a’查看。
校验证书时先根据证书链逐级校验证书的签名,签名校验的最关键的在根证书。根证书预至于操作系统中,CA要将自己的证书预至与各个系统中是非常困难的,所以预支与系统中的根证书是可信的。
回顾一下对于HTTPS的证书来说申请的时候CA会严苛的验证,保证这个域名是属于申请这个证书的机构的。这样攻击者或许可以伪造一个改域名的证书,但伪造的证书的根证书在系统中并不会存在,所以伪造的证书是不会被信任的。这样通过证书链的校验就可以有效的防止服务端被‘冒充’。
经过上面证书数字签名验证只是验证了证书确实是合法的证书,后还要验证证书的有效性,有效性验证主要包括以下字段:
验证合法的证书也可能由于种种原因被吊销,如证书的私钥泄漏了、证书错发了等,为了验证证书是否有效引入了证书吊销机制。
OSCP是证书提供方提供的证书验证接口,用户通过调用OSCP接口验证证书是否被吊销了。
但OCSP服务可能因为策略或服务故障导致无法访问,这时一般浏览器会选择信任证书,毕竟证书被吊销的情况只是极少数。也有部分CA将OCSP失败后的策略写到证书的扩展字段中,用用户根据扩展字段去做处理。
OSCP方式有自己明显的缺陷,为了验证证书而请求OSCP的同时也将自己在什么时候访问了什么服务也告诉了CA,CA利用我们的访问数据作恶咋办,还有OCSP的接口很慢的话不就拖慢了我们服务的相应数独。为了解决这两个问题各大CA厂商联手推出了CRL方案。
CRL方案是将被吊销的证书列表定期拉去到本机,一般是几天拉取一次。在校验证书时去本机列表中查找。
CA会在证书的扩展字段中写入CRL更新的地址:
CRL也有自己明显的确定,首先CRL是定期拉取的不能保证实时生效,然后CRL的列表一般很大可能达到数M。
CRLSet是chrome自建自用的解决方案。google觉得CRL更新太慢了,每个CA都有自己的CRL并且CRL内容也太多了。于是自己搞了一个CRLSet,将各大CA被吊销的高风险证书添加到CRLSet中,chrome在校验证书时可以去自己CRLSet中校验。
CRLSet只有各个CA吊销的证书的部分,大概包含所有吊销证书的2%。
CRLSet的更新相对快一些,最慢几个小时就会从各个CA中更新一次,CRLSet可以用在需要紧急吊销证书的情况下让吊销快速生效。
CRLSet提供了 https://github.com/agl/crlset-tools 工具来拉取和校验证书是否在CRLSet中。
可以在 chrome://components/ 中更新chrome的CRLSet
客户端向服务端发送hello请求,里面包含了客户端SSL/TSL的版本、支持的加密套件和一个随机数Random1
服务端收到客户端的hello后,根据客服端支持的加密套件和自己支持的加密套件选择出后面使用的加密和散列套件并返回给客户端,同时返回的还有服务端生产的一个随机数 Random2
服务端向客户端返回自己的证书,客户端收到证书后通过校验证书来信任服务端,并从证书中获取到证书中的公钥。
服务端在返回证书后会立即向客户端发送该请求。不过该请求不是必须的,只有选择的加密套件需要额外的参数是才会发送该请求交互参数。
如果密钥协议商算法是DH算法,那么DH的参数就在该请求中返回给客户端,DH算法有以下几种:DHE_DSS、DHE_RSA、ECDHE_ECDSAECDHE_RSA
dh算法会返回dh的参数p、g、dh的公钥和公钥的签名,公钥即g^b mod p,b为服务端的随机数
这里g就是0X03,p就是0X0017。
服务端在发送完上述信息后,就会立马发送Server Hello Done,来告知客户端服务端的相关信息已经发送完毕,就等客户端开始做密钥协商了。
客户端在收到该消息后就开始验证证书,协商密钥等工作。
在接受到服务器的Server Hello Done信息之后,客户端会计数出预备主密钥,并将其返回给服务端。
如果使用的是RSA/ECDSA算法,那么发送的就是预备主密钥。
如果使用的是DH算法,那么发送的就是通过之前的参数计数出来的公钥匙,即B( g^b mod p)服务端在收到B后通过 B ^ a mod p得到第三个随机数。而客户端已经通过s = A b mod 得到了s。
到了这里服务端和客户端已经得到了三个随机数,通过之前协商好的加密算法使用这个三个随机数就得到一个对称加密的密钥,后面通信时就使用该密钥。
该请求用于通知对方已经计数出通信用的密钥,接下来的通信都使用该密钥进行。服务端和客户端都会发出该请求,一般是服务端先发出。
在完成上述步骤以后,双发都会发送一个Finished请求给对方,Finished的数据是通过协商好的密钥加密的,以此来验证之前协商好的密钥、协议版本是否是有效的。
参考资料:
❷ DH & RSA 原理
在 https 建立连接过程中,会进行秘钥协商。双方会各自给出一个随机数 rc, rs,再加上一个 pre-master 。最后根据 rc + rs + pre-master 三个随机数计算出最终的主密钥。
这里我们要介绍的 pre-master 的生成算法,就是 DH 秘钥交换的变种, ECDHE 。下面我们先来介绍一下 DH 算法。
DH,全称是 Diffe-Hellman ,它的原理很简单。
双方预先知道两个公共参数 g 和 p,然后各自给定一个数,最后根据一个数学公式唤陆,则可计算出相同的秘钥。
这是建立 模幂运算 的基础上,先求幂,后取模,称为模幂计算。如下所示,其中 p 是质数,a、b、p 都取很大的数,g 可以取较小的数。
假设 Alice 与 Bob 通信,协商秘钥,计算过程如下:
最终得到 k1 == k2 。
私钥 a,b 不被外部所知,只有 A、B、g、p 是公开的。而仅仅知道这几个数,是很难求出 a、b 的。因为涉及到对数运算问题。
对于下面这个模幂公式来说:
它满足如下特性:
该算法就是利用了 1、2 特性。
非对称加密算法,用公钥加密,可以用私钥解密;用私钥加密,可以用公钥解密。
假设 g 是原始数据,套用如下公式,经过公钥 a 加密后变为了 A。
那么如何解出 g 呢?假设我们也根据上面的好链侍公式套用一下,用同样的方式解密,如下所示。其中 d 是私钥,将 A 进行解密得到 g。
将 A 代入,可得到:
那么 a、d、g 之间的关系就建立起来了。
同友吵样,如果用私钥 d 加密,公钥 a 来解密,也是成立的。
欧拉函数 φ(x) 表示,≤ x 的正整数中,有多少个数与其互质。比如 x = 4,比 4 小的数有 1、2、3、4,其中 1、3 是质数,所以 φ(4) = 2。
它满足如下特性:
欧拉定理如下,g 的 φ(p) 次幂,再模上 p,结果为 1。其中 g,p 互质。
下面我们将欧拉定理做如下处理:
当我们有了公钥 a,要计算出私钥 d,就很容易了,只需知道 φ(p) 。而又要让 φ(p) 不易被破解,根据欧拉公式中提到的 φ(x) = (m-1)*(n-1) ,可以取用很大的质数 m 和 n, p = m * n ,这样破解起来就很困难了。
因为外部知道的是公钥 a、非常大的数 p,求出 d 需要将 p 进行质因数分解。而对超大数进行分解非常困难,当 p 的位数越长,安全性就越好。现在一般采用 2048 位,1024 位已经不太安全了。
❸ 什么是dh算法
DH组的本质是使用非对称密钥来加密对称密钥。
DH算法过程:
1、相互产生密钥对
2、交换公钥
3、用对方的公钥和自己的私钥运行DH算法——得到另外一个密钥X(这里的奇妙之处是这个值两端都是一样的)
4、A产生对称加密密钥,用密钥X加密这个对称的加密密钥——发送到B
5、B用密钥X解密——得到对称的加密密钥
6、B用这个对称的加密密钥来解密A的数据
❹ 简要介绍DH密钥交换算法
姓名:朱睿琦
学号:15180288015
参考:https://ke..com/item/Diffie-Hellman/9827194?fr=aladdin
http://blog.csdn.net/fw0124/article/details/8462373
【嵌牛导读】:随着互联网络的高速发展,计算机运算能力的提升,对信息的保密也有了更近一步的要求——不仅信息要保密,密钥也要保密。DH(Diffie-Hellman)算法就提供了使密钥安全通过不安全网络的方法。
【嵌牛鼻子】:DH算法,密钥,网络信息安全
【嵌牛提问】:DH算法是用来保护什么在网络中的通信安全?DH密钥交换的基本原理是什么?
【嵌牛正文】:(1)、算法描述
离散对数的概念:
原根 :如果 a 是素数 p 的一个原根,那么数值:
a mod p , a^ 2 mod p ,…, a^( p-1) mod p
是各不相同的整数,且以某种排列方式组成了从 1 到 p-1 的所有整数。
离散对数 :如果对于一个整数 b 和素数 p 的一个原根 a ,可以找到一个唯一的指数 i ,使得:
b =( a的i次方) mod p 其中 0 ≦ i ≦ p-1
那么指数 i 称为 b 的以 a 为基数的模p的离散对数。
Diffie-Hellman算法的有效性依赖于计算离散对数的难度,其含义是:当已知大素数 p 和它的一个原根 a 后,对给定的 b ,睁喊裤要计算 i ,被认为是很困难的,而给定 i 计算 b 却相对容易。
Diffie-Hellman算法:
假如用户A和用户B希望交换一个密钥。
取素数 p 和整数 a , a 是 p 的一个原根,公开 a 和p。
A选择随机数XA< p ,并计算YA= a^ XA mod p。
B选择随机数XB< p ,并计算YB= a^ XB mod p。
每一方都将X保密而将Y公开让另一方得到。
A计算密钥的方式是:K=(YB) ^XA mod p
B计算密钥的方式是:K=(YA) ^XB mod p
证明:
(YB)^ XA mod p = ( a^ XB mod p )^ XA mod p
= ( a^ XB)^ XA mod p = ( a^ XA) ^XB mod p (<-- 密钥即为 a^(XA*XB) mod p )
=( a^ XA mod p )^ XB mod p = (YA) ^XB mod p
由于XA和XB是保密的,而第三方只有 p 、 a 、YB、YA可以利用,只有通过取离散对数来确定密钥,但对于大的素数 p ,计算离散对数是十分困难的。
例子:
假如用户Alice和用户Bob希望交换一个密钥。
取一个素数 p =97和97的一个原根 a =5。
Alice和Bob分别选择秘密密钥XA=36和XB=58,并计算各自的公开密钥:
YA= a^ XA mod p =5^36 mod 97=50
YB= a^ XB mod p =5^58 mod 97=44
Alice和Bob交换了公开密钥之后,计算共享密钥如下:
Alice:K=(YB) ^XA mod p =44^36 mod 97=75
Bob:K=(YA) ^XB mod p =50^58 mod 97=75
(2)、安全性
当然,为了使这个例子变得安全,必悉简须使用非常大的XA, XB 以及 p , 否则可以实验所有的可能取值。(总共有最多97个这样的值, 就算XA和XB很大也无济于事)。
如果 p 是一个至少 300 位的质数,并且XA和XB至少有100位长, 那么即使使用全人类所有的计算资源和当今最好的算法也不可能从a, p 和a^(XA*XB) mod p 中计算出 XA*XB。
这个问题就是着名的离散对数问题。注意g则不需要很大, 并渗岁且在一般的实践中通常是2或者5。
在最初的描述中,迪菲-赫尔曼密钥交换本身并没有提供通讯双方的身份验证服务,因此它很容易受到中间人攻击。
一个中间人在信道的中央进行两次迪菲-赫尔曼密钥交换,一次和Alice另一次和Bob,就能够成功的向Alice假装自己是Bob,反之亦然。
而攻击者可以解密(读取和存储)任何一个人的信息并重新加密信息,然后传递给另一个人。因此通常都需要一个能够验证通讯双方身份的机制来防止这类攻击。
有很多种安全身份验证解决方案使用到了迪菲-赫尔曼密钥交换。例如当Alice和Bob共有一个公钥基础设施时,他们可以将他们的返回密钥进行签名。
❺ 非对称加密算法 (RSA、DSA、ECC、DH)
非对称加密需要两个密钥:公钥(publickey) 和私钥 (privatekey)。公钥和私钥是一对,如果用公钥对数据加密,那么只能用对应的私钥解密。如果用私钥对数据加密,只能用对应的公钥进行解密。因为加密和解密用的是不同的密钥,所以称为非对称加密。
非对称加密算法的保密性好,它消除了最终用户交换密钥的需要。但是加解密速度要远远慢于对称加密,在某些极端情况下,甚至能比对称加密慢上1000倍。
算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多。
RSA、Elgamal、背包算法、Rabin、D-H、ECC (椭圆曲线加密算法)。使用最广泛的是 RSA 算法,Elgamal 是另一种常用的非对称加密算法。
收信者是唯一能够解开加密信息的人,因此收信者手里的必须是私钥。发信者手里的是公钥,其它人知道公钥没有关系,因为其它人发来的信息对收信者没有意义。
客户端需要将认证标识传送给服务器,此认证标识 (可能是一个随机数) 其它客户端可以知道,因此需要用私钥加密,客户端保存的是私钥。服务器端保存的是公钥,其它服务器知道公钥没有关系,因为客户端不需要登录其它服务器。
数字签名是为了表明信息没有受到伪造,确实是信息拥有者发出来的,附在信息原文的后面。就像手写的签名一样,具有不可抵赖性和简洁性。
简洁性:对信息原文做哈希运算,得到消息摘要,信息越短加密的耗时越少。
不可抵赖性:信息拥有者要保证签名的唯一性,必须是唯一能够加密消息摘要的人,因此必须用私钥加密 (就像字迹他人无法学会一样),得到签名。如果用公钥,那每个人都可以伪造签名了。
问题起源:对1和3,发信者怎么知道从网上获取的公钥就是真的?没有遭受中间人攻击?
这样就需要第三方机构来保证公钥的合法性,这个第三方机构就是 CA (Certificate Authority),证书中心。
CA 用自己的私钥对信息原文所有者发布的公钥和相关信息进行加密,得出的内容就是数字证书。
信息原文的所有者以后发布信息时,除了带上自己的签名,还带上数字证书,就可以保证信息不被篡改了。信息的接收者先用 CA给的公钥解出信息所有者的公钥,这样可以保证信息所有者的公钥是真正的公钥,然后就能通过该公钥证明数字签名是否真实了。
RSA 是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。
A 要把信息发给 B 为例,确定角色:A 为加密者,B 为解密者。首先由 B 随机确定一个 KEY,称之为私钥,将这个 KEY 始终保存在机器 B 中而不发出来;然后,由这个 KEY 计算出另一个 KEY,称之为公钥。这个公钥的特性是几乎不可能通过它自身计算出生成它的私钥。接下来通过网络把这个公钥传给 A,A 收到公钥后,利用公钥对信息加密,并把密文通过网络发送到 B,最后 B 利用已知的私钥,就能对密文进行解码了。以上就是 RSA 算法的工作流程。
由于进行的都是大数计算,使得 RSA 最快的情况也比 DES 慢上好几倍,无论是软件还是硬件实现。速度一直是 RSA 的缺陷。一般来说只用于少量数据加密。RSA 的速度是对应同样安全级别的对称密码算法的1/1000左右。
比起 DES 和其它对称算法来说,RSA 要慢得多。实际上一般使用一种对称算法来加密信息,然后用 RSA 来加密比较短的公钥,然后将用 RSA 加密的公钥和用对称算法加密的消息发送给接收方。
这样一来对随机数的要求就更高了,尤其对产生对称密码的要求非常高,否则的话可以越过 RSA 来直接攻击对称密码。
和其它加密过程一样,对 RSA 来说分配公钥的过程是非常重要的。分配公钥的过程必须能够抵挡中间人攻击。假设 A 交给 B 一个公钥,并使 B 相信这是A 的公钥,并且 C 可以截下 A 和 B 之间的信息传递,那么 C 可以将自己的公钥传给 B,B 以为这是 A 的公钥。C 可以将所有 B 传递给 A 的消息截下来,将这个消息用自己的密钥解密,读这个消息,然后将这个消息再用 A 的公钥加密后传给 A。理论上 A 和 B 都不会发现 C 在偷听它们的消息,今天人们一般用数字认证来防止这样的攻击。
(1) 针对 RSA 最流行的攻击一般是基于大数因数分解。1999年,RSA-155 (512 bits) 被成功分解,花了五个月时间(约8000 MIPS 年)和224 CPU hours 在一台有3.2G 中央内存的 Cray C916计算机上完成。
RSA-158 表示如下:
2009年12月12日,编号为 RSA-768 (768 bits, 232 digits) 数也被成功分解。这一事件威胁了现通行的1024-bit 密钥的安全性,普遍认为用户应尽快升级到2048-bit 或以上。
RSA-768表示如下:
(2) 秀尔算法
量子计算里的秀尔算法能使穷举的效率大大的提高。由于 RSA 算法是基于大数分解 (无法抵抗穷举攻击),因此在未来量子计算能对 RSA 算法构成较大的威胁。一个拥有 N 量子位的量子计算机,每次可进行2^N 次运算,理论上讲,密钥为1024位长的 RSA 算法,用一台512量子比特位的量子计算机在1秒内即可破解。
DSA (Digital Signature Algorithm) 是 Schnorr 和 ElGamal 签名算法的变种,被美国 NIST 作为 DSS (DigitalSignature Standard)。 DSA 是基于整数有限域离散对数难题的。
简单的说,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名,如果数据和签名不匹配则认为验证失败。数字签名的作用就是校验数据在传输过程中不被修改,数字签名,是单向加密的升级。
椭圆加密算法(ECC)是一种公钥加密算法,最初由 Koblitz 和 Miller 两人于1985年提出,其数学基础是利用椭圆曲线上的有理点构成 Abel 加法群上椭圆离散对数的计算困难性。公钥密码体制根据其所依据的难题一般分为三类:大整数分解问题类、离散对数问题类、椭圆曲线类。有时也把椭圆曲线类归为离散对数类。
ECC 的主要优势是在某些情况下它比其他的方法使用更小的密钥 (比如 RSA),提供相当的或更高等级的安全。ECC 的另一个优势是可以定义群之间的双线性映射,基于 Weil 对或是 Tate 对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长。
ECC 被广泛认为是在给定密钥长度的情况下,最强大的非对称算法,因此在对带宽要求十分紧的连接中会十分有用。
比特币钱包公钥的生成使用了椭圆曲线算法,通过椭圆曲线乘法可以从私钥计算得到公钥, 这是不可逆转的过程。
https://github.com/esxgx/easy-ecc
Java 中 Chipher、Signature、KeyPairGenerator、KeyAgreement、SecretKey 均不支持 ECC 算法。
https://www.jianshu.com/p/58c1750c6f22
DH,全称为"Diffie-Hellman",它是一种确保共享 KEY 安全穿越不安全网络的方法,也就是常说的密钥一致协议。由公开密钥密码体制的奠基人 Diffie 和 Hellman 所提出的一种思想。简单的说就是允许两名用户在公开媒体上交换信息以生成"一致"的、可以共享的密钥。也就是由甲方产出一对密钥 (公钥、私钥),乙方依照甲方公钥产生乙方密钥对 (公钥、私钥)。
以此为基线,作为数据传输保密基础,同时双方使用同一种对称加密算法构建本地密钥 (SecretKey) 对数据加密。这样,在互通了本地密钥 (SecretKey) 算法后,甲乙双方公开自己的公钥,使用对方的公钥和刚才产生的私钥加密数据,同时可以使用对方的公钥和自己的私钥对数据解密。不单单是甲乙双方两方,可以扩展为多方共享数据通讯,这样就完成了网络交互数据的安全通讯。
具体例子可以移步到这篇文章: 非对称密码之DH密钥交换算法
参考:
https://blog.csdn.net/u014294681/article/details/86705999
https://www.cnblogs.com/wangzxblog/p/13667634.html
https://www.cnblogs.com/taoxw/p/15837729.html
https://www.cnblogs.com/fangfan/p/4086662.html
https://www.cnblogs.com/utank/p/7877761.html
https://blog.csdn.net/m0_59133441/article/details/122686815
https://www.cnblogs.com/muliu/p/10875633.html
https://www.cnblogs.com/wf-zhang/p/14923279.html
https://www.jianshu.com/p/7a927db713e4
https://blog.csdn.net/ljx1400052550/article/details/79587133
https://blog.csdn.net/yuanjian0814/article/details/109815473
❻ 什么是DH非对称加密算法
DH(仅能用于密钥分配,不能加解密数据)
非对称加密算法
特点:
发送方和接收方均有一个密钥对(公钥+私钥),其中公钥传播,私钥自己保存,不需要传播
私钥不需要传播的特性解决了对称加密算法中密钥传播的困难(这个困难一般通过线下传递可以解决)
加密安全性极高,只用于一些电子商务网站,加解密速度远低于对称加密
一般情况下,为了解决非对称加密算法加解密速度低的问题,采用非对称加密(使用公钥+私钥对对称加密的密钥进行加解密)+对称加密(加解密数据)相结合的方式。
常见算法:
DH(非对称加密的基石)
RSA(非对称加密的经典,除了可用于非对称加密,也可用于数字签名,RSA--155(512位密钥)已被破解)
ElGamal