为了防止数据在通信过程中被侦听、篡改,产生了数据加密的技术。已知的两个通信主体之间可以通过预先设定的密钥进行数据加密,但长时间使用相同的密钥,必然存在泄密的风险。对于大容量的分布式系统,管理这些密钥并定时更新从管理上是不现实的。因此,对于数据加密,前人已经考虑协商临时密钥的方法。
就像我们看的很多的理论文章一样,总是举下面的例子说明:Bob和Alice要建立一个加密对话,Bob与Alice首先协商一个临时密钥,然后用这个密钥对对话过程的数据进行加密。这基本上就是非对称加密的概念。在对话过程中,临时密钥所保护的对话过程,是一个对称加密过程,也就是双方都知道密钥的情况所进行的对话。一次对话完成后,这个临时密钥就失效了。当需要再次对话时,需要再次协商密钥。
因此,我们注意到上述这种非对称加密让人困惑的几个地方:
- 如果Bob和Alice协商密钥的过程被监听,那么临时密钥就泄露了,后续的加密不就失效了么?
- Bob如何知道对方是Alice,Alice又如何知道与自己协商密钥的是Bob呢?
实际上这就是加密和认证的两个最关键问题。下面通过介绍一些基本概念,逐步来解开这些谜团。
1. 什么是Hash(哈希)?
密码Hash函数是一种将任意大小的数据映射到固定大小的位串(Hash函数)的数学算法,该函数也被设计为单向函数,即不可逆函数。
输入数据通常称为消息,而输出(Hash值或Hash)通常称为消息摘要或简称为摘要。
1.1 Hash的应用:
- 验证文件或消息的完整性
- 密码验证
- 文件或数据标识符
- 伪随机生成和密钥推导
1.2 加密哈希算法的种类:
- 1991年提出的MD5 - 128位
- 安全哈希算法SHA-1,160bit,由NSA,NIST FIPS PUB 180-4于1995年设计
- SHA-2,由六个Hash函数组成,其中的摘要(Hash值)为224,256,384或512位:SHA-224,SHA-256,SHA-384,SHA-512,SHA-512 / 224,SHA-512/256,由NSA,NIST FIPS PUB 180-4于2001年设计
- SHA-3,包括2015年发布的SHA3-224,SHA3-256,SHA3-384,SHA3-512,SHAKE128,SHAKE256,NIST FIPS PUB 202
1.3 在哪里可以得到这些算法?
MD5,SHA-256,SHA-384都有开源代码。搜索“加密代码”
2. 什么是对称加密算法?
对称加密是两个或更多方之间通过共享的密钥进行加密,可用于维护私人信息链接。与公钥加密(也称为非对称密钥加密)相比,双方都可以访问密钥的这一要求是对称密钥加密的主要缺点之一。
2.1 常用算法
- AES - 2001年12月由NIST批准的高级加密标准算法使用128位块(与流加密相比)。
- Blowfish
- DES(3DES)
- Serpent
- Twofish
2.2 加密过程,就像魔方一样
- 如果有16个字节b0,b1,...,b15,则这些字节表示为这个矩阵:
用于AES密码的密钥大小指定将输入(称为明文)转换为最终输出(称为密文)的转换所循环的次数(请相像成打乱一个魔方,每旋转一次)
对于128位密钥,重复10个周期。
对于192位密钥,重复12个周期。
对于256位密钥,重复14个周期。每轮包含几个处理步骤,每个处理步骤都包含四个相似但不同的阶段,其中包括依赖于加密密钥本身的阶段。使用相同的加密密钥应用一组反向回合将密文转换回原始明文。
2.3 对称加密的标准
- FIPS PUB 197:高级加密标准(AES)
- ISO / IEC 18033-3:信息技术 - 安全技术 - 加密算法 - 第3部分:分组密码
2.4 什么是操作模式(Operation Mode)?
在密码学中,针对任意长度的消息,“操作模式”是使用分组密码进行加密的算法,也就是块加密。
最早的操作模式可追溯到1981年,并在FIPS 81,DES运作模式中进行了规定以下几种
- ECB,
- CBC,
- OFB,
- CFB。
NIST修改了其批准的操作模式列表,将AES作为分组密码并加入
- CTR模式[1],首次引入了Counter的概念,每个块的密钥按照规则变化。
2010年NIST补充了
- XTS-AES [2]
分组密码模式ECB,CBC,OFB,CFB,CTR和XTS提供机密性,但它们不能防止意外修改或恶意篡改。可以使用单独的消息验证代码(如CBC-MAC)或数字签名来检测修改或篡改。
- HMAC [3]
- CMAC [4]
- GMAC [5]
将机密性和数据完整性组合成单一密码原语的模式。这些模式被称为“认证加密”,AE或“authenc”。AE模式的例子是
- CCM(SP800-38C),
- GCM(SP800-38D),
- CWC,
- EAX,
- IAPM,
- OCB
[1] SP800-38A,分组密码操作模式推荐。
[2] SP800-38E,分组密码操作模式建议:存储设备机密性的XTS-AES模式。
[3]于2002年被批准为FIPS 198,
2005年在SP800-38B发布的Keyed -Hash Message Authentication Code(HMAC)[4]中提出了分组密码操作模式推荐:CMAC认证模式
[5]根据SP800-38D,分组密码操作模式推荐:GCM/计数器模式和GMAC。
3. 为什么要采用非对称加密?
3.1 公钥和私钥对。为什么它是不对称的?
公钥加密,其中用接收者的公钥加密消息。如果接收方不具备正确的私钥,那么就不能解密该消息。因此密钥的所有者通过分发公钥给关联的人,对方使用这个公钥加密,建立协商机制,对方反馈的消息必须使用私钥才能解密,以确保通信的机密性。
数字签名,其中邮件是使用发件人的私钥签名的,授权访问邮件的收件方,使用发件人的公钥进行验证。此验证证明了发件人使用的是私钥加密,公钥关联的人员使用公钥解密,通过这种方法,确保消息没有被篡改。因为对消息的任何操纵都会导致对编码消息摘要的改变,否则在发送者和接收者之间数字签名会保持不变。
3.2 什么是椭圆曲线?
y ^ 2 = x ^ 3 + ax + b , 其中a和b是实数。这种方程称为Weierstrass方程。
形式上,椭圆曲线是属于一类的光滑的投影代数曲线,其上有一个指定的点O.椭圆曲线实际上是一个阿贝尔变体 - 也就是说,曲线上的点满足代数定义的乘法交换律。因此它也被称为一个阿贝尔集 - 并且O作为其唯一标识。通常,曲线本身称为椭圆曲线,点O实际上是投影平面上的“无穷远点”。
ECC曲线中的公钥和私钥是什么?
对于“Q”点,“Q”的坐标(Xq,Yq)就是公钥。私钥“d”在数学上与基点“G”有关,G = dQ
3.3 NIST椭圆曲线[FIPS186-2]
- P-192,
- P-224,
- 建议使用P-256,NSA Suite B.
- P-384,
- P-521
3.4 算法
- ECDSA - 椭圆曲线数字签名算法[FIPS186-3]
- ECDH - 椭圆曲线Diffie-Hellman [SP800-56A]
从https://www.iad.gov/iad/library/ia-guidance/ia-solutions-for-classified/algorithm-guidance/index.cfm获取相关文件
3.5 重点:Diffie-Hellman算法
假设Alice想发送一个签名的消息给Bob。最初,他们必须同意曲线参数(CURVE,G,n)。除了曲线的场和方程之外,我们需要“G”曲线上的主要阶的基点;
n是点G的乘法阶。Alice创建一个密钥对,由在区间[1,n]中随机选择的私有密钥整数dA组成,即:1 =< dA <= n,由此创建的公共密钥曲线点QA = dA G
对于Alice签署消息m,她遵循以下步骤:
- 计算e = Hash(m),其中HASH是加密Hash函数,如SHA-2
- 设z是e的Ln最左边的比特,其中Ln是组次序n的比特长度。
从[1,n]中选择一个密码安全的随机整数k。
计算曲线点(x1,y1)= kG。 - 计算r = X1 mod n。如果r = 0,返回重新生成随机数.
计算s = k-1(z + rdA)mod n。如果s = 0,返回重新生成随机数.
签名是成对(r,s)。
为了验证Alice的签名,他必须有一个她的公钥曲线点QA的副本。Bob可以验证QA是一个有效的曲线点,如下所示:
- 检查QA是否与标识元素O不相等,并且其坐标是否有效
- 检查QA是否位于曲线上
- 检查n QA <> O
之后,Bob遵循以下步骤:
- 验证r和s是[1,n-1]中的整数。否则,签名无效。
- 计算e = HASH(m),其中HASH与签名生成中使用的函数相同。
设z是e的Ln最左边的位。
计算w = s-1mod n。
计算u1 = zw mod n和u2 = rw mod n。
计算曲线点(x1,y1)= u1 G + u2 QA。
如果r = x1 mod n,签名有效,否则无效。
假设Alice想要与Bob建立共享密钥,但唯一可用于他们的信道可能会被第三方窃听。最初,域参数(p,a,b,G,n,h)(即在素数情况下(m,f(x),a,b,G,n,h)或二进制情况)必须达成一致。另外,每一方都必须有一个适用于椭圆曲线密码学的密钥对,它由私钥“d”(区间[1,n-1]中随机选择的整数)和公钥“Q”(其中Q = dG,即将点“G”加在一起d次的结果)。设Alice的密钥对为(dA,QA),Bob的密钥对为(dB,QB)。在执行协议之前,每方都必须知道对方的公钥。
Alice计算(xk,yk)= dAQB。Bob计算(xk,yk)= dBQA。共享秘密是xk(点的x坐标)。大多数基于ECDH的标准化协议通过使用一些基于Hash的密钥导出函数来导出对称密钥。
由双方计算的共享秘密是相等的,因为dAQB = dA dBG = dB dAG = dBQA。
关于Alice最初公开的私人密钥的唯一信息是她的公钥。因此除Alice之外的任何一方都不能确定Alice的私钥,除非该方法能解决椭圆曲线离散对数问题。Bob的私钥也同样安全。除Alice或Bob以外的任何一方都不能计算共享密钥,除非该方能解决椭圆曲线Diffie-Hellman问题。
前面说了那么多,其实关键只有上面这一段。因为数学上dAQB = dBQA,Bob的公钥乘Alice的私钥与相反的一对乘积相等,求解等式两边都指向曲线上的一个交点,因此发起方,随机确定一个因子后,Bob和Alice将得到相同的结果,这个结果根本不需要在网络上传输,双方即已经得到了密钥!Get it?没关系~根本不需要每个人都懂得其中复杂的数学原理,我们只要知道密钥协商的关键是:
- 公钥私钥对
- 私钥必须绝对安全
- 产生密钥的因子是一个随机数,因此每个会话密钥会发生变化
3.6 椭圆曲线随机数生成过程中可能的后门程序
一旦确定公钥和私钥对,能够攻破加密的唯一后门就是随机数的生成了。美国国家标准与技术研究院已经发布了一系列“确定性随机数字发生器”,它推荐为NIST SP 800-90。其中随机数生成器Dual_EC_DRBG受到了国家安全局NSA的特别青睐:Dual_EC_DRBG使用椭圆曲线技术,并包含一组推荐的常量。
令人震惊的是:2007年8月,微软的Dan Shumow和Niels Ferguson表示,常量的构建方式可以成为算法创建一个秘密后门,也就是说NSA可能会掌握随机数建立的规则,私钥将不再安全,对话过程就会被解密并监控(因此NSA的核心技术就在于此,并不是屈打成招,而是完全靠信息战的策略)。
据路透社报道,爱德华斯诺登在2013年发布的文件显示,NSA已经向RSA安全局支付了1000万美元,使其Dual_EC_DRBG成为其加密软件的默认设置,并进一步担忧该算法可能包含NSA的后门程序。
基于这些担忧,2014年,NIST从其关于随机数生成器的指导草案中撤消了Dual_EC_DRBG,建议“尽快将Dual_EC_DRBG目前的用户转换为剩下的三种核准算法之一”。
另外一个著名的案例是:2010年12月,一个自称fail0verflow的组织宣布攻破了索尼用于为PlayStation 3游戏机签名软件的椭圆曲线数字签名算法(ECDSA)私钥。后来查明,由于索尼未能为每个签名产生一个新的随机数,导致被暴力破解成功。
4. 传输层安全性(TLS)
客户端 - 服务器应用程序使用TLS协议以防止窃听和篡改的方式通过网络进行通信。
由于应用程序可以使用或不使用TLS(或SSL)进行通信,因此客户机必须向服务器指示TLS连接的设置。目前区分的方式是使用不同的端口号,例如用于HTTPS使用443端口,以将连接切换到TLS;在使用邮件和新闻协议时,使用995或465端口,发出STARTTLS请求。
一旦客户端和服务器同意使用TLS,他们就通过握手过程协商一个有状态的连接。所述的协议与上面的描述基本相同,主体的通信过程则是使用协商好的密钥进行的对称密钥进行加密。
当客户端连接到启用TLS的服务器请求安全连接并且客户端列出支持的密码套件(密码和Hash函数)时,握手开始。从这个列表中,服务器选择一个它也支持的密码和Hash函数,并通知客户这个决定。服务器通常会以数字证书的形式提供身份证明。证书包含服务器名称,证明证书真实性的可信证书颁发机构(CA)以及服务器的公用加密密钥。客户在继续之前确认证书的有效性。
要生成用于安全连接的会话密钥,客户端要么:
- 用服务器的公共密钥加密一个随机数并将结果发送给服务器(只有服务器应该能够用其私钥解密); 双方然后使用随机数生成一个唯一的会话密钥,在以便会话期间进行后续的数据加密解密状语从句:
- 使用的Diffie-Hellman密钥交换来安全地生成随机唯一的加密和解密会话密钥,该密钥具有前向保密的附加属性:如果服务器的私钥在将来被披露,则它不能用于解密当前会话,该即使被会话拦截第三方并记录
握手结束并开始安全连接,使用会话密钥加密和解密 。直到连接关闭如果上述步骤中的任何一个失败,则TLS握手失败,并且不会创建连接。
TLS和SSL并不适合整合到OSI模型或TCP / IP模型的任何一层中。TLS在一些可靠的传输协议(例如TCP)上运行,“这意味着它位于传输层之上,与底层具体的传输无关,不一定是使用Ethernet,这也就是很多串行同样适用TLS的原因。它为更高层提供加密,这通常是表示层的功能。然而,即使使用TLS的应用程序必须主动控制启动TLS握手和处理交换的身份验证证书,应用程序通常使用TLS就好像它是传输层一样。
5. Bob和Alice实现安全通信了么?
目前有很多行业已经使用这些成熟的技术对数据进行加密,对身份进行安全认证。假设Bob是金融机构,会发放一个U盾(usb dongle)给Alice,实际上是金融机构发放给Alice并被金融机构认可的数字证书,他包含银行的证书公钥和艾丽斯的公钥和私钥。每次使用时,插入ü盾,与金融机构协商每次会话的加密密钥,进入对称加密状态。因此,Bob和Alice完美实现了加密通信。
小结
虽然这篇文章被“输配电世界”标记为“原创”,但作者十分忐忑,因为绝大多数内容都是已有公开的表述,而且对于深奥的数学理论远远没有达到理解。但工业控制里的众多应用,恰恰需要建立在这些公开的信息之上。网络安全说起来很奇妙,乍一看似乎应该是一个特别封闭的系统,看不透的黑盒,但实际上,往往技术越透明才越安全。
#CyberSecurity, #Encryption