最近因为写网安作业,学习了一下密码学相关的知识,写一篇文章记录总结一下。
基本原理
-
密码
Alice和Bob要进行通信。因为两人之间的通信信道是不安全的,消息可能被窃听。因此需要约定加密手段和密码。 -
密钥
广义而言,任何一种加密方式都会有参数。我们把这个参数称为密钥。当加密和解密参数一致时,称这种方式为对称加密。
很显然,对称加密的参数不能直接在原始不安全的信道上传输。
密码学的主要目标就是在已知信道不安全的基础上,安全地(指密钥分发过程)构建一个安全的(指信道)信道。 -
逆向运算的不可行
因为通信双方需要通过不安全信道传递消息,相当于必须把一部分信息公布出去。通过公布信息和私有信息,可以计算出密钥,但仅通过公布信息无法计算密钥,这就是我们的目的。
先看最基础的情况。Alice和Bob分别选择一个数,然后使用共同约定的一个数。如,Alice选择5,约定数为10,于是他公布50。同样,Bob选择6,公布60。于是他们取56=30作为密钥。
这么做的问题在于,510=50是正向计算,50/10=5是逆向运算。逆向运算并不比正向复杂,攻击者可以轻易恢复原始信息。
但是,若是重新定义乘法呢?
利用不同的数学难题,我们确实可以重新定义乘法,或者说,使用新的运算符号。他的逆运算比正向运算复杂很多,因此攻击这个算法的成本是攻击者无法承受的。这是密码学的基础思想。
非对称加密算法
-
公钥和私钥
在不安全的信道中分发一个既是加密参数又是解密参数的值是不可行的,但是加密参数未必要和解密参数一致。
假如加密和解密的参数不一致,就可以放心分发加密参数,保留解密参数。攻击者即使拿到了加密参数,也无法获取实际消息。
反向看,如果分发解密参数,就可以利用加密参数进行身份验证。Alice发送随机文本M,要求Bob返回这段文本M及加密后的结果M*,Alice再解密M*,对比其与原始结果,以验证Bob身份。
在常用的RSA和DSA算法中,都采用的幂和模运算。公钥和私钥在运算中是对等的,即公钥在密码中是加密参数,在身份验证中是解密参数。于是,Alice在用公钥验证了Bob身份之后,就可以用公钥进行加密。 -
数字证书
在上述过程中,Alice需要确保公钥是Bob分发的。身份验证只能证实我的密钥来自我的通信对端
,不能确保我的密钥来自Bob
或者说我在和Bob通信
。
这个问题在目前的框架下无法解决。Bob无法自证,因为没有一个标准的参考项。为了解决这个问题,我们引入证书颁发机构CA(Certificate Authority)。
CA将Bob的公钥进行哈希运算,得到指纹信息。考虑到哈希算法的抗碰撞性,可以认为指纹信息和公钥是唯一对应的。
接着,CA将指纹和哈希算法一起,用CA的私钥加密后附在Bob的公钥后面。再加上一些其他信息,构成数字证书
。
Alice收到证书之后,用CA的公钥解密指纹和哈希算法,并重新计算、比对。只有当Bob的公钥未被篡改时比对才能通过。
而CA是权威机构,其公钥直接写在操作系统中,或者有权威的颁布方式。在CA可信的前提下,我们就可以通过数字证书获取Bob,或者任何人的公钥。
参考资料:
http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html
-
RSA算法
RSA是一种经典的非对称加密算法,于1977年由Ron RivestAdi Shamir和Leonard Adleman一起提出的。RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA算法利用了大数分解难题,虽然其安全性未得到证明,但是确实可行。由两个素数相乘得到一个大数是很简单的,但是将这个大数分解为两个素数是非常困难的,尤其是当这个大数非常大(2048位)时。
RSA算法的数学原理是欧拉定理和费马定理,其主要思路如下:- 随意选择两个大的质数 p 和 q ,p 不等于 q ,计算 N=pq。
- 计算 r = φ(N) = (p-1)(q-1)
- 选取与r互质的数e
通常为65537
,计算 ed≡1(modr) - (N,e)公布为公钥,(N,d)保存为私钥,销毁pq与r。
加密时计算m^e = s (mod N), 解密时计算 s^d = m (mod N), 证明略去。想要通过N和e计算出d,就要对N进行大数的因子分解。
参考资料:
https://blog.csdn.net/kikajack/article/details/80703894
实际上,非对称加密的运算量太大,一般不会用RSA算法加密实际信息,而是用来保密传输对称加密的密码。
Alice在确认Bob身份之后,会用Bob的公钥加密一个对称算法。Bob回应后,双方用对称加密的密钥进行通信。
-
DSA算法
DSA是一种数字签名算法,他和RSA非常相似。
DSA是基于整数有限域离散对数难题的,在加密时非常快,在解密时非常慢。因为大多数情况下,一个加密文件要被多次解密,因此DSA算法被抛弃了。
在安全性上,DSA和RSA是相近的。但是DSA通常被认为只能进行数字签名。
参考资料:
https://blog.csdn.net/trustauth/article/details/80049597
密钥交换/协商
-
密钥交换算法
通常,我们使用RSA算法作为密钥交换算法。所谓密钥交换,指的是Alice和Bob交换信息来约定对称加密算法。
以上文所述为例,使用RSA算法确保通信的安全,就可以让Alice安全地把密码传给Bob。
这个步骤总共需要2个RTT来完成。
参考资料:
https://www.cnblogs.com/jeriffe/articles/2804190.html -
密钥协商协议
可以看到,在全部的步骤中,RSA算法既参与了身份认证,又参与了密码交换。
首先,RSA私钥参与主密钥交换会带来前向不安全性。假设一个窃听者长期窃听Alice和Bob通信的报文,在某一天Bob私钥泄漏的情况下,所有的历史通信都将被泄漏。
其次,RSA参与密钥交换的主要目的是保证保密的同时约定双方使用的对称加密密钥。那么,如果这一步不需要RSA的参与呢?
RSA算法利用大数乘积/分解的正向、逆向运算困难程度不同,公布公钥也不会暴露私钥。在这个体系里,原始数据经过公钥和私钥的共同作用之后就还原了:M · pub · pri -> M
将这个思路拓展,如果存在M · pri1 · pub · pri2 -> M
,那么Alice公布pri1·pub
, Bob公布pri2·pub
,那么Alice和Bob就都可以获得pri1 · pub · pri2
作为对称加密密钥。而若我们将·
操作定义得同样前向易逆向难,那么即使攻击者知道pri1·pub
、pri2·pub
和pub
,仍然不能得到最后的对称密钥pri1 · pub · pri2
。 -
DH算法
Whitefield与Martin Hellman在1976年提出了一个奇妙的密钥交换协议,称为Diffie-Hellman密钥交换协议/算法。这个算法可以在信道不安全的基础上安全地协商密钥。
设有这么一个二元组 (a, q) = (3, 7)
我们定义Alice和Bob这么一个运算:
(1)Alice 选择一个范围在[1, q-1]的随机数,为Ga= 5
(2)Alice 计算Pa = a^Ga mod q = 3^5 mod 7 = 5
(3)Bob选择一个范围在[1, q-1]的随机数,为Gb = 6
(4)Bob计算Pb = a^Gb mod q = 3^6 mod 7 = 1
(5)Alice和Bob交换Pa和Pb
(6)Alice计算共享密钥S = Pb ^da mod q = 1^5 mod 7 = 1
(7)Bob计算共享密钥S = Pa ^db mod q = 5^6 m 7 = 1
于是,通过pub=(a, q),Alice和Bob可以完成密钥的协商,而其他人并不知道。进一步,当选择a为q的原根且q足够大时,就可以保证安全性。
当然,DH算法仍然有不足之处。例如,一个中间人可以向Alice伪装为Bob,向Bob伪装为Alice,然后转发(并窃听)消息。所以使用RSA或说使用数字证书的身份验证还是必不可少的。
参考资料:
https://baike.baidu.com/item/Diffie-Hellman/9827194
椭圆曲线
-
ECC
椭圆曲线算法直接重定义了加法。
对于一条椭圆曲线,定义两个点的加法为两点连线与椭圆曲线交点的逆元
。定义逆元为R + -R = 0
,定义0为无穷远点(若一条直线与椭圆曲线没有别的交点,则认为其实是和曲线交于无穷远点)。
基于加法,可以重新定义乘法。基于逆元,可以重新定义减法。作为乘法的逆运算,可以重新定义除法。很明显,除法是难以计算的。
椭圆曲线加密就是基于这样的运算。
先约定一条曲线Pxy映射而来的离散有限集,和一个基点G。选取一个随意的数k,计算K = kG,发给Bob。
这一步从抽象上与RSA和DH算法采用的幂、模是类似的。ECC算法在设计时就以缩短长度为目标,160位ECC与1024位RSA、DSA有相同的安全强度。相对的运算量会偏大,但是考虑到位数和算法优化,性能仍由于RSA算法。
参考资料:
https://andrea.corbellini.name/2015/05/17/elliptic-curve-cryptography-a-gentle-introduction/
https://blog.csdn.net/m0_37803704/article/details/79229738 -
ECDSA
基于ECC定义的运算符,DSA可以进化为ECDSA,一种优于RSA的数字签名算法。
利用ECC的特性,可以在更短、更快的基础上完成数字签名。
参考资料:
https://www.jianshu.com/p/0aef357ed514 -
ECDHE
还是看DH算法的核心思想,在给出公钥P的基础上,公布P1和P2不会暴露原始的私钥p1p2,且双方都能计算出协商结果S。
ECC同样能实现这个特性,且位数更短,点乘比幂运算更快速。
基于一个公认的曲线Pxy和一个基点G,Alice公布K = kG ,Bob公布 R = rG,则双方都能计算出S = krG。
在协商的过程中,假设仍然用到了RSA作为身份验证。那么假设RSA私钥泄露了呢?并不会影响到之前的通信,S并未被泄露(k、r都已经被销毁)。
那么如果S泄露了呢?只要每次会话协商不同的S就好了,仍然有前向安全性。
参考资料:
https://blog.csdn.net/mrpre/article/details/78025940
ECDHE 的E指的是Ephemeral--短暂的。相对而言有一种算法ECDH,服务端并不是每次都重新计算r,而是使用RSA私钥代替。这样当私钥泄露时,每次的会话主密钥都会泄露。
因此ECDH不是前向安全的。
TLS1.3
TLS1.3是最新的安全协议(Transport Layer Security Protocol,传输层安全协议)。在废除了DSA、RSA等一系列算法之后,TLS1.3的协商时间可以从RSA的2RTT优化到DHE的1RTT。
另一方面,在恢复会话时,也从TSL1.2 的1RTT优化到TSL1.3的0RTT。其实际操作是优化了TSL1.2的ticket和resumption,使得客户端在ClientHello之后可以不等待ServerHello直接发送EarlyData。尽管0RTT的限制很多,还有不安全的重放攻击等隐患,这仍然是值得期待的。
参考资料:
https://blog.csdn.net/andylau00j/article/details/79269499
http://www.ituring.com.cn/article/444159