Applied Cryptography(5)——加密协议(Cryptographic Protocols)

加密协议(Cryptographic Protocols)

本节将会结合之前学过的对称加密、加密散列函数以及非对称加密来解决问题,其中主要问题便是如何在服务器(Server)与客户(Client)之间进行认证。任何时候我们谈到加密协议,就不得不提及与之相关的威胁模型(Threat Model),威胁模型分析是寻找系统潜在威胁以建立对抗的策略,以建立安全的系统,简单来说就是了解攻击者的能力。

  • 假设攻击者算力有限
  • 加密系统正常工作
  • \(E_k(m)\),攻击者在没有 \(k\) 的情况下无法解密
  • 哈希函数\(H(x)\)
    • 原相抗性:对于所有预设输出,从计算角度应无法找到符合输入哈希的输出
    • 抗碰撞性:无法从计算角度找到任何两个哈希值都相同的独特输入 \(x\),例如\(h(x) = h(x′)\)
  • 攻击者类型
    • passive attacker: only eavesdrop
    • active attacker: controls the network, modify messages, replay messages, attack-in-the-middle

密钥交换协议(Encrypted Key Exchange protocol,EKE)

Steven M. Bellovin and Michael Merritt, 1992

该协议运用之前所学的Diffie-Hellman密钥交换方法,并对产生的信息级联用户id,再进行对称加密
img

\[y_A=g^{x_A} \bmod q \\ y_B=g^{x_B} \bmod q \]

img

上述协议的缺点是需要将password(p)的明文保存在服务器上,并且没有实现用户与服务器之间的身份验证。

为了实现用户与服务器之间的身份验证,我们需要验证双方都持有相同的key。
由服务器随机选择一个数 \(r\) ,用key对其加密得到 \(E_k(r)\),级联发送 \(<E_p(g^{x_B} \bmod q), E_k(r)>\),用户收到后进行解密,为了向服务器证明自己确实接收到了 \(r\),并且为了验证服务器,再随机选择一个数 \(r_A\),利用key加密后获得\(<E_k(r||r_A)>\) 发送给服务器,服务器解密后获得 \(r\)\(r_A\),首先比较 \(r\) 是否一致,确认用户身份,再将 \(r_A\) 加密后的 \(E_k(r_A)\) 发送给用户,用户验证 \(r_A\) 是否一致来确认对方身份。

完整版EKE:
img

安全外壳协议(Secure Shell Protocol,SSH)

SSH协议想要解决的问题也是客户端与服务器的认证问题。该协议也是基于Diffie-Hellman,结合运用对称加密与非对称加密

img

Client利用Diffie-Hellman方法,选择一个大质数 \(p\) 和它的原根 \(g\) 以及一个秘密随机数 \(x_C\),计算 \(y_C = g^{x_C} \bmod p\),并将 \(y_C\) 发送给服务器;

Server收到后,选择一个秘密随机数 \(x_S\),计算 \(y_S = g^{x_S} \bmod p\),密钥 \(k = y_C^{x_S} \bmod p\)。以上与D-H加密算法相同,但是为了避免回放攻击,Client需要验证接收到的消息确实是由该服务器发送的,则需要非对称加密手段验证。假设服务器拥有公钥 \(k_{US}\) 和 私钥 \(k_{RS}\),计算哈希值 \(H = hash(protocol\ params || k_{US} || y_C || y_S || k)\),并将该哈希值利用私钥签名得到\(SIGN_S(H) = <H, E_{k_{RS}}(H)>\)。最后将 \(<k_{US}, y_S, SIGN_S(H)>\) 发送给client

Client收到Server发送来的消息后,首先验证签名,利用服务器公钥\(k_{US}\)解密,判断解密出的哈希值 \(D_{k_{US}}(E_{K_{RS}}(H))\) 是否等于 \(H\),若相等则证明这条消息是由持有服务器私钥的一方所发送的,身份验证成功。此外,为了避免回放攻击(replay attack),所以还要进行第二次验证,由于哈希函数是单向函数,所以Client不能通过接收到的哈希值得到密钥 \(k\),但是Client可以通过计算 \(k = y_S^{x_C} \bmod p\) 得到密钥,并利用哈希函数加密相同的内容,与收到的哈希值进行比对,若在回放攻击中窃听者嗅探并重新发送哈希值,则由于其无法得知密钥,从而避免了该问题。

img

~/.ssh/known_hosts文件内存储了已知的服务器公钥

传输层安全协议(Transport Layer Security,TLS)

