DH(仅能用于密钥分配,不能加解密数据)
非对称加密算法
特点:
发送方和接收方均有一个密钥对(公钥+私钥),其中公钥传播,私钥自己保存,不需要传播
私钥不需要传播的特性解决了对称加密算法中密钥传播的困难(这个困难一般通过线下传递可以解决)
加密安全性极高,只用于一些电子商务网站,加解密速度远低于对称加密
一般情况下,为了解决非对称加密算法加解密速度低的问题,采用非对称加密(使用公钥+私钥对对称加密的密钥进行加解密)+对称加密(加解密数据)相结合的方式。
常见算法:
DH(非对称加密的基石)
RSA(非对称加密的经典,除了可用于非对称加密,也可用于数字签名,RSA--155(512位密钥)已被破解)
ElGamal
B. 非对称加密算法 (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
C. 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 位已经不太安全了。
D. 什么是DH协议的中间人
DH协议的中间人是Diffie-Hellman密钥协议算法是一种确保共享密钥KEY安全穿越不安全网络的李行兆方法,它是OAKLEY的一个组成部分,由Whitefield与Martin Hellman在1976年提出。这个机制的巧妙在于需要安全通信的双方可以用这个方法确定对称密钥。然后可带逗以用这个密钥进行加密和解密。但是注意,这个密钥交换协议/算法只能用于密哪租钥的交换,而不能进行消息的加密和解密。双方确定要用的密钥后,要使用其他对称密钥操作加密算法实际加密和解密消息。
E. RSA、Diffie-Hellman和中间人攻击
网络上常常有对RSA、DH算法,以及中间人攻击的讨论。
一种说法是“RSA密钥协商(交换)不会受到中间人攻击”,听起来似乎RSA比DH做密钥协商更优。
这种说法有些不负责任。下面把这个问题中涉及到的概念都解释一下,再来看这个问题。
中间人攻击轮宽,可以这样解释:攻击者一定程度上控制了网络,成为网络双方通信的中间者,从而获取到双方的通信信息;而通信双方都感知不到中间人的存在。
这个话题往往和加密通信一起讨论:如果加密信道中存在中间人,那明文就会被中间人获取,而通信双方还不会知晓。
中间人攻击的根本,在于通信双方没有进行身份认证。即:不知道和自己直接通信的人是谁。如果双方能确认直接通信的人就是对方,也就不存在中间人攻击了。
RSA加密算法 是一种非对称加密技术。由一对密钥(公钥+私钥)组成。
可以利用私钥来生成公钥。
一般来说,私钥会被秘密保存起来,而公钥则分发出去。
公钥加密,私钥解密,称为RSA加密算法。 是为了保证公钥加密的内容,只有私钥持有者可以解密。常常用在客户端账密登录过程:客户端对密码进行公钥加密,发送到服务端后用私钥解密,这样即使请求被截获也不会泄露密码(实际上要更复杂一些)。
私钥加密,公钥解密,称为RSA签名算法。 是为了保证公钥持有者获取的内容,确实是来自私钥持有者的正确内容。比如服务器持有私钥,将一个重要信息计算hash再私钥签名后,和信息本身一起发送到客户端;客户端用公钥解密签名得到hash值,再计算信息的hash值,进行比对,就知道内容是否被篡改。由于私钥的亩桐嫌保密性,攻击者无法伪造有效的签名。
DH密钥交换算法 并不是 加密算法,而是双方在不安全的网络中交换信息而生成双方仅有的密钥的一种方法。其结果是,交换的双方得到了一样的会话密钥,而其他任何人不能得到这个密钥。
由于算法的结果是通信双方拥有了一样的密钥,双方往往会利用这个密钥进行 对称 加密通信。
DH算法的过程可以简单解释如下:通信双方AB,各自生成一对DH密钥(Pa,Sa)和(Pb,Sb)(P代表公钥,S代表私钥)。双方交换各自的公钥P,于是A持有Sa、Pb,B持有Sb、Pa。通过某种计算,Sa、Pb可以生成会话密钥K,Sb、Pa也可以生成相同的K。
DH算法本身不包含身份认证机制,所以中间人攻击是其明显的问题。
设想:
在AB间,有一C。AB交换DH公钥P时,C在中间截获;C自己生成一对DH密钥(Pc,Sc),用Pc和A、B完成密钥交换。于是C与A间有了会话密钥Kac=f(Pa,Sc)=f(Pc, Sa),C与B间有了会话密钥Kcb=f(Pb,Sc)=f(Pc, Sb)。只要C从一方获得的信息,重新加密后传递给另一方,AB就都不会发现他们的通信被劫持了。
密钥协商(key establishment)包括“密钥传输”(key transmission)和“密钥交换”(key exchange)。
所谓RSA密钥协商实际是密钥传输,即一方生成密钥,传递给另一方,而不必双方交换。
具体来说,就是A自己生成一个密钥K,用自己的RSA公钥加密,再传递给B;B用RSA私钥解密得到K。仅就这个过程而言,不会存在中间人攻击。
但是这不是说RSA就比DH就更安全了。设想上面的情况,必须先要令A持有RSA公钥,B持有RSA私钥。这首先先进行一次RSA公钥传递,而这个传递过程是存在中间人攻击的。
设想:
B生成一对RSA密钥Pb、Sb,将公钥Pb发送给A。而AB中有C。C截获了Pb,而自己生成了一对RSA密钥Pc、Sc,将Pc发送给A。
A用Pc加密了会话密钥K,发迅手送给B,被C截获。C用Sc解密得到K,再用Pb加密后给B。这时C完成了中间人攻击。
所以说: RSA的公钥在端与端间传递时,存在中间人攻击问题。
RSA最好的使用场景在服务端/客户端之间,服务端持有私钥,客户端直接内置好公钥,就不用担心中间人攻击了。
平时我们使用的,号称安全的https协议,也存在中间人攻击问题。比如Fiddler这种抓包软件,就能充当https通信中的中间人。
一般上网时使用的https是 单向认证 ,即客户端通过CA认证服务器持有有效证书,来确认其身份。服务器不会验证客户端的身份。
如果使用 双向认证 ,通过CA确认两端的身份都是正确的,就可以防止中间人攻击了。这种双向认证一般出现在企业应用对接中。
网络上有这样一种说法:
通信两端交换RSA公钥,通过对方公钥加密数据,自己私钥解密。这样就实现了端到端加密。
实际上这 不是端到端加密 。因为不能保证服务器无法修改数据:服务器可以用公钥来加密任何的数据发给两端。
而且,按之前所说的,这种交换, 存在中间人攻击问题 。
F. 简要介绍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共有一个公钥基础设施时,他们可以将他们的返回密钥进行签名。
G. Android-DH 秘钥交换
DH 是 Whitfield Diffie 和 Martin Hellman 在1976年共同发明的一种秘钥交换算法。主要用于在不安全的网络上客户端和服务端通过交换公钥,生成一个相同的高旁大秘钥,并将该秘钥作为对称加密算法的秘钥,达到使对称加密算法的秘钥可以动态修改戚竖的目的。这样便提高了数据在网络上传输的安全性。
DH 总共包含四个部分,分别是:质数原根对、公钥、私钥和秘钥。
1. 客户端和服务端使用相同的质数原根对:P=23 和 G=5,这是秘钥交换的必须条件。
2. 服务端生成随机整数 A = 6,并将启裂 A 作为私钥,使用公钥计算公式:
公钥 = G 的 A 次方 取余 P,等于 Math.pow(5,6) % 23,服务端的公钥为: 8。
3. 客户端生成随机整数 B = 7,并将 B 作为私钥,使用公钥计算公式:
公钥 = G 的 B 次方 取余 P,等于 Math.pow(5,7) % 23,客户端的公钥为: 17。
4. 服务端用客户端的公钥生成秘钥,使用秘钥计算公式:
秘钥 = 17 的 A 次方 取余 P,等于 Math.pow(17,6) % 23,服务端的秘钥为: 12。
5. 客户端用服务端的公钥生成秘钥,使用秘钥计算公式:
秘钥 = 8 的 B 次方 取余 P,等于 Math.pow(8,7) % 23,客户端的秘钥为: 12。
客户端和服务端通过交换公钥,生成了相同的秘钥。
H. 什么是dh算法
DH组的本质是使用非对称密钥来加密对称密钥。
DH算法过程:
1、相互产生密钥对
2、交换公钥
3、用对方的公钥和自己的私钥运行DH算法——得到另外一个密钥X(这里的奇妙之处是这个值两端都是一样的)
4、A产生对称加密密钥,用密钥X加密这个对称的加密密钥——发送到B
5、B用密钥X解密——得到对称的加密密钥
6、B用这个对称的加密密钥来解密A的数据
I. 常见的加密算法、原理、优缺点、用途
在安全领域,利用密钥加密算法来对通信的过程进行加密是一种常见的安全手段。利用该手段能够保障数据安全通信的三个目标:
而常见的密钥加密算法类型大体可以分为三类:对称加密、非对称加密、单向加密。下面我们来了解下相关的算法原理及其常见的算法。
在加密传输中最初是采用对称密钥方式,也就是加密和解密都用相同的密钥。
1.对称加密算法采用单密钥加密,在通信过程中,数据发送方将原始数据分割成固定大小的块,经过密钥和加密算法逐个加密后,发送给接收方
2.接收方收到加密后的报文后,结合解密算法使用相同密钥解密组合后得出原始数据。
图示:
非对称加密算法采用公钥和私钥两种不同的密码来进行加解密。公钥和私钥是成对存在,公钥是从私钥中提取产生公开给所有人的,如果使用公钥对数据进行加密,那么只有对应的私钥(不能公开)才能解密,反之亦然。N 个用户通信,需要2N个密钥。
非对称密钥加密适合对密钥或身份信息等敏感信息加密,从而在安全性上满足用户的需求。
1.甲使用乙的公钥并结合相应的非对称算法将明文加密后发送给乙,并将密文发送给乙。
2.乙收到密文后,结合自己的私钥和非对称算法解密得到明文,得到最初的明文。
图示:
单向加密算法只能用于对数据的加密,无法被解密,其特点为定长输出、雪崩效应(少量消息位的变化会引起信息摘要的许多位变化)。
单向加密算法常用于提取数据指纹,验证数据的完整性、数字摘要、数字签名等等。
1.发送者将明文通过单向加密算法加密生成定长的密文串,然后传递给接收方。
2.接收方将用于比对验证的明文使用相同的单向加密算法进行加密,得出加密后的密文串。
3.将之与发送者发送过来的密文串进行对比,若发送前和发送后的密文串相一致,则说明传输过程中数据没有损坏;若不一致,说明传输过程中数据丢失了。
图示:
MD5、sha1、sha224等等
密钥交换IKE(Internet Key Exchange)通常是指双方通过交换密钥来实现数据加密和解密
常见的密钥交换方式有下面两种:
将公钥加密后通过网络传输到对方进行解密,这种方式缺点在于具有很大的可能性被拦截破解,因此不常用
DH算法是一种密钥交换算法,其既不用于加密,也不产生数字签名。
DH算法通过双方共有的参数、私有参数和算法信息来进行加密,然后双方将计算后的结果进行交换,交换完成后再和属于自己私有的参数进行特殊算法,经过双方计算后的结果是相同的,此结果即为密钥。
如:
安全性
在整个过程中,第三方人员只能获取p、g两个值,AB双方交换的是计算后的结果,因此这种方式是很安全的。
答案:使用公钥证书
公钥基础设施是一个包括硬件、软件、人员、策略和规程的集合
用于实现基于公钥密码机制的密钥和证书的生成、管理、存储、分发和撤销的功能
签证机构CA、注册机构RA、证书吊销列表CRL和证书存取库CB。
公钥证书是以数字签名的方式声明,它将公钥的值绑定到持有对应私钥的个人、设备或服务身份。公钥证书的生成遵循X.509协议的规定,其内容包括:证书名称、证书版本、序列号、算法标识、颁发者、有效期、有效起始日期、有效终止日期、公钥 、证书签名等等的内容。
1.客户A准备好要传送的数字信息(明文)。(准备明文)
2.客户A对数字信息进行哈希(hash)运算,得到一个信息摘要。(准备摘要)
3.客户A用CA的私钥(SK)对信息摘要进行加密得到客户A的数字签名,并将其附在数字信息上。(用私钥对数字信息进行数字签名)
4.客户A随机产生一个加密密钥(DES密钥),并用此密钥对要发送的信息进行加密,形成密文。 (生成密文)
5.客户A用双方共有的公钥(PK)对刚才随机产生的加密密钥进行加密,将加密后的DES密钥连同密文一起传送给乙。(非对称加密,用公钥对DES密钥进行加密)
6.银行B收到客户A传送过来的密文和加过密的DES密钥,先用自己的私钥(SK)对加密的DES密钥进行解密,得到DES密钥。(用私钥对DES密钥解密)
7.银行B然后用DES密钥对收到的密文进行解密,得到明文的数字信息,然后将DES密钥抛弃(即DES密钥作废)。(解密文)
8.银行B用双方共有的公钥(PK)对客户A的数字签名进行解密,得到信息摘要。银行B用相同的hash算法对收到的明文再进行一次hash运算,得到一个新的信息摘要。(用公钥解密数字签名)
9.银行B将收到的信息摘要和新产生的信息摘要进行比较,如果一致,说明收到的信息没有被修改过。(对比信息摘要和信息)
答案是没法保证CA的公钥没有被篡改。通常操作系统和浏览器会预制一些CA证书在本地。所以发送方应该去那些通过认证的CA处申请数字证书。这样是有保障的。
但是如果系统中被插入了恶意的CA证书,依然可以通过假冒的数字证书发送假冒的发送方公钥来验证假冒的正文信息。所以安全的前提是系统中不能被人插入非法的CA证书。
END
J. Diffie-Hellman密钥协商算法
目前常用的加密算法主要有:哈希算改首裤法(比如MD5、SHA族、Hmac),对称加密算法(比如AES),非对称加密算法(RSA),以及Diffie-Hellman密钥协商算法等等,这几种算法都有各自的特点,适合的场景也不一样,这里只做简单的介绍,想详细了解的话,网上资料很多,可以自行查看相关的资料。
各类算法的特点:
哈希算法:正向快速,不可逆性,即加密后是很难解密出明文的。经常用于数据加密和数据校验。
对称加密算法:AES是一种常用的对称加密算法,其特点是加解密都用同一个密钥。
非对称加密算法RSA:RSA算法是一种非对称加密算法,由一个私钥和一个公钥构成的密钥对,通过私钥加密,公钥解密,或者通过公钥加密,私钥解密。其中,公钥可以公开,私钥必须保密。
Diffie-Hellman密钥协商算法:Diffie-Hellman是一种密钥协商算法(简称DH算法),DH算法基于一种数学原理,能够在双方不泄露密钥的情况下协商出一种密钥来。
在客户端向服务器端发送数据的过程中,如果是比芹竖较重要的数据(比如密码,敏感数据等),核简一般需要先在客户端进行加密后再发送,服务器接收到数据后再进行解密得到原始数据。(反过来服务器返回数据给客户端也是一样的道理)
这里假设客户端和服务器端采用AES(对称加密算法)进行加解密传输的数据,AES加密算法有一个特点就是加解密都用同一个密钥(这里把该密钥称作secretKey),所以双方都通过secretKey进行数据加解密。
因此在客户端向服务器第一次传输数据的时候,客户端需要先向服务器端获取secretKey,并且保存在客户端,而这种直接向服务器获取明文secretKey的过程是很容易被第三者拦截的,也就是说这一过程是不安全的。(哈哈,除非是服务器把secretKey写到纸上,亲手偷偷地递给客户端)
因此呢,客户端向服务器获取secretKey的这一过程,也是需要进行加密的。
那么,服务器需要怎么做才能把secretKey安全的送达客户端呢?
目前常采用的方法有:RSA 或 Diffie-Hellman
RSA有一个公钥和一个私钥,公钥是允许公开出去的,私钥是保留的。RSA的要点在于用公钥加密的数据需要用私钥解密,用私钥加密的数据,需要用公钥解密。因此,比如这时候客户端把公钥发送给服务器,服务器利用客户端的公钥对secretKey进行加密,那么这份加密后的secretKey数据,就只有客户端的私钥能解开啦。即使第三者拿到了这份数据也解密不了,除非能获取到客户端的私钥。
所以,通过RSA的方式,服务器就能把secretKey安全的传递到客户端的手里啦。(不过,RSA也是有安全漏洞的,被称作中间人攻击,由于篇幅原因,这里就先不讲啦!大家自行网络。)
虽然使用RSA能够安全的传输secretKey密钥,但是麻烦点在于需要生成一对公钥和私钥,并且把公钥发送给对方,而且加解密速度比较慢。所以,介绍第二种:Diffie-Hellman密钥协商算法。
严格来说,DH算法其实并不是一种加密算法,因为它本身并不是用于加密的,我的理解是用于双方协商计算,即双方按照某种合约进行计算,从而计算出一种相同的结果。
原理如下:
第一步:初始化
比如现在服务器提供了两个随机公钥数字(允许公开):pubN=10,modN=3;
客户端自己生成了一个随机私钥数字(不可公开,服务器也不知道):cPrivN=2;
服务器端也自己生成了一个随机私钥数字(不可公开,客户端也不知道):sPrivN=4;
第二步:客户端、服务器端分别基于相同的数学公式进行计算,计算结果称作公钥结果:pubResult
客户端进行数学计算:cPubResult = pubN * cPrivN % modN = 10 * 2 % 3 = 2;(计算结果允许公开)
服务器进行数学计算:sPubResult = pubN * sPrivN % modN = 10 * 4 % 3 = 1;(计算结果允许公开)
客户端和服务器端交换公钥结果,客户端得到sPubResult=1,服务器端得到cPubResult=2。
第三步:协商出一致的密钥数字:keyN(客户端和服务器端得出的结果是一致的)
客户端:cKeyN = sPubResult * cPrivN % modN= 1 * 2 % 3 = 2;
服务器:sKeyN = cPubResult * sPrivN % modN= 2 * 4 % 3 = 2;
到目前为止呢,双方都协商出了密钥,并且是一致的,但是呢,有没有见过密钥是number类型的?想必都没有吧,所以需要进行第四步,生成更长的密钥。
第四步:对密钥数字进行hash生成密钥串