传输层安全性协议(英语:Transport Layer Security,缩写:TLS)及其前身安全套接层(英语:Secure Sockets Layer,缩写:SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。网景公司(Netscape)在1994年推出首版网页浏览器-网景导航者时,推出HTTPS协议,以SSL进行加密,这是SSL的起源。IETF将SSL进行标准化,1999年公布TLS 1.0标准文件(RFC 2246)。随后又公布TLS 1.1(RFC 4346,2006年)、TLS 1.2(RFC 5246,2008年)和TLS 1.3(RFC 8446,2018年)。在浏览器、电子邮件、即时通信、VoIP、网络传真等应用程序中,广泛使用这个协议。许多网站,如Google、Facebook、Wikipedia等也以这个协议来创建安全连线,发送资料。目前已成为互联网上保密通信的工业标准。

TLS主要由两部分组成:

  1. TLS握手协议(Handshake Protocol)
    • 服务器与客户之间的双向验证(要求服务器知道用户的公钥)
    • 确认加密协议的一致
    • 建立一个共享的会话密钥用于双方的身份验证
    • TLS can be implemented on top of many other protocols. The most commonly used implementation is on top of Hyper Transfer Text Protocol (HTTP). Combining TLS with HTTP results in Hyper Transfer Text Protocol Secure (HTTPS).
  2. TLS记录协议(Record Protocol)
    • 利用会话密钥确保双方安全通信
    • using symmetric cryptography only, because a session key was established by the end
      of the TLS Handshake Protocol and now using symmetric encryption which is much
      more faster (cheaper) for encrypting all the content of a page.

TLS握手协议(Handshake Protocol)

简化版的TLS:
img

a:C 连接到 S 发送消息 \(m\),C 支持的密码列表 \(c\) 和 C 使用的哈希函数列表 \(h\),因为不同的浏览器实现了不同的密码和哈希函数,供浏览器选择。

b:由于 C 和 S 必须就密码和散列函数达成一致,S 从收到的列表中选择“最强”的密码和哈希函数,并将选择发送回 C。此外,S 还发送一个证书(certificate),它给出了 S 的公钥 \(k_{US}\) ,在某种程度上,C 可以信任。证书包括域(domain)和 S 的公钥 \(k_{US}\),并由证书颁发机构 (Certificate Authority,CA) 签名。

c:接下来 C 验证证书,提取 \(k_{US}\) 并选择一个随机值 \(r\) 并将 \(E_{k_{US}}(r)\) 发送回 S。S 可以使用私钥解密 \(E_{k_{US}}(r)\) 以获得 \(r\),用作共享密钥 k。

现在,C 和 S 都有一个共享密钥 \(k = r\),并且可以使用密钥 \(k\) 使用对称加密在信道上进行通信。 执行此操作的协议是 TLS 记录协议

但是上述简化版的TLS存在两个问题:

  1. 攻击者可以截获消息c,并选择另外一个数\(r^{'}\),用公钥加密后发给 S,使得S获得的 k 与C的 k 是不同的,此时攻击者可以破解 S 发送给 C 的消息,但是没有办法破解 \(E_{k_{US}}(r)\)
  2. 攻击者可以通过修改消息b的内容迫使 S 和 C 使用强度较弱的加密方法

针对问题1:

公钥加密标准 Public Key Cryptographic Standard (PKCS #1)
PKCS #1 定义了RSA的数理基础、公/私钥格式,以及加/解密、签/验章的流程。
The PKCS #1 adds some padding to make \(m\) long enough and unpredictable and avoid an attacker from message guessing.
The new message \(m_0\) is:

\[m_0 = 00 \dots 010||r||00000000||m \]

where \(r\) are some random bits with \(r ≥ 64\) depending on the length of \(m\) it may use more bits.
This prevents the small message space attack since even if the set of possible messages is fairly small an attacker needs to try all possible choices for the random bits (at least 64 of them) in order to test those messges.
更好的方法:
最优非对称加密填充 Optimal Asymmetric Encryption Padding(OAEP)
在密码学中,最优非对称加密填充是一种经常与RSA加密一起使用的填充方案。OAEP 由 Mihir Bellare 和 Phillip Rogaway 发明,随后在 PKCS#1 v2 和 RFC 2437中得到标准化。
OAEP 的想法是将消息与接受随机值的加密哈希函数的输出进行异或,但收件人仍然可以解密消息,因为他们可以获得随机值并异或加密哈希的结果。

我们需要给k添加一些随机性,C选择一个随机数 \(r_C\) 加到消息a中,S选择一个随机数 \(r_S\) 加到b中,此时随机数 \(r\) 被称为 pre-master secret,利用 PKCS #1 填充 \(r\),C发送 \(E_{k_{US}}('client\ version'||r)\) 到 S,此时的 k 不再仅仅是 r,而是结合了添加的随机性因子,被称为master secret:

\[master\ secret = H(r; ’master secret’ ⊕ r_C ⊕ r_S) \]

master secret被划分为三部分,第一部分用作对称加密算法的密钥,第二部分用作CBC的初始向量IV,第三部分用作密钥哈希函数(keyed hash function)

此时攻击者截获C修改内容,则S获取到的密钥发生变化,握手协议不会结束。并且由于 \(r,r_C,r_S\) 都是随机的,所以避免了回放攻击。

针对问题2:

C 通过验证证书(certificate)来确认 S 的身份。确认收到消息的domain确实是 C 想要连接的那台服务器。

TLS记录协议(Record Protocol)

img

In TLS the last cipherblock of the previous message is used as the IV for the first block of the next message.

Conclusion

设计加密协议是很困难的!
本单元仅专注于认证与通信,下一单元将介绍利用加密协议能够做哪些事情。

posted @ 2022-11-21 10:17  S!no  阅读(305)  评论(0编辑  收藏  举报